Math 无递归的浮点幂函数

Math 无递归的浮点幂函数,math,glsl,pow,exp,Math,Glsl,Pow,Exp,GLSL没有用于双精度类型的pow函数。此函数的经典实现使用递归。由于GLSL中不允许递归,我需要一个无递归的实现 我还需要exp函数。这个问题可以简单地通过将它分成两个子问题来解决 将指数的整数部分和小数部分分开 计算整个部分的功率,这是相当琐碎的 使用近似值计算分数部分的幂 将结果相乘 如果初始指数为负,则反转结果 ///这是pow的一个简单的非递归实现,其中指数是整数。 双功率双基,整数功率{ 双精度=1.0;//初始化结果 当功率>0.0时{ //如果幂为奇数,则将x乘以结果 如果电源%

GLSL没有用于双精度类型的pow函数。此函数的经典实现使用递归。由于GLSL中不允许递归,我需要一个无递归的实现


我还需要exp函数。

这个问题可以简单地通过将它分成两个子问题来解决

将指数的整数部分和小数部分分开 计算整个部分的功率,这是相当琐碎的 使用近似值计算分数部分的幂 将结果相乘 如果初始指数为负,则反转结果 ///这是pow的一个简单的非递归实现,其中指数是整数。 双功率双基,整数功率{ 双精度=1.0;//初始化结果 当功率>0.0时{ //如果幂为奇数,则将x乘以结果 如果电源%2==1{ res*=基准; } //n现在一定是扯平了 功率/=2; base*=base;//将x更改为x^2 } 返回res; } //所需的精度。精度越高,执行速度越慢。 常数双ε=0.00000001; 双功率双基双功率{ //现在我们想忽略负指数,如果必要的话,我们在第二个时间点反转我们的结果。 bool负=功率<0.0LF; 如果是否定的{ 功率*=-1.0LF; } //把全部和部分分开。 双分数=幂-整数幂; 整数=整数幂-分数; //整个部分很容易计算。 double intPow=powbase,整数; //分数部分使用近似方法。 双低=0.0LF; 双高=1.0LF; 双sqr=sqrtbase; 双acc=sqr; 双中=高/2.0LF; 而absmid-分数>ε{ sqr=sqrtsqr;
如果你的答案很好,你总是可以使用堆栈来模拟递归。这通常也很简单。请看,但我会首先尝试powx,y=exp2y*log2x或任何其他exp,log base IIRC。它们是在GLSL中实现的,而它们是在GLSL中实现的。它们只适用于单精度浮点,不适用于双精度浮点。O因此,我可以很容易地使用GLSL提供的默认pow函数。
EPSILON = 0.0001     -> 16.0763
EPSILON = 0.00001    -> 19.4108
EPSILON = 0.000001   -> 22.6639
EPSILON = 0.0000001  -> 26.0477
EPSILON = 0.00000001 -> 29.3929