fdlibm/e_pow.c中常量的公式

Arl*_*len 3 c math floating-point

我试图了解fdlibm/e_pow.c中power函数的实现.有谁知道如何计算常数?特别是,我需要的公式dp_h[],dp_l[],L1,L2,L3,L4,L5,L6,P1,P2,P3,P4,P5,lg2,lg2_l,ovt,cp_l(这是什么尾巴?).

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

Ste*_*non 9

所有这些都是基于对链接源的粗略检查:

dp_h并且dp_l是高或低调整项是否添加(取决于用于加载它们的数组索引),具体取决于减少的参数所在的binade的哪个部分.

Ln并且Pn分别是指数和对数函数的多项式近似的系数.很难肯定地说没有更仔细的检查,但是从系数一目了然,他们似乎是极小极大近似值,这是通常使用雷梅斯交换算法来计算.

lg2,lg2_h并且lg2_l是log(2)的近似值 - 分别是log(2)舍入为double,舍入为21位,舍入为21位的残差舍入为double.

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

cp_h并且cp_l一起形成2 /(3*log2)的头尾近似.

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

如果您不熟悉这种基本术语,那么您可能希望首先查看一些比pow()更简单的数学库函数; 它是图书馆中数学上最复杂的功能之一.我还建议您查看Muller等人的浮点运算手册.