如何编程对数?

Taf*_*fer 9 algorithm math parallel-processing logarithm cpu-speed

他们是刚刚使用蛮力方法想出来的还是有算法呢?

Dav*_*men 16

在任何体面的数学库中实现诸如自然对数的函数将使误差保持在ulp以下(精度最低的单位).数学库函数的实现者的目标是找到一些最佳近似,一个通过尽可能少的计算实现所需精度的近似.泰勒系列通常是一个糟糕的选择,因为需要太多的术语才能达到所需的精度.

典型的选择武器是将所有可表示的实数范围缩小到某个非常小的区域,然后使用一些最佳近似值,在这个窄范围内产生所需函数的精确近似.这种最佳近似的典型选择武器是多项式或有理多项式(两个多项式的比率).该实现仅包含多项式系数.这些系数是通过一些优化技术构建的,例如Remes Exchange算法.

在自然对数的情况下,有一种简单的方法来缩小范围.实数几乎普遍表示在一个尾数和指数方面:X = *2 p,其中p是整数,是1和2之间.因此LOG(X)=日志()+ p*日志( 2).后一项p*log(2)只是一个已知常数的乘法.因此,问题减少到找到1到2之间(或1/2和1之间)的数字的对数.通过使用√2在[1,2]的中间对数的事实可以进一步减小范围.因此,所需要的是计算1和√2之间的数的对数的方法.这通常用有理多项式完成.二阶多项式多项式与三阶多项式的比率对此非常有效.

  • .5 ULP是一个雄心勃勃的目标; 它与正确舍入的相同,意味着必须返回最接近数学上精确结果的可表示数字.CRlibm项目(http://lipforge.ens-lyon.fr/www/crlibm/)试图这样做,但它不完整(例如,不提供反双曲线函数).忠实的舍入(小于1 ULP)是一个更容易实现的目标,典型的库允许几个ULP的错误.由于在普通处理器上划分缓慢,因此避免了Rational函数.例如,切线可能使用有理函数,但正弦和对数将使用简单多项式. (4认同)