floating-point - 如果浮点数有时可能不准确,程序员为什么还要使用它们呢?
问题描述
如果浮点数有时可能不准确,为什么它们存在?什么情况下有人想使用浮点数?
解决方案
(首先,请注意浮点数是精确的。它是近似实数算术的浮点算术。这种区别对于设计好的浮点软件和编写关于它的证明很重要。)
人们使用浮点运算是因为它对于处理不同大小的数字很有用。考虑使用浮点来设计和建造建筑物或其他结构。当设计者指定10米长的梁或电缆时,实际交付的电缆不会是10米长。如果您测量它并将结果转换为 32 位float
1,则转换可能会引入误差,误差小于 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 位有效数。
推荐阅读
- css - 删除最后一个子元素的填充会导致不同大小的元素
- excel - 使用拆分功能将字符串转换为小数
- python - 使用列和值透视数据框
- sublimetext3 - 在 Sublime Text 3 中粘贴一些文本时,如何用直引号 (') 替换智能引号 (')?
- php - 我想将一个字符串分成两部分,数字之前和数字之后
- stripe-payments - 使用 Retrieve Payment Intent 或 Retrieve Checkout Session 验证 Stripe Payment?
- c++ - 如何将指针转换为我在 C++ 中输入的类型?
- makefile - 我对makefile的一些东西感到困惑
- swift - SwiftUI textView onChange 无法正常工作
- sql - 自动将数据从 CSV 文件发送到 SQL Server?