C 问题中的 pow() 函数
pow() function in C problems
我在使用 C 中的 pow()
函数时遇到了一些问题。当 运行 此代码时,153
作为输入,总和计算为 152
。但是,如果我不使用 pow()
函数而是使用 for
循环来获取 Nn 的值,则总和计算为 153
。谁能帮我解释一下这个区别?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(void) {
unsigned int i, n, sum = 0, N, a = 1, j;
char num[100], x[2] = { 0 };
printf("Determining an armstrong number\n\n"
"Enter a number: ");
fflush(stdin);
gets(num);
n = strlen(num);
for (i = 0; i < n; i++) {
a = 1;
x[0] = num[i];
N = atoi(x);
/* for (j = 1; j <= n; j++)
a *= N;
*/
sum += pow(N, n);
}
n = atoi(num);
if (sum == n)
printf("\nIt is an Armstrong number!\n");
else
printf("\nIt is not an Armstrong number!\n");
return 0;
}
您的 C 实现(包括其数学库)的 pow
实现不佳,导致 returns 结果不准确。 (一个好的 pow
实现 returns 当数学结果可以用浮点格式精确表示时的精确结果。)例如,对于 pow(7, 2)
,您的 pow
可能是返回一个略低于 49 的值。当它被转换为 unsigned int
(除了 sum
)时,它被截断,结果为 48.
要解决您库中的这个缺陷,请不要使用 pow
进行整数运算。编写您自己的整数算法以获得您想要的结果。在某些情况下,使用 round(pow(N, n))
可能就足够了,但要考虑这将适用的值范围(宽整数可能能够表示 double
不能表示的整数),有时还会考虑性能。 (另一种解决方法是获得更好的 C 实现。)
我在使用 C 中的 pow()
函数时遇到了一些问题。当 运行 此代码时,153
作为输入,总和计算为 152
。但是,如果我不使用 pow()
函数而是使用 for
循环来获取 Nn 的值,则总和计算为 153
。谁能帮我解释一下这个区别?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(void) {
unsigned int i, n, sum = 0, N, a = 1, j;
char num[100], x[2] = { 0 };
printf("Determining an armstrong number\n\n"
"Enter a number: ");
fflush(stdin);
gets(num);
n = strlen(num);
for (i = 0; i < n; i++) {
a = 1;
x[0] = num[i];
N = atoi(x);
/* for (j = 1; j <= n; j++)
a *= N;
*/
sum += pow(N, n);
}
n = atoi(num);
if (sum == n)
printf("\nIt is an Armstrong number!\n");
else
printf("\nIt is not an Armstrong number!\n");
return 0;
}
您的 C 实现(包括其数学库)的 pow
实现不佳,导致 returns 结果不准确。 (一个好的 pow
实现 returns 当数学结果可以用浮点格式精确表示时的精确结果。)例如,对于 pow(7, 2)
,您的 pow
可能是返回一个略低于 49 的值。当它被转换为 unsigned int
(除了 sum
)时,它被截断,结果为 48.
要解决您库中的这个缺陷,请不要使用 pow
进行整数运算。编写您自己的整数算法以获得您想要的结果。在某些情况下,使用 round(pow(N, n))
可能就足够了,但要考虑这将适用的值范围(宽整数可能能够表示 double
不能表示的整数),有时还会考虑性能。 (另一种解决方法是获得更好的 C 实现。)