是否可以对浮点数近似的不同形式进行分类
is it possible to categorize the different forms of the approximation of floating point numbers
我只是想知道我们是否可以为使用浮点数的实数近似形式制定规则。
对于意图,浮点数是否可以由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 位为 0.5 或 1/2
- 01 位为 0.25 或 1/4
- 等。
这意味着浮点总是近似接近的,但如果它不是 2 的精确幂,则不精确,当用机器可以处理的内容表示时。
有理数可以非常准确地用机器表示(当然不精确,如果不是小数点以下的 2 的幂),但无理数总是会带有错误。就此而言,您的问题与其说与c++
有关,不如
computer architecture
有关。- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- txt 文件中浮点数的最大和最小值
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 将浮点数转换为无符号字符数组并打印出来
- 如何将时间字符串 (M:SS) 转换为浮点数
- 如何将浮点数(*)[6]转换为浮点**类型?
- C++将浮点数乘以分数
- 如何将浮点数转换为uint8_t?
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- 在数学上将浮点数四舍五入到 N 位小数
- Cython通过浮点数的最快方式,用于高频控制回路
- 是否可以对浮点数近似的不同形式进行分类