fdlibm / e_pow.c中常量的公式

时间:2012-12-25 22:39:32

标签: c math floating-point

我正试图了解fdlibm/e_pow.c中幂函数的实现。有谁知道如何计算常数?特别是,我需要dp_h[]dp_l[]L1L2L3L4L5的公式, L6P1P2P3P4P5lg2lg2_l,{{ 1}},ovt(什么是尾巴?)。

此外,给出的等式缺少括号。它应该是(3/2)*(log(x)-2s-2/3*s**3)吗?

1 个答案:

答案 0 :(得分:9)

所有这些都是基于对相关来源的粗略检查:

dp_hdp_l是高或低调整项,无论是否添加(取决于用于加载它们的数组索引),取决于binade的哪个部分减少的参数在于。

LnPn分别是指数函数和对数函数的多项式近似系数。如果没有仔细检查,很难肯定地说,但是从系数的角度来看,它们似乎是极小极大近似值,通常使用Remes交换算法计算。

lg2lg2_hlg2_l是log(2)的近似值 - 分别是log(2)舍入为double,舍入为21位,舍入为余数到21位四舍五入为双。

我认为

ovt是OVerflow Threshold的缩写,用于在计算算法的指数部分之前确定结果是否溢出。人们需要更仔细地检查算法的细节,以准确解释它是如何得出的。

cp_hcp_l一起构成了2 /(3 * log2)的尾部近似。

“尾巴”是数学图书馆设计中的常用术语;通常,库需要将常量表示为比使用单个浮点值更高的精度。所以常量表示为“head + tail”,其中“head”是舍入到某个位数的值,“tail”是常量 - 舍入到数据类型。

如果您不熟悉这种基本术语,那么您可能希望首先查看一些比pow()更简单的数学库函数;它是图书馆中数学上最复杂的功能之一。我还建议您查看Muller等人的Handbook of Floating-Point Arithmetic作为介绍。