2013-10-21 75 views
2

我想在不用调用pow()的情况下在c中编写一个幂函数。我可以使用此自定义功能替换内置的pow功能吗?

double power (double X, int Y) 
{ 
int i; 
double value = 1; 
    for (i = 0; i < Y; i++) 

    value *= X; 

    return value; 
} 

我的问题是,没有任何理由,你可以看到这个功能不会有任何给定的测试值正常工作?我试图涵盖所有输入的可能性。

-Thanks

+0

这将是相当缓慢和太不精确。 –

+4

值为int为什么? – ughoavgfhw

+0

我改变了值为一倍,谢谢 – user28374

回答

13

此功能是不够的,原因如下:

  • 这是越野车。请注意,value被声明为int而非double,这意味着如果您尝试计算power(1.5, 1),则将返回1而不是1.5。事实上,几乎所有的投入都是错误的。

  • 它不处理负指数。尝试计算power(2, -1)。正确的答案是0.5,但是你的函数(修复上面提到的int错误之后)将返回1而不是0.5。你可以很容易地解决这个问题(例如,你可以计算power(2, 1),然后采取倒数),但是按照目前的写法,这很麻烦。

  • 这很慢。当功率为整数时,大多数指数是使用一种称为exponentiation by squaring的算法来计算的,该算法比您的代码快得多。通过平方运算的幂运算将执行Θ(log Y)乘法运算,而代码所做的乘法运算则为Θ(Y)。您的功能需要花费更长的时间才能完成。

  • 它不处理分数指数。尝试计算power(1.5, 1.5)。你会得到错误的答案,因为指数是int,而不是double。纠正这一点并不容易;关于如何正确实现这一点的其他问题,在Stack Overflow上进行搜索。

  • 它重新发明轮。在基本层面上,您应该问自己为什么要重写语言数学库提供给您的函数。这可能会在程序中引入错误或低效率(请参阅前面的重点),并且在一天结束时您还没有增加功能。

希望这有助于!

+0

,它不处理溢出! – nitish712

+0

@ nitish712-我认为这是我在第一部分中提到的int错误的后果。一旦解决了这个问题,我认为溢出问题就会解决。 – templatetypedef

+0

你是对的:) – nitish712

0

你的功能应该是这样的,它会跑的比POW慢(),它运行在为O(log Y):

#include<math.h> 

#define ABS(x) ((x<0)?(-x):(x)) 

double power (double X, int Y) 
{ 
    int i; 
    double value = 1; 

    if (Y == 0) 
    { 
     return 1.0; 
    } 
    else if (X == 0) 
    { 
     return 0.0; 
    } 

    for (i = 0; i < ABS(Y); i++) 
    { 
     value *= X; 

     if (value == NAN 
      || value == INFINITY 
      || (X > 0 && (value*X) < value) 
      || (X < 0 && (value*X) > value)) 
     { 
      return NAN; 
     } 
    } 

    if (Y < 0) return (1.0/value); 
    else return value; 
} 
+1

这不是你如何检查浮点溢出。我不知道这个标准是怎么说的,但是我的系统(OS X,x86-64,Apple LLVM GCC 4.2.1)返回无穷大。它也总是检测到“溢出”,如果X小于1. – ughoavgfhw

+0

@ughoavgfhw你是对的,更新.. –