【问题标题】:Irrational number representation in computer计算机中的无理数表示
【发布时间】:2012-01-24 16:48:39
【问题描述】:

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

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

除了使用二进制分数之外,还有其他写无理数类的方法(无论它们是否节省内存空间)?

我用Python研究了jsbeuno的解决方案:Irrational number representation in any programming language?

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

这不是家庭作业

感谢您的宝贵时间。

【问题讨论】:

  • B 可以使用 2 的幂来表示任何 IEEE 浮点数。
  • 但这不是已经是 754(即使我们出于疯狂的原因将 A 存储为整数......)?由于小数部分将转换为 2 的幂(负)?
  • 一旦你将它们表示在内存中,你打算如何处理这些数字?选择正确的解决方案几乎完全取决于您对这个问题的回答。

标签: numbers floating-point


【解决方案1】:

对于基数论证,无理数比有理数多得多。 (而且IEEE754浮点数的个数是有限的,可能小于2^64)。

你可以用分数以外的东西来表示数字(例如对数)。

【讨论】:

  • 但是在那些无理数中,只有可数无穷大是可计算的(听起来像是重言式),所以它不会是比有理数更糟糕的问题。
【解决方案2】:

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

如果你想变得更漂亮,你可以如上所述将底数和基数定义为有理数(有两个整数),或者将它们自己设为无理数。

不过,为了使某些东西彻底有用,您最终将复制一个符号数学包。

【讨论】:

    【解决方案3】:

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

    例如,假设您对像2 这样的非无理数执行了两次运算,一次取平方根,然后一次取平方。如果精度有限,您可能会得到如下结果:

      (√2)²
    = 1.414213562²
    = 1.999999999
    

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

    现在显然涉及到比简单的 IEEE754 更复杂的编码,但它是 not impossible to achieve

    【讨论】:

      猜你喜欢
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2010-12-31
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多