求助,关于c语言中float和double型变量赋值相同的问题

jhunhaohao 2017-02-22 02:27:03
如题,我在c语言中分别定义一个float型变量a和一个double型变量b,然后分别赋值为1.2
#include<stdio.h>
int main()
{
float a = 1.2; double b = 1.2;
printf("%.lf", a - b);
return 0;
}

目的是想验证a-b的值是否为0.
通过改变printf语句输出时的位数要求,我完成了5次实验,发现精度不同的情况下a和b的值是不同的
如图,当输出要求达到60位时,出现了后面有8个0的情况,也就是说一共有52个位上有数字
那么,我就自然的想到实数存储时的尾数问题,double型变量存储时的尾数就是52位,然后我想问,这是巧合还是有一定的关系
跪求解答!!!
谢谢各位前辈!!!
...全文
690 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rookiekk 2017-02-22
  • 打赏
  • 举报
回复
就是double的尾数是52位吧 前边是0说明减去的float的尾数位数。
jhunhaohao 2017-02-22
  • 打赏
  • 举报
回复
引用 8 楼 赵4老师的回复:
看不懂,结合MSDN或百度中搜相关不懂的函数说明,并单步执行看或加printf();getchar();语句输出每一步中间结果使劲看。
好,谢谢老师,我去看一下
赵4老师 2017-02-22
  • 打赏
  • 举报
回复
看不懂,结合MSDN或百度中搜相关不懂的函数说明,并单步执行看或加printf();getchar();语句输出每一步中间结果使劲看。
赵4老师 2017-02-22
  • 打赏
  • 举报
回复
fefe82 2017-02-22
  • 打赏
  • 举报
回复
先自己把 1.2 转写为二进制小数看看
jhunhaohao 2017-02-22
  • 打赏
  • 举报
回复
引用 2 楼 DelphiGuy 的回复:
23、52位是指二进制,十进制精度哪有那么高。
对啊,所以我的困惑就是: 23和52都是二进制情况下的精度,10进制下float 6~7位,double 15~16位,但为什么在我实验过程中(上图),会出现直到52位仍然有数字的情况,而且到60位时,又恰好出现了8个0,这是巧合还是错误
jhunhaohao 2017-02-22
  • 打赏
  • 举报
回复
引用 1 楼 xian_wwq 的回复:
这个和浮点数的精度有关 float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) double: 1bit(符号位) 11bits(指数位) 52bits(尾数位) float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字; double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
但是就拿double来说,既然它的精度只有15~16位,那么为什么会出现上面最多可以在52位上有数字的情况呢?
  • 打赏
  • 举报
回复
23、52位是指二进制,十进制精度哪有那么高。
xian_wwq 2017-02-22
  • 打赏
  • 举报
回复
这个和浮点数的精度有关 float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) double: 1bit(符号位) 11bits(指数位) 52bits(尾数位) float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字; double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧