首页 > 解决方案 > 如果浮点数有时可能不准确,程序员为什么还要使用它们呢?

问题描述

如果浮点数有时可能不准确,为什么它们存在?什么情况下有人想使用浮点数?

标签: floating-point

解决方案


(首先,请注意浮点数是精确的。它是近似实数算术的浮点算术。这种区别对于设计好的浮点软件和编写关于它的证明很重要。)

人们使用浮点运算是因为它对于处理不同大小的数字很有用。考虑使用浮点来设计和建造建筑物或其他结构。当设计者指定10米长的梁或电缆时,实际交付的电缆不会是10米长。如果您测量它并将结果转换为 32 位float1,则转换可能会引入误差,误差小于 1 微米。你对电缆的测量会有更多的误差。所以浮点误差很小,在这个简单的测量中并不重要。

当完成许多计算时,这些舍入误差不仅会累积,而且会以令人惊讶的方式组合起来。如果float还不够,我们可以使用double,其中 10 米左右的测量的初始误差将低于 2 飞米(10 -15米)。

因此,浮点对于正常的物理用途具有足够的精度:测量和设计对象、处理音频或无线电信号、评估物理或化学的假设等等。当浮点使用得当时,浮点算术中的表示误差和舍入误差根本无关紧要。它们太小而无法注意到;它们对正在完成的工作没有明显的影响。

当新手习惯于大多数整数运算的僵化并且对浮点的行为感到惊讶时,就会出现使用浮点的问题。尽管错误可能是 9•10 15的一部分,但如果这意味着结果是 6.99999999999999911182158029987476766109466552734375 而不是转换为 的数字中的 7 int,那么他们会得到错误的结果并且不明白他们的程序是如何出错的。大多数情况下,这个错误出现在学生和 Stack Overflow 问题作者之间,并且在实践中不是问题,当学习了浮点算术基础的人使用浮点代码时。

问题也出现了,因为如上所述,错误可以以令人惊讶的方式组合。例如,矩阵运算可能是“不稳定的”,这意味着它们往往会放大错误。因此,尽管浮点格式可能具有足够的精度,但由于数据和操作的数学特性,结果可能会产生很大的误差(与实数算术相比)。

尽管如此,浮点对于一些使用整数运算会成为负担的工作非常有用。当数字大小不同时,很难编写处理它们的整数算术。缩放要么必须提前设计(这限制了程序可以使用的数据),要么必须由程序管理,这本质上是对浮点的再发明。

脚注

1 IEEE-754 基本 32 位二进制浮点,它有一个符号、一个 8 位指数和一个 24 位有效数。

2 IEEE-754 基本 64 位二进制浮点,它有一个符号、一个 11 位指数和一个 53 位有效数。


推荐阅读