为什么有些数字在存储为浮点数时会失去准确性?
例如,十进制数9.2
可以精确地表示为两个十进制整数(92/10
)的比率,这两个整数都可以精确地表示为二进制(0b1011100/0b1010
)。但是,存储为浮点数的相同比率永远不会完全等于9.2
32-bit "single precision" float: 9.19999980926513671875
64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875
这样一个看似简单的数字怎么会“太大”而无法在64位内存的中表达呢?
发布于 2014-02-26 03:13:31
虽然所有其他答案都是好的,但仍然缺少一件事:
表示无理数是不可能的(例如,sqrt(2)
**,** log(3)
**, π等)准确地说!**
这实际上就是它们被称为非理性的原因。世界上任何数量的比特存储都不足以容纳它们中的一个。只有符号算术才能保持它们的精度。
但是,如果您将您的数学需求限制为有理数,那么精度问题就变得可控了。您需要存储一对(可能非常大的)整数a
和b
,以保存分数a/b
表示的数字。你所有的算术运算都必须像高中数学一样做分数运算(例如a/b * c/d = ac/bd
)。
但当然,当涉及到pi
、sqrt
、log
、sin
等时,你仍然会遇到同样的麻烦。
TL;DR
对于硬件加速算法,只能表示有限数量的有理数。每个不可表示的数字都是近似的。有些数字(即无理数)永远不能表示,无论系统是什么。
发布于 2019-04-20 21:43:23
有无限多的实数(如此之多以至于你不能枚举它们),也有无限多的有理数(可以枚举它们)。
浮点表示是有限的(就像计算机中的任何东西一样),因此不可避免地会有许多数字无法表示。特别是,64位只允许您区分18,446,744,073,709,551,616个不同的值(与无穷大相比,这算不了什么)。对于标准约定,9.2不在其中。对于某些整数m和e,可以是m.2^e的形式。
您可能会想出一个不同的计数系统,例如,以10为基数,其中9.2将具有精确的表示。但其他数字,比如1/3,仍然不可能表示出来。
还要注意,双精度浮点数是非常精确的。它们可以用多达15位的精确数字来表示非常宽范围内的任何数字。对于日常生活计算,4或5位数就足够了。你永远不会真的需要这15个,除非你想计算你生命中的每一毫秒。
https://stackoverflow.com/questions/21895756
复制相似问题