内存,无理性和浮点数
Memory and irrationality and floating numbers
有些数字不能存储在"内存位"中,因为它们的二进制表示会使它们无穷无尽。
在二进制11.111011101110…这不是确切的数字。我现在想不起来具体是什么了。
但是我们可以把它想象成以10为基数的无理数,在小数点后无限。
一些有理数在转换为以2为基数时遇到这个问题。那么我们如何……
1)代表他们?
2)用计算机程序计算它们?
3)对它们进行操作?
编辑:消除困惑,说声谢谢:
好的,我在上面的帖子->中说过,把它看作是一个无理数,或者是一个在小数点后越来越长的数字。请读"like"这个词。
现在我有一个数字0.2,这个简单的数字不能用二进制形式表示。所以如何在上面执行操作
其他问题仍未解决。
我只想说一下我对这里人的信任:
对于stackoverflow的极客来说,"库"或近似存储并不是一个答案,因为他们是某些应用程序,重要的是要有数字。
您应该查看浮点数标准,并阅读"每个程序员都应该知道的关于浮点数的一切"
在处理浮点数时,有一些关于浮点数四舍五入及其精度的具体问题,就像你说的,我们不能在当前的机器中无限地表示它们,所以这些事情已经解决了,以创造最好的精度,但是在处理它们时必须记住某些注意事项。
所有整数都精确表示。你说的是分数和无理数,对吧?
无理数不能像十进制那样用二进制表示。所以它们只能用特定的精度来表示。小数的问题是,不是每个十进制数都可以精确地表示为二进制。例如0.9。这是因为浮点数的性质。
解决这个问题最简单的方法是使用定点数——它是基本的整数,用一些固定的数字来表示小数部分。这种方法通常用于财务软件(其中每一美元用100美分表示)这种方法有一个缺点-它只能表示有限的数字精度。
另一种解决方案类似于十进制周期数。把它们表示成两个数被除数和被除数。因此十进制周期0.(3)可以精确地表示为1和3。
它们不是无理数,它们是周期数。1/3是十进制的周期数。1/10是二进制中的一个周期数。两者都是有理的(与基数无关)。事实上,一个数是有理数还是非有理数与底数没有任何关系。
所有有理数都可以表示为分子和分母为整数的分数。是的,包括所有的周期函数。有些系统内部使用分数以提供更高的准确性。我相信这就是perl将会使用的,而不是浮点数。
可以在内部得到非常大的数字,并且在处理无理数时仍然会有精度损失。例如,您只能近似pi,可能使用
314159265358979/100000000000000
或
3141592653589793/1000000000000000
没有一般的方法。例如,数字:
sqrt(2) * sqrt(2)
可以用符号或数字方法找到。
关于有理数:可以将它们表示为一对(大)整数,并对其进行算术运算。
在二进制中没有1的有限十进制表示的数字是重复而不是无理数。你如何处理它们取决于你的需求是什么。如果你是在处理金钱,你通常使用二进制编码的十进制或缩放表示法,这保证了加减法在小数点后的某个数位内是精确的。在其他领域,您可以使用符号表示,以便在需要时延迟执行实际计算。如果你认为sqrt(2)
是一个有限的,精确的表示只要你不实际计算它
如果你想表示有理数,你可以用同样的方式在纸上做,存储两个数字,分子和分母(当然你最好找到一个库来为你做这件事,因为有很多细微的差别要正确)。
没有有限底数2表示的有理数是分母上没有2的幂的有理数,2是唯一的底数因子。同样地,对于其他的进制,你需要考虑进制的质因数,所以对于10进制,2的幂和5的幂的乘积有有限的表示。
无理数是不同的野兽,我认为与你的问题无关,这里的一般技术是将它们近似到一些有限精度,例如M_PI,或者象征性地表示它们,要么永远不计算它们,要么在有限精度结束时计算它们。
我们没有。我们用它们的近似值。有一些算法可以以所需的任何精度计算它们。
顺便说一下,不是每个无限长的数都是无理数。例如,数字1/3以10为基数是无限长的:0.333333333…以2为基数:0.0101010101…
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- txt 文件中浮点数的最大和最小值
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 将浮点数转换为无符号字符数组并打印出来
- 如何将时间字符串 (M:SS) 转换为浮点数
- 如何将浮点数(*)[6]转换为浮点**类型?
- C++将浮点数乘以分数
- 如何将浮点数转换为uint8_t?
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- 在数学上将浮点数四舍五入到 N 位小数
- Cython通过浮点数的最快方式,用于高频控制回路
- 内存,无理性和浮点数