假设我们实现以下两种方法来计算实数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
,并且int
和x
和n
的确切数学产品的绝对值不小于x
Double.MIN_VALUE
(除非两者都是0.0
)且绝对值不大于Double.MAX_VALUE
。以下是我想知道的:一般来说,它更接近x
和n
的产品的确切值:double
或{{{0}}返回的multiply( x, n )
1 {}由double
返回,你怎么知道?
答案 0 :(得分:2)
据我所知,第一种方法会产生更准确的结果,因为在第二种方法中,在每次加法后,某些数字将被截断和舍入的概率超过单个乘数运算,因为结果将被计算一次,然后数字将被截断。
答案 1 :(得分:1)
通常,对于您执行的每个浮点运算,您的epsilon都会增加。发生这种情况是因为浮点数在内存中具有固定大小,从而限制了它们的精度。每个操作都四舍五入到float可以表示的最接近的值。这种四舍五入会累积一段时间。
这两个数字都会让你非常接近答案,但是如果你在大量不同的数字上运行这两种方法,你会发现平均iterativeAdd()
与实际值的距离更远。< / p>
此外,multiply()
在任何计算机上都会明显加快,因此使用iterativeAdd()
并没有任何好处。
答案 2 :(得分:0)
两者都会返回大致相同的值,但iterativeAdd()
返回更多近似值的可能性更大,但差异可以忽略不计。
任何单个浮点运算都会导致一些精度损失,但是很小。
在multiply()
中,您只使用了一次浮点运算,但在iterativeAdd()
中您使用了n次。
一般情况下,我们应该避免使用像iterativeAdd()
这样的函数,因为它会占用n
浮点运算的大量处理器时间。