2

我想计算有限精度下exp函数的误差(数据类型为双精度)。是泰勒级数还是其他特殊算法?

4

2 回答 2

14

一般来说,实现 e x的最佳方式是调用exp您的计算平台提供的函数。

如果做不到这一点,实现该exp功能会很复杂,并且需要一些深奥的技能。一个实现通常包括:

  • 测试各种特殊情况的输入,例如 NaN。
  • 将输入乘以专门准备的 log 2 e 表示,将问题从x转换为 2 y,其中y = x • log 2 e。
  • 将y的整数部分移动到浮点编码的指数字段中。
  • minimax polynomial评估y的小数部分的指数。
  • 结合上面的两个结果。

此外:

泰勒级数不适合评估函数,因为它们远离其中心点是不准确的。这意味着它们需要太多项来收敛到必要的精度。项太多不仅需要时间,而且难以准确地进行算术运算。

于 2013-03-12T00:32:43.090 回答
3

虽然我同意 Eric 在他的回复中所说的大部分内容,但有几点值得补充。我编写了一个工具,除其他外,它允许评估指数到高(用户指定)精度。

当精度可能变化时,必须求助于级数逼近之类的工具,因为这样就没有单一的多项式逼近就足够了。即便如此,也有很多技巧可以使用。事实上,我对我用来加速这样一个系列的各种技巧感到惊讶。

任何此类努力的一个很好的入门参考是 Hart 的“计算机近似”,这本书很遗憾地不容易找到。它提供了许多多项式近似,但也适度详细地讨论了范围缩减技巧。

指数级数本身就特别有趣。我在 HPFMod2.pdf 文件的第 4.1 节中描述了我用于指数的方法,该文件包含在HPF中。

例如,要计算 exp(123.456789),可能会尝试直接使用系列,但更好的是存储 e 本身的值。然后我们可以使用范围缩减来计算

exp(123.456789) = exp(1)*exp(2)*exp(8)*exp(16)*exp(32)*exp(64)*exp(.456789)

我们通过重复平方得到 2 的幂的指数,那么小数部分将适度快速收敛。(例如,最终系列中 100 位精度需要 31 项。)

但是,假设我们只是碰巧注意到

123.456789 = 28*ln(10) + 58.9844063961667

现在,我们可以将所需的指数写为:

exp(123.456789) = 10^28 * exp(1)*exp(2)*exp(8)*exp(16)*exp(32)*exp(-0.0155936038332811)

只要我们知道(已存储)ln(10) 的值,最终系列将只需要大约 17 项即可达到所需的 100 位精度。

于 2013-03-12T15:01:17.020 回答