【问题标题】:Can I replace the built-in pow function using this custom function?我可以使用这个自定义函数替换内置的 pow 函数吗?
【发布时间】:2013-10-21 03:45:36
【问题描述】:

我正在尝试在不调用 pow() 的情况下用 c 编写一个幂函数。

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

    value *= X;

    return value;
}

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

-谢谢

【问题讨论】:

  • 它会很慢而且很不精确。
  • 我将值改为双倍,谢谢

标签: c algorithm math exponent


【解决方案1】:

这个功能不够用有几个原因:

  • 有问题。请注意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 的算法计算的,这比您的代码快得多.与您的代码进行的 Θ(Y) 乘法相比,平方求幂将进行 Θ(log Y) 乘法。完成函数所需的时间将成倍增长。

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

  • 它重新发明了轮子。从根本上讲,您应该问自己为什么要重写该语言的数学库提供给您的函数。这可能会在程序中引入错误或效率低下(请参阅前面的要点),最终您还没有增加功能。

希望这会有所帮助!

【讨论】:

  • 而且它不处理溢出!!
  • @nitish712- 我认为这是我在第一部分中提到的int 错误的结果。一旦考虑到这一点,我认为溢出问题将得到解决。
  • 我通过平方查看了幂,有没有办法从“零开始”做到这一点而不调用任何函数?顺便说一句,谢谢您的意见
  • @user28374- 绝对!维基百科页面上描述了该算法的一个非常简单的递归公式。
  • 那么它在哪里调用 exp-by-squareing 我将如何将该部分键入为代码,以及它在哪里显示 x 平方?谢谢
【解决方案2】:

你的函数应该是这样的,它会比在 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;
}

【讨论】:

  • 这不是您检查浮点溢出的方式。我不知道标准对此有何评论,但我的系统(OS X、x86-64、Apple LLVM GCC 4.2.1)返回无穷大。如果 X 小于 1,它也总是会检测到“溢出”。
猜你喜欢
  • 1970-01-01
  • 2022-12-18
  • 2011-10-30
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多