哪种方法更准确?

时间:2014-04-25 05:26:21

标签: java floating-point

假设我们实现以下两种方法来计算实数n的{​​{1}}倍数。

x

假设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,并且intxn的确切数学产品的绝对值不小于x Double.MIN_VALUE(除非两者都是0.0)且绝对值不大于Double.MAX_VALUE。以下是我想知道的:一般来说,它更接近xn的产品的确切值:double或{{{0}}返回的multiply( x, n ) 1 {}由double返回,你怎么知道?

3 个答案:

答案 0 :(得分:2)

据我所知,第一种方法会产生更准确的结果,因为在第二种方法中,在每次加法后,某些数字将被截断和舍入的概率超过单个乘数运算,因为结果将被计算一次,然后数字将被截断。

答案 1 :(得分:1)

通常,对于您执行的每个浮点运算,您的epsilon都会增加。发生这种情况是因为浮点数在内存中具有固定大小,从而限制了它们的精度。每个操作都四舍五入到float可以表示的最接近的值。这种四舍五入会累积一段时间。

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

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

答案 2 :(得分:0)

两者都会返回大致相同的值,但iterativeAdd()返回更多近似值的可能性更大,但差异可以忽略不计。

任何单个浮点运算都会导致一些精度损失,但是很小。

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

一般情况下,我们应该避免使用像iterativeAdd()这样的函数,因为它会占用n浮点运算的大量处理器时间。