谷歌计算器故障,可能浮动与双重是一个可能的原因?

时间:2008-08-25 23:09:30

标签: c math google-search

我这样做只是为了踢(所以,不完全是一个问题,我可以看到已经发生了下调)但是,代替谷歌新发现的inabilitymath correctly(检查它!根据谷歌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

看起来谷歌正在使用简单的32位浮点精度(此处出现错误),如果在上面的代码中切换float为double,则可以解决问题!这可能是吗?

/ MP

7 个答案:

答案 0 :(得分:4)

有关这种愚蠢的更多信息,请参阅这篇关于Windows计算器的好文章。

When you change the insides, nobody notices

  

Calc的内脏 - 算术   发动机 - 完全被扔掉了   并从头开始重写。该   标准IEEE浮点库   被替换为   任意精度算术   图书馆。这是在人们之后完成的   一直在写关于如何的哈哈文章   Calc不能做十进制算术   正确地说,例如计算   10.21 - 10.2导致0.0100000000000016。

答案 1 :(得分:2)

  

看起来谷歌正在使用简单的32位浮点精度(此处出现错误),如果在上面的代码中切换float为double,则可以解决问题!这可能是吗?

不,你只是推迟了这个问题。双打仍然表现出相同的问题,只是数字较大。

答案 2 :(得分:2)

在C#中,尝试(double.maxvalue ==(double.maxvalue - 100)),你会得到真的......

但那应该是什么:

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

考虑到这一点,你有64位代表一个大于2 ^ 64(double.maxvalue)的数字,所以预计会出现不准确的情况。

答案 3 :(得分:1)

@ebel

  考虑到这一点,你有64位代表一个大于2 ^ 64(double.maxvalue)的数字,所以预计会出现不准确的情况。

2 ^ 64不是double的最大值。 2 ^ 64是double(或任何其他64位类型)可以容纳的唯一值的数量。 Double.MaxValue等于1.79769313486232e308。

浮点数的不准确性并非来自代表大于Double.MaxValue的值(这是不可能的,不包括Double.PositiveInfinity)。它来自这样一个事实,即所需的值范围太大而无法适应数据类型。因此,我们放弃精确度以换取更大的有效范围。在本质上,我们正在丢弃有效数字以换取更大的指数范围。

@DrPizza

  

不均匀; IEEE编码对相同的值使用多个编码。具体地,NaN由全位-1的指数表示,然后是尾数的任何非零值。因此,单身人士有252个NaN,单身人士有223个NaN。

真。我没有说明重复编码。实际上,对于单打,实际上存在2个 52 -1个NaN,而对于单个单元,存在2个 23 -1个NaN。 :P

答案 4 :(得分:0)

  

2 ^ 64不是double的最大值。 2 ^ 64是double(或任何其他64位类型)可以容纳的唯一值的数量。 Double.MaxValue等于1.79769313486232e308。

不均匀; IEEE编码对相同的值使用多个编码。具体而言,NaN由全位-1的指数表示,然后任意尾数的非零值。因此,对于双打,存在2个 52 NaN,对于单个,存在2个 23 NaN。

答案 5 :(得分:0)

  

真。我没有说明重复编码。不过,实际上有单打252-1个NaN和单打223-1个NaN。 :P

Doh,忘了减去无穷大。

答案 6 :(得分:0)

我学到的这个问题的粗略估计版本是32位浮点数给你5位精度,64位浮点数给你15位精度。这当然会根据浮点数的编码方式而有所不同,但这是一个非常好的起点。