有没有一种巧妙的方法来实现这一目标而不使用pow() - 函数?想要计算2 ^(2.5)。
编辑:也许pow()毕竟是最重要的。我希望只使用四种常见操作来创建我自己的函数来解决它。 (因为我喜欢手动做事)
答案 0 :(得分:3)
简单的朴素代码:
^.*(?:").*[^"]$
基本上,您可以编写Root函数来计算值的Nth-Root和幂函数。您还需要一个从浮点数创建分数的函数。
这可能比其他解决方案要多得多。
答案 1 :(得分:0)
确实应该有该函数的pow(float,float)版本。如果没有,你可以通过计算exp(b * log(a))来表达** b,参见wikipedia。
答案 2 :(得分:0)
x ^(2.5)= x * x * sqrt(x)
添加乘法以获得指数。如果你需要接近2的幂的分数,你可以在sqrt之上构建它。 x ^ 1/4 = sqrt(sqrt(x))
Euler的数字是特殊的,e ^ x可以从快速收敛的阶乘系列中计算出来。 pow是在它上面实现的。
这是我的书“Basic Algorithms”中的代码(用于解释如何进行计算,而不是优化的生产代码)。
/*
power function
*/
double power(double x, double y)
{
int i;
double answer = 1;
if(y < 0)
return 1/power(x, -y);
if(y == (int) y)
{
for(i=0;i<y;i++)
answer *= x;
return answer;
}
if(x == 0)
return 0;
assert(x > 0);
return exponent(y * logarithm(x));
}
/*
log function
*/
double logarithm(double x)
{
int intpart = 0;
double fractpart;
double power;
int i;
while(x > 3.0/2.0)
{
intpart++;
x /= 2.718282;
}
while(x < 1.0/2.0)
{
intpart--;
x *= 2.718282;
}
x -= 1.0;
i = 1;
power = 1;
fractpart = 0;
do
{
power *= x;
fractpart += power/i * ((i % 2) ? 1 : -1);
i++;
}
while(power/i > 0.00000001 || power/i < -0.00000001);
return intpart + fractpart;
}
答案 3 :(得分:0)
如果符合您的需要,您可以近似计算: 你需要的是泰勒二项式系列,这就是如何在内部实现pow功能(实际上,它通常使用更好的会聚系列)。 您需要的只是确定术语的数量,这样您就可以拟合所需的近似误差。实际上,N项系列扩展的误差不会超过N + 1项(如果它收敛)。
如需更多信息,请查看this