计算机中的无理数表示法

3

我们可以编写一个简单的有理数类,使用两个整数A/B表示,其中B != 0。

如果我们想要表示一个无理数类(存储和计算),我脑海中首先想到的是使用浮点数,也就是使用IEEE 754标准(二进制小数)。这是因为无理数必须被近似表示。

除了使用二进制小数(无论它们是否保留内存空间)之外,还有其他方法来编写无理数类吗?

我研究了jsbeuno在Python中使用的解决方案:任何编程语言中的无理数表示?

他仍然使用内置的浮点数进行存储。

这不是作业。

谢谢你的时间。


您可以使用2的幂次方作为B来表示任何IEEE浮点数。 - Mark Ransom
但是这不已经是754了吗(即使我们因为疯狂的原因将A存储为整数)?因为小数部分将被转换为2的负次幂? - CppLearner
一旦你在内存中表示了它们,你打算用这些数字做什么?选择正确的解决方案几乎完全取决于你对这个问题的回答。 - Sergey Kalinichenko
3个回答

0

通过基数参数,无理数比有理数多得多。(而IEEE754浮点数的数量是有限的,可能小于2^64)。

您可以使用除分数以外的其他方式表示数字(例如对数)。


但在那些无理数中,只有可数无限是可计算的(听起来像是自证),所以它不会比有理数更糟糕。 - aka.nice

0

jsbeuno将数字存储为基数和进制,并在与其他无理数进行计算时使用它们;他仅在输出时使用浮点表示。

如果您想变得更高级,可以像上面描述的那样将基数和进制定义为有理数(具有两个整数),或者使它们本身成为无理数。

但要使某物彻底有用,最终您将不得不复制一个符号数学包。


0

您可以始终使用符号数学,其中项目按其原样存储,计算被推迟,直到它们可以以某个阈值以上的精度执行。

例如,假设您对非无理数(如2)执行了两个操作,一个是取平方根,然后再平方。在有限的精度下,您可能会得到类似以下的结果:

  (√2)²
= 1.414213562²
= 1.999999999

然而,存储符号数学将允许您将√2的结果存储为√2而不是其近似值,然后意识到(√x)²等同于x,消除了错误的可能性。

现在,这显然涉及比简单的IEEE754更复杂的编码,但这并非不可能实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接