This question already has answers here:
Closed 5 years ago.
Floating point inaccuracy examples
(7个答案)
C++ floating point precision [duplicate]
(5个答案)
我在174页找到了这个代码片段,这是一本关于C-Al Kelley,Ira Pohl的书。
}
就像书上说的那样,它变成了一个无限循环。它没有提到确切的原因,只是说这与机器的精度有关。
我修改了代码以检查
x=9.9分
如果加上以下几行,就永远不会变成事实,也就是说x达到了9.9
我得到了输出中的以下几行
如果x正好达到值9.9,为什么它仍然是一个无限循环?
我的机器上的输出:
这本书很可能试图教你不要使用==或!=比较浮点变量的运算符。同样的原因,不要使用float作为循环迭代器。
(7个答案)
C++ floating point precision [duplicate]
(5个答案)
我在174页找到了这个代码片段,这是一本关于C-Al Kelley,Ira Pohl的书。
int main()
{
int cnt=0; double sum=0.0,x;
for( x=0.0 ;x!= 9.9 ;x+=0.1)
{
sum=sum +x;
printf("cnt = %5d\n",cnt++);
}
return 0;
}
就像书上说的那样,它变成了一个无限循环。它没有提到确切的原因,只是说这与机器的精度有关。
我修改了代码以检查
x=9.9分
如果加上以下几行,就永远不会变成事实,也就是说x达到了9.9
diff=x-9.9;
printf("cnt =10%d \a x =%10.10lf dif=%10.10lf \n",++cnt,x,diff);
我得到了输出中的以下几行
cnt =1098 x =9.7000000000 dif=-0.2000000000
cnt =1099 x =9.8000000000 dif=-0.1000000000
cnt =10100 x =9.9000000000 dif=-0.0000000000
cnt =10101 x =10.0000000000 dif=0.1000000000
cnt =10102 x =10.1000000000 dif=0.2000000000
如果x正好达到值9.9,为什么它仍然是一个无限循环?
最佳答案
你只是把数字打印得太差,以至于没有注意到它不准确。试试这样的:
#include <stdio.h>
int main()
{
double d = 9.9;
if(d == 9.9)
{
printf("Equal!");
}
else
{
printf("Not equal! %.20f", d);
}
}
我的机器上的输出:
Not equal! 9.90000000000000035527
这本书很可能试图教你不要使用==或!=比较浮点变量的运算符。同样的原因,不要使用float作为循环迭代器。
关于c - 机器的相等性测试和准确性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23647412/
10-16 11:10