乘以浮点数的精度
Precision of Multiplying Floats
对浮点数和双精度数执行运算(如乘法、除法、加法和减法)是否保持其精度?
例如,如果我将 1000 个浮点数相乘(或相除、相加、相减),我还能保持 7 位精度吗?
我在这个网站上看到这里保持了精度 (http://floating-point-gui.de/formats/fp/),但我想仔细检查一下。
There's precision and there's accuracy。 float
的精度始终相同。但是计算的准确性取决于各种特定于实现的细节。
例如,如果每次计算都引入半个 LSB 的误差,那么经过 1000 次计算后,结果可能会偏离 500 个 LSB。因此,虽然答案会精确到 7 位数字,但它只会精确到 4 位数字。
答案取决于 "maintaining precision" 的意思。单个浮点数始终具有相同的 "precision" 大约 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
对浮点数和双精度数执行运算(如乘法、除法、加法和减法)是否保持其精度?
例如,如果我将 1000 个浮点数相乘(或相除、相加、相减),我还能保持 7 位精度吗?
我在这个网站上看到这里保持了精度 (http://floating-point-gui.de/formats/fp/),但我想仔细检查一下。
There's precision and there's accuracy。 float
的精度始终相同。但是计算的准确性取决于各种特定于实现的细节。
例如,如果每次计算都引入半个 LSB 的误差,那么经过 1000 次计算后,结果可能会偏离 500 个 LSB。因此,虽然答案会精确到 7 位数字,但它只会精确到 4 位数字。
答案取决于 "maintaining precision" 的意思。单个浮点数始终具有相同的 "precision" 大约 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