我只是想知道我们是否可以使用浮点数来形成实数近似的形式。
对于intance是浮点数可以由1.xxx777777
终止(因此通过实例终止无限7并最终在结尾处随机数字)?
我相信只有这种形式的浮点数:
1。确切的价值。
2。值1.23900008721
....所以其中1.239
近似为数字,显示为“噪音”,但精确值与此噪音之间为0
3。类似3.2599995
的值,其中3.26
通过添加9999..
和最后一位数字(如5
)近似,所以近似在实数下面有一个浮动数字
4。类似2.000001
的值,其中2.0
近似于实数上方的浮点数
答案 0 :(得分:3)
您正在考虑十进制数字,即可以表示为n*(10^e)
的数字,其中e
为正数或负数。这些数字在你的思维过程中自然出现,因为历史原因与十指有关。
计算机编号以二进制表示,原因是技术原因与电信号存在或不存在有关。
当您处理小整数时,计算机表示与您自己的数字不匹配并不重要,因为您正在考虑数学数字的精确近似,计算机也是如此,因此通过传递性,你和电脑正在考虑同样的事情。
无论是非常大还是非常小的数字,你都倾向于用10的幂来思考,而计算机肯定会考虑2的幂。在这些情况下,您可以观察到您的直觉与计算机的作用之间的差异,而且您的分类也是无意义的。二进制浮点数在紧邻的数字附近既不是更密集也不是更密集,恰好具有十进制数字的紧凑表示。它们仅以二进制n*(2^p)
表示,p
为正数或负数。许多实数只有十进制的近似表示,而许多实数只有二进制的近似表示。这些数字不一样(二进制数可以用十进制表示,但并不总是紧凑。有些十进制数字根本不能用二进制表示,例如0.1)。
如果你想了解计算机的浮点数,你必须停止思考十进制。 1.23900008721....
并不特殊,1.239
也不是。{1}}。 3.2599995
并不特殊,3.26
也不是。{1}}。您认为它们是特殊的,因为它们正好或接近紧凑的十进制数。但这对二进制浮点没有任何影响。
以下是一些可能让您感到愉快的信息,因为您标记了您的问题C ++:
如果您使用格式%.16e
打印双精度数字,则会得到一个十进制数字,可以转换回原始double
。但它并不总是代表原始double
的确切值。要查看十进制double
的确切值,您必须使用%.53e
。如果在程序中编写0.1
,编译器会将其解释为1.000000000000000055511151231257827021181583404541015625e-01
,这是二进制中相对紧凑的数字。你的问题是3.2599995和2.000001,好像这些是浮点数,但它们不是。如果在程序中写入这些数字,编译器会将它们解释为3.25999950000000016103740563266910612583160400390625
和
2.00000100000000013977796697872690856456756591796875。因此,您正在寻找的模式很简单:浮点数的十进制表示始终为17位有效数字,后跟53-17 = 36“噪声”数字,因为您调用它们。噪声数字有时全为零,有效数字也可以以一串零结束。
答案 1 :(得分:0)
浮点由位表示。这意味着:
这意味着浮点数总是接近但不精确,如果它不是2的精确幂,则表示机器可以处理的内容。
Rational numbers可以非常精确地由机器表示(当然,如果不是小数点以下的2的幂,则不正确),但irrational numbers将始终带有错误。就此而言,您的问题与c++
和computer architecture
没有多大关系。