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 实现。)