【问题标题】:Precision of Multiplying Floats乘法浮点数的精度
【发布时间】:2016-05-07 03:15:31
【问题描述】:

对浮点数和双精度数执行运算(如乘法、除法、加法和减法)是否保持其精度?

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

我在此网站上读到保持精度 (http://floating-point-gui.de/formats/fp/),但我想仔细检查。

【问题讨论】:

  • 请查看URL 这将有助于提高您的内容质量
  • 使用乘法/除法的平均损失为 sqrt(N) 或大约 30 位。

标签: floating-point double precision


【解决方案1】:

There's precision and there's accuracyfloat 的精度始终相同。但是计算的准确性取决于各种特定于实现的细节。

例如,如果每次计算都会引入半个 LSB 的误差,那么在 1000 次计算之后,结果可能会相差 500 个 LSB。因此,虽然答案会精确到 7 位,但它只能精确到 4 位。

【讨论】:

  • 谢谢!这就是我需要的!
  • "在最坏的情况下,每次计算都会引入半个 LSB 的误差,因此在 1000 次计算之后,您的结果可能会相差 500 个 LSB。" - 考虑到诸如“1 LSB”在每次计算中的数量不同等因素,这是一个相当具有误导性的陈述。例如,1e20 + 14 - 1e20 通常精确到 0 位,尽管只涉及两次运算的舍入误差。
  • @user2357112 很公平,我已经改写了那段。大数的小差异问题确实是一个问题,但它与我试图阐明的累积小错误的问题略有不同。
  • 最坏情况错误是一回事,错误概率密度是另一回事。对于乘法的情况,请参阅stackoverflow.com/questions/12047410/…
【解决方案2】:

答案取决于您所说的“保持精度”是什么意思。单个浮点始终具有大约 7 位的相同“精度”(由于二进制存储,它不完全是 7 位)。

某些计算可能会引入舍入误差,这可能会使最低有效位不正确,但这些误差可能会累加(如 user3386109 在他们的答案中解释)或者它们可能会被放大。放大的一个例子是,如果我正在计算 (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

突然间,我的最低有效数字是我的最高有效数字。还有其他方法可以放大舍入误差和避免舍入误差的技术。

始终在处理非整数类型时要注意舍入错误。 Some examples of rounding error failures

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2011-09-22
    • 2016-06-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多