编程论坛
注册
登录
编程论坛
→
C语言论坛
想问一个问题,关于浮点数精度的,出现了一个奇怪的情况
t_dcy
发布于 2019-12-16 11:18, 1750 次点击
两个无法精确存储的小数,按人的认知来讲,例如0.4+0.6运算完成为一个可以精确表示的数字,
而对于计算机来讲,始终以二进制运算,那运算结果一个也不精确,可是出现了下面的情况,想问一下为什么?
另外数据从内存中拿出来到寄存器中进行运算时,是始终保持二进制的吧?
只有本站会员才能查看附件,请
登录
6 回复
#2
rjsp
2019-12-16 11:28
首先,最重要的是:
不要贴图,请直接贴代码
。
你给个图片,别人还得浪费时间打字成代码才可以调试。
浮点数是精确的
,它只是不对应“实数”而已。数字计算机就没本事能搞出任何不精确的东西,连个“随机数”都是“伪”的
浮点数 0.4f 对应着实数 0.4000000059604644775390625
浮点数 0.6f 对应着实数 0.60000002384185791015625
浮点数 0.4f+0.6f 对应着实数 1.0000000298023223876953125
当你使用 printf 时 四舍六入五成双(VC用的是四舍五入)成你指定的精度。
#3
t_dcy
2019-12-16 12:34
回复 楼主 t_dcy
抱歉抱歉,忘了复制代码了,实在不好意思
我看懂了您的意思,但是我自己试验还是有点问题,我用的是Dev C++,不知道是不是编译器的问题,我想像中的结果应该和您的一样,但是我的结果实在这样的:
#include<stdio.h>
int main()
{
float a=0.4,b=0.6;
printf("a=%15.10f\nb=%15.10f\n",a,b);
printf("a+b=%13.30f",a+b);
return 0;
}
只有本站会员才能查看附件,请
登录
#4
t_dcy
2019-12-16 12:34
回复 楼主 t_dcy
抱歉抱歉,忘了复制代码了,实在不好意思
我看懂了您的意思,但是我自己试验还是有点问题,我用的是Dev C++,不知道是不是编译器的问题,我想像中的结果应该和您的一样,但是我的结果实在这样的:
#include<stdio.h>
int main()
{
float a=0.4,b=0.6;
printf("a=%15.10f\nb=%15.10f\n",a,b);
printf("a+b=%13.30f",a+b);
return 0;
}
只有本站会员才能查看附件,请
登录
#5
rjsp
2019-12-16 12:48
回复 3楼 t_dcy
这应该是编译器进行了代码优化吧,看你a、b根本没用上,就直接优化成
printf("a=%15.10f\nb=%15.10f\n",
0.4f
,
0.6f
);
printf("a+b=%13.30f",
1.0f
);
#6
t_dcy
2019-12-16 13:06
回复 5楼 rjsp
感谢,感谢
#7
鱼儿小仙
2019-12-17 17:00
说到底是计算机二级制浮点转十进制时出现的精度误差问题,计算机的浮点数的0.0不是真的0,而是有一定的精度的,超过这个精度后,就可能有非0出现,所以会出现上面的那种情况
1