您正在考虑十进制数,即可以表示为 的数字,n*(10^e)
正e
数或负数。由于与十根手指有关的历史原因,这些数字自然地出现在您的思维过程中。
出于与存在或不存在电信号有关的技术原因,计算机数字以二进制表示。
当您处理较小的整数时,计算机表示与您自己的表示不匹配并不重要,因为您正在考虑数学数字的准确近似,计算机也是如此,因此通过传递性,您和计算机正在考虑同样的事情。
对于非常大或非常小的数字,你会倾向于以十的幂来思考,而计算机肯定会以二的幂来思考。在这些情况下,您可以观察到您的直觉与计算机所做的事情之间的差异,而且您的分类是无稽之谈。二进制浮点数在恰好具有十进制数的紧凑表示的数字附近既不是更密集也不是更不密集。它们简单地用二进制表示n*(2^p)
,p
无论是正面的还是负面的。许多实数只有十进制的近似表示,许多实数只有二进制的近似表示。这些数字不相同(二进制数字可以用十进制表示,但并不总是紧凑的。一些十进制数字根本不能用二进制精确表示,例如 0.1)。
如果你想了解计算机的浮点数,你必须停止思考十进制。1.23900008721....
不是特别的,也不是1.239
。3.2599995
不是特别的,也不是3.26
。你认为它们很特别,因为它们要么是精确的,要么接近于紧凑的十进制数。但这对二进制浮点没有任何影响。
由于您标记了您的问题 C++,因此这里有一些信息可能会让您感到有趣:
如果您使用 格式打印一个双精度数字%.16e
,您会得到一个转换回原始 的十进制数字double
。但它并不总是代表原始的确切值double
。要查看十进制的确切值double
,您必须使用%.53e
. 如果您0.1
在程序中编写,编译器会将其解释为含义1.000000000000000055511151231257827021181583404541015625e-01
,这是一个相对紧凑的二进制数。您的问题谈到 3.2599995 和 2.000001 好像这些是浮点数,但它们不是。如果在程序中编写这些数字,编译器会将它们解释为 3.25999950000000016103740563266910612583160400390625 和 2.00000100000000013977796697872690856456756591796875。因此,您正在寻找的模式很简单:浮点数的十进制表示始终是 17 个有效数字,后跟 53-17=36 个“噪声”数字,正如您所说的那样。噪声数字有时全为零,有效数字也可以以一堆零结尾。