我想在不用调用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
我想在不用调用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
此功能是不够的,原因如下:
这是越野车。请注意,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上进行搜索。
它重新发明轮。在基本层面上,您应该问自己为什么要重写语言数学库提供给您的函数。这可能会在程序中引入错误或低效率(请参阅前面的重点),并且在一天结束时您还没有增加功能。
希望这有助于!
,它不处理溢出! – nitish712
@ nitish712-我认为这是我在第一部分中提到的int错误的后果。一旦解决了这个问题,我认为溢出问题就会解决。 – templatetypedef
你是对的:) – nitish712
你的功能应该是这样的,它会跑的比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;
}
这不是你如何检查浮点溢出。我不知道这个标准是怎么说的,但是我的系统(OS X,x86-64,Apple LLVM GCC 4.2.1)返回无穷大。它也总是检测到“溢出”,如果X小于1. – ughoavgfhw
@ughoavgfhw你是对的,更新.. –
这将是相当缓慢和太不精确。 –
值为int为什么? – ughoavgfhw
我改变了值为一倍,谢谢 – user28374