哪种方法更准确?

3
假设我们实现以下两种方法来计算实数 x 的第 n 倍。
public static double multiply( double x, int n )
{
    return x * n;
}

public static double iterativeAdd( double x, int n )
{
    double a = 0.0;

    for( int b = 0; b < n; b++ )
    {
        a += x;
    }

    return a;
}

假设n是一个合法的int,并且xnx精确的数学乘积的绝对值不小于Double.MIN_VALUE(除非两者都是0.0),且不大于Double.MAX_VALUE的绝对值。这里我想知道:通常情况下,xn的乘积的准确值更接近于multiply(x,n)返回的double还是iterativeAdd(x,n)返回的double,你如何知道?
3个回答

2
根据我的了解,第一种方法会产生更准确的结果,因为在第二种方法中,每次加法后,某些数字被截断和四舍五入的概率比单个乘法操作更高,因为结果只计算一次,然后数字就会被截断。

1

通常情况下,每执行一次浮点运算,epsilon 就会增加。这是因为浮点数在内存中有固定的大小,限制了它们的精度。每个操作都会被舍入到最接近浮点数可以表示的值。这种舍入会随着时间的推移而累积。

两种方法都可以让你非常接近答案,但如果你在大量不同的数字上运行这两种方法,你会发现平均来说 iterativeAdd() 距离实际值更远。

此外,在任何计算机上,multiply() 都会明显更快,因此永远没有使用 iterativeAdd() 的好处。


0

两者返回的值大致相同,但是iterativeAdd()有更大的可能性返回不太准确的值,但差异微不足道。

任何单个浮点运算都会导致一些精度损失,无论多小。

multiply()中,您仅使用一次浮点运算,但在iterativeAdd()中,您使用n次。

通常情况下,我们应该避免使用任何类似iterativeAdd()的函数,因为它将占用大量处理器时间进行n次浮点运算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接