我这样做只是为了好玩(所以,不完全是一个问题,我可以看到降级已经发生了)但是,代替谷歌新发现的无法正确地做数学 (检查它!根据谷歌 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