相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

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

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

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

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
查看次数

浮点数的精确总和

我知道一个类似的问题,但我想请求人们对我的算法的意见,以尽可能准确地将浮点数与实际成本相加.

这是我的第一个解决方案:

put all numbers into a min-absolute-heap. // EDIT as told by comments below
pop the 2 smallest ones.
add them.
put the result back into the heap.
continue until there is only 1 number in the heap.
Run Code Online (Sandbox Code Playgroud)

这个将采用O(n*logn)而不是正常的O(n).这真的值得吗?

第二个解决方案来自我正在研究的数据的特征.这是一个巨大的数列表,具有相似的数量级.

a[size]; // contains numbers, start at index 0
for(step = 1; step < size; step<<=1)
    for(i = step-1; i+step<size; i+=2*step)
        a[i+step] += a[i];
    if(i < size-1)
        a[size-1] += a[i];
Run Code Online (Sandbox Code Playgroud)

基本思想是以"二叉树"方式进行求和.

注意:它是伪C代码.step<<=1表示乘以步数2.这一个将取O(n).我觉得可能有更好的方法.你能推荐/批评吗?

algorithm floating-point sum floating-accuracy

17
推荐指数
2
解决办法
3135
查看次数

通过Timer设置JDialog不透明度

我使用下面的代码淡入一个JDialog具有javax.swing.Timer:

    float i = 0.0F;
    final Timer timer = new Timer(50, null);
    timer.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (i == 0.8F){
                timer.stop();
            }
            i = i + 0.1F;
            setOpacity(i);
        }
    });
    timer.start();
Run Code Online (Sandbox Code Playgroud)

Dialog是很好的褪色,与预期的效果,但在最后一个IllegalArgumentException出现说:

 The value of opacity should be in the range [0.0f .. 1.0f]
Run Code Online (Sandbox Code Playgroud)

但问题是我不是很远,i = 0.8F所以它怎么可能是一个非法的论点?
行发生异常:setOpacity(i);

有什么建议?解决方案?

java swing jdialog fadein javax.swing.timer

5
推荐指数
1
解决办法
1563
查看次数

如何修复java中的双精度问题

可能重复:
Java浮动和双重,如何避免0.0 + 0.1 + ... + 0.1 == 0.9000001?

如何在java android中克服双乘法的精度问题?请注意我将字符串值转换为double值.

例如:当我乘以两个双倍值时:

double d1 = Double.valueOf("0.3").doubleValue() * Double.valueOf("3").doubleValue();
System.out.println("Result of multiplication : "+d1);
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:0.8999999999999999

我得到的一些结果是.

0.6*3 = 1.7999999999999998;
0.2*0.2 = 0.04000000000000001;
等等

我希望得到以下结果,而不是上述结果.

0.3*3 = 0.9;
0.6*3 = 1.8;
0.2*0.2 = 0.04;

请记住,我不是要将它四舍五入到最接近的整数.

java double android double-precision

2
推荐指数
1
解决办法
8995
查看次数

Java双精度和麻烦

我想知道为什么我会收到这个错误.(这是Eclipse调试的显示日志)

var
     (double) 2.8
tot.getIva()
     (java.lang.Double) 0.17
var+tot.get()
     (double) 2.9699999999999998
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我没有简单地得到2.97!

java floating-point double

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

如何在Java中以0.1f的增量在0.1f和1.0f之间进行迭代?

可能重复:
Java浮动和双重,如何避免0.0 + 0.1 + ... + 0.1 == 0.9000001?

我在Java中遇到以下问题 - 我需要以0.1f为增量在0.1f和1.0f之间迭代,所以我希望我的输出看起来像这样:

    0.1
    0.2
    0.3
    0.4
    ...
    0.9
Run Code Online (Sandbox Code Playgroud)

相反,当我这样做时:

for(float i = 0.1f; i < 1f; i += 0.1f)
    System.out.println(i);
Run Code Online (Sandbox Code Playgroud)

我明白了

0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
Run Code Online (Sandbox Code Playgroud)

我想它与计算机表示分数的方式有关,但我想知道为什么会这样,如果我有什么办法可以阻止它.谢谢.

java

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

1
推荐指数
2
解决办法
3009
查看次数