内存,无理性和浮点数

Memory and irrationality and floating numbers

本文关键字:浮点数 无理性 内存      更新时间:2023-10-16

有些数字不能存储在"内存位"中,因为它们的二进制表示会使它们无穷无尽。

在二进制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…