我正在准备考试,我解决了这个问题
添加0.1+0.2+...+1.00 ..or..。1.00+0.99+0.98+...+0.1
在Java中,为了获得更高的精度,应该按照哪个顺序来添加数字?
发布于 2015-01-18 19:10:20
任何COBOL程序员都可以立即回答这个问题。
问题的关键是,如果你先加大的数字,当你加入小的数字时,你就失去了精确性。先加小数。
发布于 2015-01-19 07:34:23
有一个结果表明,如果按递增顺序添加一个正数序列,则可以得到一个更好的最坏情况下的误差界。这个结果并不意味着,对于给定的正数序列,通过按递增顺序添加数字,可以得到较小的误差。
例如:
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
s的精确和(可以通过将f
和g
声明为double
(但将ff
作为float
)计算)是0x1.93ffffff8p+5
,表示按递减顺序求和的数字在这里获胜。
发布于 2015-01-18 18:52:54
由于这是一个算术级数,所以它的和可以按以下方式计算
Sn = n * (a1 + an) / 2
Sn ... sum
n ... number of elements
a1 ... first element
an ... last element
当你去掉大部分数字时,这似乎是最好的解决方案。
https://stackoverflow.com/questions/28017226
复制相似问题