我这样做只是为了好玩(所以,不完全是一个问题,我可以看到降级已经发生了),但是,代替谷歌新发现的inability来做math correctly (检查它!根据google 500,000,000,000,002 - 500,000,000,000,001 = 0),我想我应该尝试下面的C语言来运行一些理论。
int main()
{
char* a = "399999999999999";
char* b = "399999999999998";
float da = atof(a);
float db = atof(b);
printf("%s - %s = %f\n", a, b, da-db);
a = "500000000000002";
b = "500000000000001";
da = atof(a);
db = atof(b);
printf("%s - %s = %f\n", a, b, da-db);
}当你运行这个程序时,你会得到以下信息
399999999999999 - 399999999999998 = 0.000000
500000000000002 - 500000000000001 = 0.000000这看起来像是Google使用了简单的32位浮点精度(这里的错误),如果你在上面的代码中将浮点数转换为双精度,你就解决了这个问题!会是这样吗?
/mp
发布于 2008-08-26 08:19:57
在C#中,尝试(double.maxvalue == (double.maxvalue - 100)),你会得到true ...
但这就是它应该是的样子:
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
想想看,您有64位表示大于2^64 (double.maxvalue)的数字,因此预计会出现不准确的情况。
发布于 2008-08-25 23:19:45
有关这种愚蠢的更多信息,请参阅这篇关于Windows计算器的优秀文章。
When you change the insides, nobody notices
的内部计算-算术引擎-完全被抛弃,并从头开始重写。标准的IEEE浮点库被替换为任意精度的算术库。这是在人们一直在写哈哈文章说Calc不能正确地做十进制算术之后完成的,例如计算10.21 - 10.2会得到0.0100000000000016。
发布于 2008-08-26 08:08:31
看起来像是谷歌使用了简单的32位浮点精度(这里的错误),如果你在上面的代码中将浮点数转换为双精度,你就解决了这个问题!会是这样吗?
不,你只是把问题推迟了。替身仍然表现出同样的问题,只是数字更大。
https://stackoverflow.com/questions/27095
复制相似问题