double和float的区别到底是怎么样的
我在做第八课的第一个计算温度的题有一次小甲鱼受邀到华盛顿参加演讲,一查天气预报有 45 度高温,于是穿着短袖沙滩裤就出发了……结果到了那里才发现冻成狗!后来才知道人家老外习惯使用的温度单位是华氏度(F),不是咱的摄氏度(C)……(以上内容纯属YY)=e$"_^~
问题:写一个华氏度到摄氏度的转换程序,用户输入华氏度,程序计算并输出对应的摄氏度。
1摄氏度 =(1华氏度 – 32)* 5 / 9
我用的数据类型是double答案是用的float
搞不懂两者到底区别在哪。查了百度也有点蒙蔽,能不能通俗易懂的解答与喜爱 现在没啥太大区别了 默认推荐double了
早先 电脑硬件比较紧张单精度据说能节省一些内存,现在吗谁还差那点内存 wp231957 发表于 2019-5-20 15:02
现在没啥太大区别了 默认推荐double了
早先 电脑硬件比较紧张单精度据说能节省一些内存,现在吗谁还 ...
我也是习惯用double但是 做题去计算那个温度的时候用float和double 的数据类型 编译出来的计算结果不同 本帖最后由 jackz007 于 2019-5-20 15:49 编辑
1、数字编码:
float:总共 32 位,其中,1 个符号位, 8个指数位,23 个尾数位
double:总共 64 位,其中,1 个符号位,11个指数位,52 个尾数位
2、表达范围:
float:-3.40E+38~+3.40E+38
double: -1.79E+308 ~+1.79E+308
3、数值精度:
浮点数在内存中是按科学计数法来存储的,其精度取决于数字编码中的尾数长度,float 有 23 个尾数位,2 ^ 23 = 8388608,一共 7 位,可见,float 的数值精度是 6 位,double 有 52 个尾数位,2 ^ 52 = 4503599627370496,一共有 16 位,可见,double 的数值精度是 15 位。
显然,double 的表达能力更加强大,但是,与 float 相比,使用 double 的劣势也很明显,一是占用内存资源多,而是运行效率低,所以,使用时,要合理权衡利弊。 1031967096 发表于 2019-5-20 15:29
我也是习惯用double但是 做题去计算那个温度的时候用float和double 的数据类型 编译出来的计算结果不 ...
不可能,那是你代码有问题 wp231957 发表于 2019-5-20 15:33
不可能,那是你代码有问题
#include<stdio.h>
int main()
{
float a , b ;
printf("请输入华氏度:");
scanf("%f",&a);
b = (a - 32) * 5 / 9;
printf("转化为摄氏度是:%.2f\n",b);
return 0;
}
结果
请输入华氏度:45
转化为摄氏度是:7.22
#include<stdio.h>
int main()
{
double a , b ;
printf("请输入华氏度:");
scanf("%f",&a);
b = (a - 32) * 5 / 9;
printf("转化为摄氏度是:%.2f\n",b);
return 0;
}
结果
请输入华氏度:45
转化为摄氏度是:-17.78
大佬请过目!{:5_108:} scanf("%f",&a);
printf("转化为摄氏度是:%.2f\n",b);
第二段代码把这两个%f修改为%lf wp231957 发表于 2019-5-20 15:37
scanf("%f",&a);
printf("转化为摄氏度是:%.2f\n",b);
哇,真滴强!谢大佬!学到了。意思是double对应的输出符是%lffloat对应的是%f吗 jackz007 发表于 2019-5-20 15:33
显然,double 的表达能力更加强大,但是,与 float 相比,使用 double 的劣势也很明显,一是占用内存 ...
感谢感谢 1031967096 发表于 2019-5-20 15:40
哇,真滴强!谢大佬!学到了。意思是double对应的输出符是%lffloat对应的是%f吗
是得 wp231957 发表于 2019-5-20 15:42
是得
感谢大佬!{:5_106:} 本帖最后由 Croper 于 2019-5-20 16:28 编辑
wp231957 发表于 2019-5-20 15:37
scanf("%f",&a);
printf("转化为摄氏度是:%.2f\n",b);
嗯。。准确地说,printf是不该用"%lf"的,这个并不在标准之内,虽然现在很多编译器都支持。但理论上来说,这是错误的写法。
printf只有%f没有%lf。
至于其原因,是因为C语言里使用可变参数时,为了保证形参的长度统一,会自动发生类型的转换,也就是printf中的float和double都会被转换为double,同时使用“%f”作为标记符。也就是正确的答案应该是scanf中的“%f”改为“%lf"而printf中的不变。
https://blog.csdn.net/shenzhou111/article/details/7826444 Croper 发表于 2019-5-20 16:25
嗯。。准确地说,printf是不该用"%lf"的,这个并不在标准之内,虽然现在很多编译器都支持。但理论上来 ...
收到,学习了 Croper 发表于 2019-5-20 16:25
嗯。。准确地说,printf是不该用"%lf"的,这个并不在标准之内,虽然现在很多编译器都支持。但理论上来 ...
大佬 谢谢大佬 膜拜 感激谢谢
页:
[1]