是否有可能对浮点数的近似的不同形式进行分类

时间:2012-12-05 20:30:45

标签: c++ double floating

我只是想知道我们是否可以使用浮点数来形成实数近似的形式。

对于intance是浮点数可以由1.xxx777777终止(因此通过实例终止无限7并最终在结尾处随机数字)?

我相信只有这种形式的浮点数:

1。确切的价值。

2。1.23900008721 ....所以其中1.239近似为数字,显示为“噪音”,但精确值与此噪音之间为0

3。类似3.2599995的值,其中3.26通过添加9999..和最后一位数字(如5)近似,所以近似在实数下面有一个浮动数字

4。类似2.000001的值,其中2.0近似于实数上方的浮点数

2 个答案:

答案 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)

浮点由位表示。这意味着:

  1. 在小数点为0.5或1/2
  2. 后翻转1位
  3. 01位是0.25或1/4
  4. 这意味着浮点数总是接近但不精确,如果它不是2的精确幂,则表示机器可以处理的内容。

    Rational numbers可以非常精确地由机器表示(当然,如果不是小数点以下的2的幂,则不正确),但irrational numbers将始终带有错误。就此而言,您的问题与c++computer architecture没有多大关系。