我正在读考试,我解决了这个问题
添加0.1 + 0.2 + ... + 1.00 ..或.. 1.00 + 0.99 + 0.98 + ... + 0.1
以哪种顺序添加数字以获得更高的Java准确度?
答案 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
的确切总和,可以通过将f
和g
声明为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)
比线性求和所有数字更好,你应该研究一种分而治之的方法(分别将数组的一半加起来)。
非常相似