为什么我自己的幂函数,当用于计算根时 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。通常,这些涉及计算特定系列。
首先,您需要定义一个函数来处理这些:
- 正整数指数的幂。 (这就是你的成就。)
- 负整数指数的幂。 (您可以使用反转,
abs
和您之前的步骤。)
- 指数为零的幂。 (幸运的是,这在大多数情况下只是一个常数。)
您还需要一个已经实现的 ln(double x)
(或者您可以通过对涉及整数幂函数的特定级数求和来实现它)和一个 factorial(int n)
函数(很容易编写这,甚至是直觉)。
然后,您可以编写一个接受任何实数 base
、任何实数 exponent
和整数 n
的函数,然后执行以下操作:
- 计算
exponent * ln(base)
。
- 使用整数幂函数计算该结果的
n
次方。
- 将该结果除以
factorial(n)
。
将其包装在一个循环中,该循环将 n
的所有值的计算结果相加,从 0 到可以有效有效处理的最大值(最大值 n
越高,近似值越好)。该总和就是您要查找的数学结果。因此,将 base
和 exponent
作为参数并针对一系列 n
值运行上述循环的函数是您可以公开的实际最终 pow
函数外部代码。
或者,只看 real-world implementations 看看他们使用了哪些方法也没什么坏处。这样的实现通常与最明显的数学实现不同,因为它们对计算机来说更高效(通常直接考虑所涉及数字的二进制表示)并且还特别注意避免各种数据的上溢和下溢之类的事情涉及的类型。
我实现了自己的幂函数,并将其进一步用于计算根。我想将我的函数返回的结果与 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。通常,这些涉及计算特定系列。
首先,您需要定义一个函数来处理这些:
- 正整数指数的幂。 (这就是你的成就。)
- 负整数指数的幂。 (您可以使用反转,
abs
和您之前的步骤。) - 指数为零的幂。 (幸运的是,这在大多数情况下只是一个常数。)
您还需要一个已经实现的 ln(double x)
(或者您可以通过对涉及整数幂函数的特定级数求和来实现它)和一个 factorial(int n)
函数(很容易编写这,甚至是直觉)。
然后,您可以编写一个接受任何实数 base
、任何实数 exponent
和整数 n
的函数,然后执行以下操作:
- 计算
exponent * ln(base)
。 - 使用整数幂函数计算该结果的
n
次方。 - 将该结果除以
factorial(n)
。
将其包装在一个循环中,该循环将 n
的所有值的计算结果相加,从 0 到可以有效有效处理的最大值(最大值 n
越高,近似值越好)。该总和就是您要查找的数学结果。因此,将 base
和 exponent
作为参数并针对一系列 n
值运行上述循环的函数是您可以公开的实际最终 pow
函数外部代码。
或者,只看 real-world implementations 看看他们使用了哪些方法也没什么坏处。这样的实现通常与最明显的数学实现不同,因为它们对计算机来说更高效(通常直接考虑所涉及数字的二进制表示)并且还特别注意避免各种数据的上溢和下溢之类的事情涉及的类型。