浮点数乘法的精度问题

4

在浮点数和双精度浮点数上执行乘法、除法、加法和减法等运算是否会保持它们的精度?

例如,如果我将1000个浮点数相乘(或相除、相加、相减),我是否仍然保持7位数字的精度?

我在这个网站上读到了这篇文章,指出精度是被保持的(http://floating-point-gui.de/formats/fp/),但我想再次确认。


请查看此链接,它将有助于提高您的内容质量。 - Willie Cheng
使用乘法/除法,平均损失为sqrt(N),约为30位。 - chux - Reinstate Monica
2个回答

6

有精度和准确度之分。一个float的精度总是相同的。但你的计算的准确度取决于各种实现特定的细节。

例如,如果每个计算引入了半个LSB的误差,那么经过1000次计算后,结果可能会偏离500个LSB。因此,尽管答案精确到7位数字,但只有4位数字是准确的。


谢谢!这正是我需要的! - M. Pope
4
“最坏情况下,每次计算都会引入半个LSB的误差,因此进行1000次计算后,您的结果可能偏差500个LSB。”这是一个非常具有误导性的陈述,因为它没有考虑到“1 LSB”在每个计算中所代表的量并不相同。例如,对于1e20 + 14 - 1e20这个计算,尽管只涉及两个操作的舍入误差,但其通常仅准确到0位数字。 - user2357112
1
@user2357112 好的,我已经重新措辞了那段话。大数之间的微小差异确实是一个问题,但它与我试图阐明的累积小误差的问题略有不同。 - user3386109
2
最坏情况下的错误是一回事,错误概率密度是另一回事。对于乘法的情况,请参见http://stackoverflow.com/questions/12047410/the-number-of-correct-decimal-digits-in-a-product-of-doubles-with-a-large-number/12052359#12052359。 - aka.nice

1
答案取决于您所说的“保持精度”的意思。单个浮点数始终具有大约7位数字的“精度”(由于二进制存储而不完全是7位数字)。
某些计算可能会引入舍入误差,这可能会使最低有效位不正确,但这些错误可能会累积(如用户3386109在其回答中解释的那样),或者它们可能会被放大。放大的一个例子是,如果我正在计算形式为(f(x+h)-f(x))/h的微积分极限,当h趋近于零时。如果f(x+0.0000001)应该是3.1234567,但我得到了3.1234566,并且f(x)给出了正确的3.1234568。现在,公式应该(3.1234567-3.1234568)/0.0000001,即-1,但我得到了(3.1234566-3.1234568)/0.0000001,即-2
突然间,我的最低有效数字变成了最高有效数字。还有其他放大舍入误差的方法和避免它的技巧。

在处理非整数类型时,始终要注意舍入误差。一些舍入误差失败的示例


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