为了账号安全,请及时绑定邮箱和手机立即绑定

为什么浮点数不准确?

为什么浮点数不准确?

扬帆大鱼 2019-05-22 13:47:02
为什么浮点数不准确?为什么有些数字在存储为浮点数时会失去准确性?例如,十进制数9.2可以精确地表示为两个十进制整数(92/10)的比率,两者都可以用二进制(0b1011100/0b1010)精确表示。但是,存储为浮点数的相同比率永远不会完全等于9.2:32-bit "single precision" float: 9.1999998092651367187564-bit "double precision" float: 9.199999999999999289457264239899814128875732421875这样一个看似简单的数字如何在64位内存中表达“太大” ?
查看完整描述

4 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

这不是一个完整的答案(mhlester已经涵盖了很多我不会复制的好地方),但我想强调一个数字的表示取决于你工作的基础。

考虑分数2/3

在良好的基础10中,我们通常会将其写成类似的东西

  • 0.666 ...

  • 0.666

  • 0.667

当我们查看这些表示时,我们倾向于将它们中的每一个与分数2/3相关联,即使只有第一个表示在数学上等于分数。第二和第三表示/近似的误差大约为0.001,实际上比9.2和9.1999999999999993之间的误差差。事实上,第二个表示甚至没有正确舍入!然而,我们没有将0.666作为数字2/3的近似值的问题,所以我们不应该在大多数程序中如何逼近9.2(是的,在某些程序中它很重要。)

数字基数

所以这里的数字基础是重要的。如果我们试图在基数3中代表2/3,那么

(2/3)10 = 0.2 3

换句话说,通过切换基数,我们可以得到相同数字的精确有限表示!外卖是即使你可以将任何数字转换为任何基数,所有有理数在某些基础上都有精确的有限表示,但在其他基数中没有

为了把这一点推到家里,让我们看看1/2。尽管这个完全简单的数字在基数10和2中具有精确表示,但它可能会让您感到惊讶,它需要在基数3中重复表示。

(1/2)10 = 0.5 10 = 0.1 2 = 0.1111 ... 3

为什么浮点数不准确?

因为它们经常是近似于在基数2中无法有限地表示的有理数(数字重复),并且通常它们近似于在任何基数中可能无法在有限多个数字中表示的实数(可能是无理数)数。


查看完整回答
反对 回复 2019-05-22
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

虽然所有其他答案都很好,但仍有一件事缺失:

这是不可能的代表无理数(如π, ,sqrt(2)log(3)等)精确!

这就是他们被称为非理性的原因。世界上没有多少比特存储就足以容纳其中一个。只有符号算术才能保持其精度。

虽然如果你将数学需求限制在有理数,但只有精度问题变得易于管理。您需要存储一对(可能非常大)整数ab保存分数所代表的数字a/b。所有算术都必须在分数上完成,就像在高中数学中一样(例如a/b * c/d = ac/bd)。

当然,你仍然会遇到同样的麻烦时pisqrtlogsin,等都有涉及。

TL; DR

对于硬件加速算术,只能表示有限数量的有理数。每个不可表示的数字都是近似的。无论系统如何,都不能表示某些数字(即无理数)。


查看完整回答
反对 回复 2019-05-22
?
慕的地10843

TA贡献1785条经验 获得超8个赞

有无数的实数(很多你不能枚举它们),并且有无限多的有理数(有可能枚举它们)。

浮点表示是有限的(就像计算机中的任何东西一样),因此不可避免地会有很多很多数字无法表示。特别是,64位只允许您区分18,446,744,073,709,551,616个不同的值(与无穷大相比无差别)。按照标准惯例,9.2不是其中之一。对于某些整数m和e,可能具有m.2 ^ e形式的那些。


您可能会想出一个不同的计算系统,例如10,其中9.2将具有精确的表示。但其他数字,比如1/3,仍然无法代表。


另请注意,双精度浮点数非常准确。它们可以表示任意数字,范围很广,最多可包含15个精确数字。对于日常生活计算,4或5位数就足够了。你永远不会真正需要那些15,除非你想要计算你一生中的每一毫秒。


查看完整回答
反对 回复 2019-05-22
  • 4 回答
  • 0 关注
  • 1508 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信