fdlibm/e_pow.c中的常数公式
我正在努力理解中幂函数的实现。有人知道常数是如何计算的吗?特别是,我需要fdlibm/e_pow.c中的常数公式,c,math,floating-point,C,Math,Floating Point,我正在努力理解中幂函数的实现。有人知道常数是如何计算的吗?特别是,我需要dp\u h[],dp\u l[],L1,L2,L3,L4,L5,L6,P1,P2,P3,P4,,P5,,,L2,,(尾巴是什么?) 此外,给出的方程式缺少括号。它应该是吗?所有这些都基于对链接源的粗略检查: dp_h和dp_l是高调整项和低调整项,它们要么添加要么不添加(取决于用于加载它们的数组索引),这取决于缩减参数所在的二进制代码部分 Ln和Pn分别是指数函数和对数函数的多项式近似系数。如果不进行更仔细的检查,很难确定
dp\u h[]
,dp\u l[]
,L1
,L2
,L3
,L4
,L5
,L6
,P1
,P2
,P3
,P4
,,P5
,,,L2
,,(尾巴是什么?)
此外,给出的方程式缺少括号。它应该是吗?所有这些都基于对链接源的粗略检查:
dp_h
和dp_l
是高调整项和低调整项,它们要么添加要么不添加(取决于用于加载它们的数组索引),这取决于缩减参数所在的二进制代码部分
Ln
和Pn
分别是指数函数和对数函数的多项式近似系数。如果不进行更仔细的检查,很难确定,但从系数看,它们似乎是极小极大近似值,通常使用Remes交换计算e算法
lg2
、lg2_h
和lg2_l
是对数(2)的近似值——它们分别是对数(2)四舍五入到双精度、四舍五入到21位,以及四舍五入到21位的剩余值四舍五入到双精度
我认为,ovt
是溢出阈值的缩写,用于在计算算法的指数部分之前确定结果是否溢出。我们需要更仔细地检查算法的细节,以准确地解释其推导过程
cp_h
和cp_l
共同构成了2/(3*log2)的头尾近似值
“tail”是数学库设计中的一个常用术语;库通常需要以比使用单个浮点值更高的精度表示常量。因此,常量表示为“head+tail”,其中“head”是四舍五入到某个位数的值,“tail”是常量-head四舍五入到数据类型
如果您不熟悉这类基本术语,那么您可能希望首先了解一些比pow()更简单的数学库函数;它是库中数学上最复杂的函数之一。我还建议大家看看Muller等人的介绍。虽然这是一个非常有趣的问题,但它可能属于数学。SE。@IgnacioVazquez Abrams:这是一个明确的编程问题。它究竟为什么属于数学?当然是关于选择这些常数不仅是因为它们的数学性质,而且因为它们满足某些要求,这些要求仅适用于在物理计算机上实现所讨论的算法(即编程);碰巧,这些考虑因素比数学上的考虑因素更有趣,数学上的考虑因素更容易理解。我们是否打算删除任何与电子商务有关的问题,因为“这是关于销售的”?这个问题涉及到中所述的所有四个主题:实现pow
是一个特定的编程问题,它是一个软件算法,pow
,它的来源是程序员广泛使用的工具,所问的问题是编程问题特有的实用、可回答的问题。使用的大多数常量是没有特定的通用数学值;只有它们在实现pow
时的功能才使它们有趣。@IgnacioVazquez Abrams:不,选择pow
中的常量不是因为它们在数学上相关。选择头尾表示是因为浮点实现的特殊性,而不是一般的数学原理。极小极大多项式是为特定的实现而设计的,而不是为一般的数学函数。pow
实现是为特定的平台和功能而设计的,而不是纯粹从数学原理中派生出来的。设计它们很难,而且是一个深层次的软件问题。