我试图在for循环中总结一些数字,但它没有像我预期的那样去
float sum = 0;
int i;
printf("0.1+0.1=%f\n", 0.1 + 0.1);
for (i = 0; i<1000000; i++)
{
sum = sum + 0.1;
}
printf("the sum need to be 100000 \n");
printf("the real sum is:\n %f\n", sum);
system("PAUSE");
此程序打印:
0.1 + 0.1 = 0.200000
总和需要为100000
真正的总和是:
100958.343750
按任意键继续。 。
你可以解释这个奇怪的结果吗?答案 0 :(得分:0)
浮点数的国际标准没有一些十进制数的精确表示。
http://en.wikipedia.org/wiki/IEEE_754
这是由于它们存储在内存中的方式,以及尾数和指数的存储方式。
https://en.wikipedia.org/wiki/Floating_point
这也是为什么你永远不应该比较两个浮点数的原因,即使它们看起来相同&#34;相同的&#34;。
我还记得我第一次看到一个比较两个浮动数字的简单代码没有工作的时候有多么惊讶:)仅此一项就会开启一个专门的讨论范围。无论如何,这是非常值得阅读的:
答案 1 :(得分:0)
浮动数字作为x*2^y
存储在内存中,其中x在0和1之间,具有一定的精度,y是整数,因此它们准确地不代表大多数数字,它们代表“足够接近”的数字。 / p>
多次执行此添加时,错误更加明显。
您可以使用double
类型来提高准确性。