我只是想知道我们是否可以为使用 float 的实数逼近形式制定规则。
例如,一个 float 可以由 1.xxx777777
终止(因此实例由无限 7 终止,最后是一个随机数字)?
我相信只有这种形式的 float :
1.精确值。
2. 值如 1.23900008721
.... 所以 1.239
近似于显示为“噪声”但之间为 0 的数字确切的值(value)和这个噪音
3. 值,例如 3.2599995
,其中 3.26
是通过添加 9999..
和最后一位数来近似计算的(如 5
),所以用一个略低于实数的 float 来近似
4. 值,如 2.000001
,其中 2.0
近似为一个略高于实数的 float
最佳答案
您正在考虑十进制数,即可以表示为 n*(10^e)
的数字,e
可以是正数也可以是负数。由于与十根手指有关的历史原因,这些数字自然会出现在您的思维过程中。
计算机数字以二进制表示,出于与电信号存在或不存在有关的技术原因。
当您处理较小的整数时,计算机表示与您自己的不匹配并不重要,因为您正在考虑数学数字的精确近似值,计算机也是如此,因此通过传递性,你和计算机在思考同一件事。
对于非常大或非常小的数字,您倾向于以 10 的次方来思考,而计算机肯定会以 2 的次方来思考。在这些情况下,您可以观察到您的直觉与计算机所做的不同,而且您的分类是无稽之谈。二进制 float 在碰巧具有十进制数紧凑表示的数字附近既不密集也不疏密。它们只是用二进制表示,n*(2^p)
,p
可以是正数也可以是负数。许多实数只有十进制的近似表示,而许多实数只有二进制的近似表示。这些数不相同(二进制数可以用十进制表示,但并不总是紧凑的。有些十进制数根本不能用二进制精确表示,例如 0.1)。
如果您想了解计算机的 float ,您必须停止思考小数。 1.23900008721....
并不特殊,1.239
也不是。 3.2599995
并不特殊,3.26
也不是。您认为它们很特别,因为它们正好或接近于紧凑的十进制数。但这对二进制 float 没有任何影响。
这里有一些可能会让您觉得有趣的信息,因为您将问题标记为 C++:
如果您打印格式为 %.16e
的 double ,您将得到一个转换回原始 double
的十进制数。但它并不总是代表原始 double
的准确值。要以十进制形式查看 double
的准确值,您必须使用 %.53e
。如果您在程序中编写 0.1
,编译器会将其解释为 1.000000000000000055511151231257827021181583404541015625e-01
,这是一个相对紧凑的二进制数。你的问题谈到 3.2599995 和 2.000001 就好像它们是 float 一样,但它们不是。如果您在程序中写入这些数字,编译器会将它们解释为 3.25999950000000016103740563266910612583160400390625
和
2.00000100000000013977796697872690856456756591796875。因此,您正在寻找的模式很简单: float 的十进制表示始终是 17 位有效数字,后跟 53-17 = 36 位您所说的“噪声”数字。噪声数字有时全为零,有效数字也可能以一串零结尾。
关于c++ - 是否可以对 float 逼近的不同形式进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731846/