我可以使用此自定义功能替换内置的pow功能吗?

时间:2013-10-21 03:45:37

标签: c algorithm math exponent

我正在尝试在c中编写幂函数而不调用pow()。

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

    value *= X;

    return value;
}

我的问题是,您是否有任何理由可以看到此功能在任何给定的测试值下无法正常工作?我试图涵盖所有输入的可能性。

-Thanks

2 个答案:

答案 0 :(得分:13)

由于以下几个原因,此功能不足:

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

  • 它不处理负指数。尝试计算1.5。正确答案为power(2, -1),但您的功能(在修复上述0.5错误后)将返回1而不是int。你可以很容易地解决这个问题(你可以,例如,计算0.5,然后取倒数),但它现在写的很麻烦。

  • 速度慢。大多数取幂,当功率是整数时,使用名为 exponentiation by squaring 的算法计算,这比你的代码。与代码所做的Θ(Y)乘法相比,通过平方的指数将进行Θ(log Y)乘法。您的功能需要指数级的时间才能完成。

  • 它不处理小数指数。尝试计算power(2, 1)。您将得到错误的答案,因为指数是power(1.5, 1.5),而不是int。纠正这一点并不容易;在Stack Overflow上搜索有关如何正确实现此问题的其他问题。

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

希望这有帮助!

答案 1 :(得分:0)

你的功能应该是这样的,它会比运行在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;
}