我们可以编写一个简单的有理数类,使用两个整数A/B表示,其中B != 0。
如果我们想要表示一个无理数类(存储和计算),我脑海中首先想到的是使用浮点数,也就是使用IEEE 754标准(二进制小数)。这是因为无理数必须被近似表示。
除了使用二进制小数(无论它们是否保留内存空间)之外,还有其他方法来编写无理数类吗?
我研究了jsbeuno在Python中使用的解决方案:任何编程语言中的无理数表示?
他仍然使用内置的浮点数进行存储。
这不是作业。
谢谢你的时间。
我们可以编写一个简单的有理数类,使用两个整数A/B表示,其中B != 0。
如果我们想要表示一个无理数类(存储和计算),我脑海中首先想到的是使用浮点数,也就是使用IEEE 754标准(二进制小数)。这是因为无理数必须被近似表示。
除了使用二进制小数(无论它们是否保留内存空间)之外,还有其他方法来编写无理数类吗?
我研究了jsbeuno在Python中使用的解决方案:任何编程语言中的无理数表示?
他仍然使用内置的浮点数进行存储。
这不是作业。
谢谢你的时间。
通过基数参数,无理数比有理数多得多。(而IEEE754浮点数的数量是有限的,可能小于2^64)。
您可以使用除分数以外的其他方式表示数字(例如对数)。
jsbeuno将数字存储为基数和进制,并在与其他无理数进行计算时使用它们;他仅在输出时使用浮点表示。
如果您想变得更高级,可以像上面描述的那样将基数和进制定义为有理数(具有两个整数),或者使它们本身成为无理数。
但要使某物彻底有用,最终您将不得不复制一个符号数学包。
您可以始终使用符号数学,其中项目按其原样存储,计算被推迟,直到它们可以以某个阈值以上的精度执行。
例如,假设您对非无理数(如2
)执行了两个操作,一个是取平方根,然后再平方。在有限的精度下,您可能会得到类似以下的结果:
(√2)²
= 1.414213562²
= 1.999999999
然而,存储符号数学将允许您将√2
的结果存储为√2
而不是其近似值,然后意识到(√x)²
等同于x
,消除了错误的可能性。
现在,这显然涉及比简单的IEEE754更复杂的编码,但这并非不可能实现。
B
来表示任何IEEE浮点数。 - Mark Ransom