为什么我自己的幂函数,当用于计算根时 returns 错误的结果?

Why does my own power function, when used for calculating roots returns wrong result?

我实现了自己的幂函数,并将其进一步用于计算根。我想将我的函数返回的结果与 pow 函数从 math.h 返回的结果进行比较。然而,事实证明,当使用我的幂函数计算根时,它会产生错误的答案。 15 的平方根大约是 3,但我的代码打印 15:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

double power(int base, double index)
{
    double result = 1;
    int i;

    for (i = 0; i<index; i++)
        result *= base;

    return result;
}

int main()
{
    int n = 15, s = 2;

    printf("2^3 = %f\n\n", power(2,3));

    double result1 = power(n, 1.0/s);
    printf("%d\n", (int)result1);

    double result2 = pow(n, 1.0/s);
    printf("%d\n", (int)result2);

    return 0;
}

您的函数不起作用,因为它的实现使用了一种通常用于直观解释权力的方法 ("take the number 1 and multiply it exponent times by the base")。但是,该方法仅适用于自然数。 这不是具有任意指数的幂的实际数学定义。

如果你想要一个适用于其他数字空间的函数,你需要find a numerical method that's applicable for those those as well。通常,这些涉及计算特定系列。

首先,您需要定义一个函数来处理这些:

  1. 正整数指数的幂。 (这就是你的成就。)
  2. 负整数指数的幂。 (您可以使用反转,abs 和您之前的步骤。)
  3. 指数为零的幂。 (幸运的是,这在大多数情况下只是一个常数。)

您还需要一个已经实现的 ln(double x)(或者您可以通过对涉及整数幂函数的特定级数求和来实现它)和一个 factorial(int n) 函数(很容易编写这,甚至是直觉)。

然后,您可以编写一个接受任何实数 base、任何实数 exponent 和整数 n 的函数,然后执行以下操作:

  1. 计算exponent * ln(base)
  2. 使用整数幂函数计算该结果的 n 次方。
  3. 将该结果除以 factorial(n)

将其包装在一个循环中,该循环将 n 的所有值的计算结果相加,从 0 到可以有效有效处理的最大值(最大值 n 越高,近似值越好)。该总和就是您要查找的数学结果。因此,将 baseexponent 作为参数并针对一系列 n 值运行上述循环的函数是您可以公开的实际最终 pow 函数外部代码。

或者,只看 real-world implementations 看看他们使用了哪些方法也没什么坏处。这样的实现通常与最明显的数学实现不同,因为它们对计算机来说更高效(通常直接考虑所涉及数字的二进制表示)并且还特别注意避免各种数据的上溢和下溢之类的事情涉及的类型。