为什么有些数字在存储为浮点数时会失去准确性?
例如,十进制数9.2可以精确地表示为两个十进制整数(92/10)的比率,两者都可以用二进制(0b1011100/0b1010)精确表示.但是,存储为浮点数的相同比率永远不会完全等于9.2:
32-bit "single precision" float: 9.19999980926513671875
64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875
Run Code Online (Sandbox Code Playgroud)
这样一个看似简单的数字如何在64位内存中表达"太大" ?
运行以下代码行时:
int i,a;
for(i=0;i<=4;i++)
{
a=pow(10,i);
printf("%d\t",a);
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶地看到输出,它出来了 1 10 99 1000 9999而不是1 10 100 1000 10000.
可能的原因是什么?
注意
如果您认为它是浮点不准确,在上面的for循环中i = 2,存储在变量中的值a是99.
但如果你写的话
a=pow(10,2);
Run Code Online (Sandbox Code Playgroud)
现在a的价值出现了100.怎么可能?
#include <stdio.h>
int main (void)
{
int x = 10^2;
long a = 4000465006540123; //(16 places)
long b = 4000465006540123 % x;
printf("%li\n", b);
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码时(它正确编译),代码打印出“3”。难道它不应该打印出“23”,因为 x 是 100,而不是 10?