我想计算有限精度下exp函数的误差(数据类型为双精度)。是泰勒级数还是其他特殊算法?
2 回答
一般来说,实现 e x的最佳方式是调用exp
您的计算平台提供的函数。
如果做不到这一点,实现该exp
功能会很复杂,并且需要一些深奥的技能。一个实现通常包括:
- 测试各种特殊情况的输入,例如 NaN。
- 将输入乘以专门准备的 log 2 e 表示,将问题从x转换为 2 y,其中y = x • log 2 e。
- 将y的整数部分移动到浮点编码的指数字段中。
- 用minimax polynomial评估y的小数部分的指数。
- 结合上面的两个结果。
此外:
- minimax 多项式是使用 Remez 算法或类似算法设计的,通常使用特殊软件。
- 这项工作必须以一定的精度完成,以便可以精确计算最终结果。
泰勒级数不适合评估函数,因为它们远离其中心点是不准确的。这意味着它们需要太多项来收敛到必要的精度。项太多不仅需要时间,而且难以准确地进行算术运算。
虽然我同意 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 位精度。