我试图在不调用 pow() 的情况下用 c 编写一个幂函数。
double power (double X, int Y)
{
int i;
double value = 1;
for (i = 0; i < Y; i++)
value *= X;
return value;
}
我的问题是,你有什么理由可以看到这个函数在任何给定的测试值下都不能正常工作?我试图涵盖所有输入的可能性。
-谢谢
由于以下几个原因,此功能不足:
是马车。请注意,它value
被声明为 anint
而不是 a double
,这意味着如果您尝试计算power(1.5, 1)
,您将得到 1 而不是1.5
。事实上,几乎所有的输入都是错误的。
它不处理负指数。尝试计算power(2, -1)
。正确答案是0.5
,但您的函数(在修复上述int
错误后)将返回 1 而不是0.5
. 你可以很容易地解决这个问题(例如,你可以计算power(2, 1)
然后取倒数),但目前写的很麻烦。
它很慢。大多数幂运算,当幂是整数时,是使用一种称为乘方求幂的算法计算的,这比您的代码快得多。与您的代码进行的 Θ(Y) 乘法相比,平方求幂将进行 Θ(log Y) 乘法。您的功能将需要更长的时间才能完成。
它不处理小数指数。尝试计算power(1.5, 1.5)
。你会得到错误的答案,因为指数是int
,而不是double
。纠正这一点并不容易。在 Stack Overflow 上搜索有关如何正确实现此功能的其他问题。
它重新发明了轮子。从根本上讲,您应该问自己为什么要重写该语言的数学库提供给您的函数。这可能会在程序中引入错误或效率低下(请参阅前面的要点),并且在一天结束时您还没有增加功能。
希望这可以帮助!
你的函数应该是这样的,它会比在 O(log Y) 中运行的 pow() 运行得慢:
#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;
}