0

我只是想知道我们是否可以为使用浮点数逼近实数的形式制定规则。

例如,一个浮点数可以被终止1.xxx777777(因此由无限 7 终止,最后是一个随机数字)?

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

1.准确值。

2.1.23900008721.... 这样的值,所以 where1.239用显示为“噪声”的数字来近似,但在精确值和这个噪声之间有 0

3.值 like 3.2599995,其中3.26通过加上9999..一个最后的数字(like 5)来近似,所以用一个在实数下方的浮点数来近似

4.像 的值2.000001,其中2.0用一个浮点数近似,刚好在实数之上

4

2 回答 2

3

您正在考虑十进制数,即可以表示为 的数字,n*(10^e)e数或负数。由于与十根手指有关的历史原因,这些数字自然地出现在您的思维过程中。

出于与存在或不存在电信号有关的技术原因,计算机数字以二进制表示。

当您处理较小的整数时,计算机表示与您自己的表示不匹配并不重要,因为您正在考虑数学数字的准确近似,计算机也是如此,因此通过传递性,您和计算机正在考虑同样的事情。

对于非常大或非常小的数字,你会倾向于以十的幂来思考,而计算机肯定会以二的幂来思考。在这些情况下,您可以观察到您的直觉与计算机所做的事情之间的差异,而且您的分类是无稽之谈。二进制浮点数在恰好具有十进制数的紧凑表示的数字附近既不是更密集也不是更不密集。它们简单地用二进制表示n*(2^p)p无论是正面的还是负面的。许多实数只有十进制的近似表示,许多实数只有二进制的近似表示。这些数字不相同(二进制数字可以用十进制表示,但并不总是紧凑的。一些十进制数字根本不能用二进制精确表示,例如 0.1)。

如果你想了解计算机的浮点数,你必须停止思考十进制。1.23900008721....不是特别的,也不是1.2393.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 个“噪声”数字,正如您所说的那样。噪声数字有时全为零,有效数字也可以以一堆零结尾。

于 2012-12-05T20:53:46.743 回答
0

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

  1. 小数点后翻转 1 位是 0.5 或 1/2
  2. 01 位是 0.25 或 1/4
  3. 等等

这意味着当以机器可以处理的内容表示时,如果浮点数不是 2 的精确幂,则它总是近似接近但不精确。

机器可以非常准确地表示有理数(如果不是小数点以下的 2 的幂,当然不能精确地表示),但无理数总是会出错。c++就此而言,您的问题与to没有太大关系computer architecture

于 2012-12-05T20:34:03.583 回答