对浮点数和双精度执行运算(如乘法,除法,加法和减法)是否保持其精确度?
例如,如果我将1000个浮点数乘以(或除以,相加,相减),我还能保持7位数的精度吗?
我在这个网站上已经阅读了精确度(http://floating-point-gui.de/formats/fp/),但我想仔细检查。
答案 0 :(得分:4)
There's precision and there's accuracy。 float
的精度始终相同。但计算的准确性取决于各种特定于实现的细节。
例如,如果每个计算引入了一个半LSB的错误,那么在1000次计算之后,结果可能会被500个LSB关闭。因此,尽管答案精确到7位数,但它只能精确到4位数。
答案 1 :(得分: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
。
突然间,我最不重要的数字是我最重要的数字。还有其他方法可以放大舍入误差和避免它的技术。
始终在处理非整数类型时要注意舍入错误。 Some examples of rounding error failures