C - 非整数指数的指数

时间:2016-12-30 22:56:22

标签: c exponential exponent

有没有一种巧妙的方法来实现这一目标而不使用pow() - 函数?想要计算2 ^(2.5)。

编辑:也许pow()毕竟是最重要的。我希望只使用四种常见操作来创建我自己的函数来解决它。 (因为我喜欢手动做事)

4 个答案:

答案 0 :(得分:3)

  • A ^(B / C)与CthRoot(A ^ B)相同。
  • A ^(1/2)与2ndRoot(A ^ 1)相同;与Sqrt(A ^ 1)相同。
  • A ^(3/4)与4thRoot(A ^ 3)相同。
  • 2 ^(2.5)与2 ^(5/2)相同,与Sqrt(2 ^ 5)相同。

测试运行:http://ideone.com/ILlT85

简单的朴素代码:

^.*(?:").*[^"]$

基本上,您可以编写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