我试图了解fdlibm/e_pow.c中幂函数的实现。有谁知道常数是如何计算的?特别是,我需要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)吗?
我试图了解fdlibm/e_pow.c中幂函数的实现。有谁知道常数是如何计算的?特别是,我需要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)吗?
所有这些都是基于对链接源的非常粗略的检查:
dp_h
并且dp_l
是添加或不添加的高低调整项(取决于用于加载它们的数组索引),具体取决于减少参数所在的binade部分。
Ln
和Pn
分别是指数函数和对数函数的多项式逼近系数。如果没有更仔细的检查,很难确定,但从系数看,它们似乎是极小极大近似值,通常使用 Remes 交换算法计算。
lg2
,lg2_h
并且lg2_l
是 log(2) 的近似值——分别是 log(2) 舍入为双精度位,舍入为 21 位,舍入为 21 位的残差舍入为双精度位。
ovt
我认为是溢出阈值的缩写,用于在计算算法的指数部分之前确定结果是否溢出。人们需要更仔细地检查算法的细节,以准确解释它是如何推导出来的。
cp_h
并cp_l
一起形成 2/(3*log2) 的头尾近似。
“tail”是数学库设计中的常用名词;通常,库需要以比使用单个浮点值更高的精度来表示常量。所以常数表示为“头+尾”,其中“头”是舍入到某个位数的值,“尾”是常数 - 舍入到数据类型的头。
如果您不熟悉这类基本术语,那么您可能想先查看一些比 pow() 更简单的数学库函数;它是库中数学上最复杂的函数之一。我还建议查看 Muller 等人的Handbook of Floating-Point Arithmetic进行介绍。