java浮点精度(0.1 + 0.2 + ... + 1.00 ..或.. 1.00 + 0.99 + 0.98 + ... + 0.1)

时间:2015-01-19 02:41:47

标签: java floating-point floating-accuracy

我正在读考试,我解决了这个问题

添加0.1 + 0.2 + ... + 1.00 ..或.. 1.00 + 0.99 + 0.98 + ... + 0.1

以哪种顺序添加数字以获得更高的Java准确度?

4 个答案:

答案 0 :(得分:5)

任何COBOL程序员都可以立即回答这个问题。

问题的关键在于,如果首先添加大数字,则在添加小数字时会丢失精度。首先添加小号。

答案 1 :(得分:2)

有一个结果表明,如果按递增顺序添加一系列正数,则可以获得更好的最坏情况误差限制。这个结果并不意味着,对于给定的正数序列,通过按递增顺序添加数字,可以得到更小的错误。

案例:

int main() {
  float f = 0, g = 1;
  for (int i = 1; i <= 99; i++) {
    char buf[42];
    float ff;
    sprintf(buf, "0.%02i", i);
    sscanf(buf, "%f", &ff);
    f += ff;
    sprintf(buf, "0.%02i", 100-i);
    sscanf(buf, "%f", &ff);
    g += ff;
  }
  f += 1;
  printf("%a %a\n", f, g);
}

打印

0x1.940002p+5 0x1.93fffep+5

有问题的100个float的确切总和,可以通过将fg声明为double来计算(但将ff保留为float),0x1.93ffffff8p+5,表示将减少顺序中的数字相加在此处获胜。

答案 2 :(得分:1)

由于这是一个算术系列,其总和可以按如下方式计算

Sn = n * (a1 + an) / 2

Sn ... sum
n  ... number of elements
a1 ... first element
an ... last element

当您消除大部分数字时,这似乎是最佳解决方案。

答案 3 :(得分:1)

比线性求和所有数字更好,你应该研究一种分而治之的方法(分别将数组的一半加起来)。

这与Precise sum of floating point numbers

非常相似