我正试图了解fdlibm/e_pow.c中幂函数的实现。有谁知道如何计算常数?特别是,我需要dp_h[]
,dp_l[]
,L1
,L2
,L3
,L4
,L5
的公式, L6
,P1
,P2
,P3
,P4
,P5
,lg2
,lg2_l
,{{ 1}},ovt
(什么是尾巴?)。
此外,给出的等式缺少括号。它应该是(3/2)*(log(x)-2s-2/3*s**3)吗?
答案 0 :(得分:9)
所有这些都是基于对相关来源的粗略检查:
dp_h
和dp_l
是高或低调整项,无论是否添加(取决于用于加载它们的数组索引),取决于binade的哪个部分减少的参数在于。
Ln
和Pn
分别是指数函数和对数函数的多项式近似系数。如果没有仔细检查,很难肯定地说,但是从系数的角度来看,它们似乎是极小极大近似值,通常使用Remes交换算法计算。
lg2
,lg2_h
和lg2_l
是log(2)的近似值 - 分别是log(2)舍入为double,舍入为21位,舍入为余数到21位四舍五入为双。
ovt
是OVerflow Threshold的缩写,用于在计算算法的指数部分之前确定结果是否溢出。人们需要更仔细地检查算法的细节,以准确解释它是如何得出的。
cp_h
和cp_l
一起构成了2 /(3 * log2)的尾部近似。
“尾巴”是数学图书馆设计中的常用术语;通常,库需要将常量表示为比使用单个浮点值更高的精度。所以常量表示为“head + tail”,其中“head”是舍入到某个位数的值,“tail”是常量 - 舍入到数据类型。
如果您不熟悉这种基本术语,那么您可能希望首先查看一些比pow()更简单的数学库函数;它是图书馆中数学上最复杂的功能之一。我还建议您查看Muller等人的Handbook of Floating-Point Arithmetic作为介绍。