首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java浮点精度( 0.1+0.2+...+1.00 ..or.1.00+0.99+0.98+...+0.1 )

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

Stack Overflow用户
提问于 2015-01-19 02:41:46
回答 4查看 1.1K关注 0票数 2

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

添加0.1+0.2+...+1.00 ..or..。1.00+0.99+0.98+...+0.1

在Java中,为了获得更高的精度,应该按照哪个顺序来添加数字?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-19 03:10:20

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

问题的关键是,如果你先加大的数字,当你加入小的数字时,你就失去了精确性。先加小数。

票数 5
EN

Stack Overflow用户

发布于 2015-01-19 15:34:23

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

例如:

代码语言:javascript
复制
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);
}

版画

代码语言:javascript
复制
0x1.940002p+5 0x1.93fffep+5

所讨论的100个floats的精确和(可以通过将fg声明为double (但将ff作为float)计算)是0x1.93ffffff8p+5,表示按递减顺序求和的数字在这里获胜。

票数 2
EN

Stack Overflow用户

发布于 2015-01-19 02:52:54

由于这是一个算术级数,所以它的和可以按以下方式计算

代码语言:javascript
复制
Sn = n * (a1 + an) / 2

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

当你去掉大部分数字时,这似乎是最好的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28017226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档