在任意精度十进制库

时间:2016-06-03 14:23:27

标签: algorithm math numerical-methods

如果你有一个任意精度的十进制库,但它没有任何基本的(例如指数函数,正弦函数)或特殊的(例如误差函数,对数积分)数学函数,那么是实施它们的最佳方式吗?

显然,由于大多数这些函数的值是不合理的,因此只有给出指定精度的答案才有意义。假设我想将erf(x)(例如)计算到50个小数位,那么最好的方法是什么?

我得到的最佳答案是将参数映射到某个合适的范围,然后使用函数的泰勒级数得到一个合理快速收敛(希望)的答案。我们可以使用泰勒定理之类的东西来约束误差项,但通常,这涉及将阶乘与10的幂进行比较(例如,参见"泰勒定理中的一个实变量中的例子和" #34;在Taylor's Theorem的维基页面上,虽然可行但似乎啰嗦。

此外,虽然实现这些功能似乎是可行的,但在处理这些功能的组合时,如何处理精度?例如,如果我们想要计算1000 * exp(sqrt(2))到n个小数位,那么我们应该计算中间结果以获得准确的最终答案,这对于什么级别的精确度来说并不是很明显。

有谁知道我可以从这个问题开始?

1 个答案:

答案 0 :(得分:1)

这个主题非常广泛,每种类型的功能都非常不同。泰勒系列是最后的选择,如果你想要速度通常也无法使用。通常有替代品(Chebyshev,......),但每种类型的功能都不同,需要不同的方法才能获得最佳性能/精度。例如:

  • 有时使用CORDIC算法
  • 解决基本的测角函数
  • pow,exp,log可以通过log2,exp2
  • 解决
  • log2,exp2可以通过基本数学运算(+,-,*,/)和位(<<,>>,&,|,^)函数解决,并使用sqrt作为分数位
  • sqrt可以通过binary search without multiplication
  • 计算

要更好地理解任意精度函数之间的差异,请参阅我的任务:

因此,您可以更好地询问有关特定函数实现的问题,而不是任意函数的任意方法。

结果的位宽通常会被截断为函数属性的合理大小。例如,乘法是操作数的位数的总和,+,-可以比最大的操作数大1位......

在选择算法时不要忘记算法基础复杂性与实际实现复杂性之间存在很大差异。特别是在任意精度数字上,因为即使像加法这样简单的东西也不再是O(1) ......