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

is it possible to categorize the different forms of the approximation of floating point numbers

本文关键字:分类 浮点数 是否      更新时间:2023-10-16

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

对于意图,浮点数是否可以由1.xxx777777终止(因此通过实例终止无限 7 并最终在末尾终止一个随机数字)?

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

1.精确值。

2.1.23900008721这样的价值....因此,其中1.239近似为显示为"噪声"的数字,但在确切值和此噪声之间为 0

3.3.2599995这样的值,其中3.26是通过添加9999..和最后一个数字(如5)来近似的,因此近似于实数下方的浮点数

4.2.000001这样的值,其中2.0近似于实数的浮点数

您正在考虑十进制数,即可以表示为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 个"噪声"数字。噪声数字有时都是零,有效数字也可以以一堆零结尾。

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

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

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

有理数可以非常准确地用机器表示(当然不精确,如果不是小数点以下的 2 的幂),但无理数总是会带有错误。就此而言,您的问题与其说与c++有关,不如

说与computer architecture有关。