3

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

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

4

1 回答 1

9

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

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

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

lg2,lg2_h并且lg2_l是 log(2) 的近似值——分别是 log(2) 舍入为双精度位,舍入为 21 位,舍入为 21 位的残差舍入为双精度位。

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

cp_hcp_l一起形成 2/(3*log2) 的头尾近似。

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

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

于 2012-12-25T23:18:46.667 回答