相关疑难解决方法(0)

应该添加浮点数以获得最精确的结果?

这是我在最近的采访中被问到的一个问题,我想知道(我实际上并不记得数值分析的理论,所以请帮助我:)

如果我们有一些累积浮点数的函数:

std::accumulate(v.begin(), v.end(), 0.0);
Run Code Online (Sandbox Code Playgroud)

vstd::vector<float>例如,是一个.

  • 在累积它们之前对这些数字进行排序会更好吗?

  • 哪个订单会给出最准确的答案?

我怀疑按升序排序数字实际上会减少数值误差,但不幸的是我无法证明这一点.

PS我确实意识到这可能与现实世界的编程无关,只是好奇.

c++ floating-point precision

105
推荐指数
4
解决办法
1万
查看次数

使用双精度时,为什么不(x /(y*z))与(x/y/z)相同?

这部分是学术性的,就我的目的而言,我只需将它四舍五入到小数点后两位; 但是我很想知道结果会产生两个稍微不同的结果.

这是我写的测试,以缩小到最简单的实现:

@Test
public void shouldEqual() {
  double expected = 450.00d / (7d * 60);  // 1.0714285714285714
  double actual = 450.00d / 7d / 60;      // 1.0714285714285716

  assertThat(actual).isEqualTo(expected);
}
Run Code Online (Sandbox Code Playgroud)

但它失败了这个输出:

org.junit.ComparisonFailure: 
Expected :1.0714285714285714
Actual   :1.0714285714285716
Run Code Online (Sandbox Code Playgroud)

任何人都可以详细解释引擎盖下发生的事情导致1.000000000000000的价值X不同吗?

我在答案中寻找的一些要点是:精度丢失在哪里?首选哪种方法,为什么?哪个是正确的?(在纯数学中,两者都不对.也许两者都错了?)这些算术运算有更好的解决方案或方法吗?

java double rounding operator-precedence double-precision

22
推荐指数
2
解决办法
1705
查看次数

我可以确定性地对任意排列的浮点数的向量求和吗?

假设我有一个(可能很大)的浮点数向量,这些向量是由一些黑盒过程产生的。是否可以计算这些数字的按位可重现的总和?

如果黑盒过程总是以相同的顺序生成数字,那么按位可重现的求和很容易:只需从左到右求和即可。

但是,如果数字以随机顺序生成,也许是因为它们是从异步进程返回和收集的,那么就更难了:我必须对它们进行数字排序。

但是,如果有更多的数字,可能分布在不同的机器上,因此移动它们是不可取的怎么办?

还有一种方法可以确定地对它们求和吗?

algorithm math floating-point deterministic

6
推荐指数
2
解决办法
176
查看次数

为什么这个表达式会导致浮点错误?

所以浮点运算是不精确的,但这并没有完全解释这里发生了什么:

[46] pry(main)> a=0.05
=> 0.05
[47] pry(main)> a=a*26.0/65
=> 0.02
Run Code Online (Sandbox Code Playgroud)

所以我们在这里得到了我们的期望,我们得到了正确的答案,世界不断变化.但是我们后来重写这个功能,我们这样做,而我们交换行a=a*26.0/65a*=26.0/65是不是很好,我们输入一个字符少!让我们看看这对我们有何影响?

[48] pry(main)> a=0.05
=> 0.05
[49] pry(main)> a*=26.0/65
=> 0.020000000000000004
[50] pry(main)> 26.0/65
=> 0.4
Run Code Online (Sandbox Code Playgroud)

它表明a*=b与写作不同a=a*b.它似乎不是一个正常的浮点舍入误差,因为这些数字都不应该被舍入为浮点数(尾数应该足够长,每个26.0,26.0/65,65.0)

我确信引擎盖下有一些微妙的内容,想知道发生了什么?

ruby floating-point

3
推荐指数
1
解决办法
312
查看次数