【问题标题】:pow() function in C problems [duplicate]C问题中的pow()函数[重复]
【发布时间】:2018-06-30 07:04:44
【问题描述】:

我在 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 floating-point floating-accuracy pow


【解决方案1】:

您的 C 实现,包括它的数学库,有一个错误的 pow 实现,它返回不准确的结果。 (当数学结果可以精确地以浮点格式表示时,一个好的pow 实现会返回一个精确的结果。)例如,对于pow(7, 2),您的pow 可能返回一个略低于49 的值。当这是转换为unsigned int(除了sum),它被截断,结果为48。

要解决您的库中的这个缺陷,请不要将pow 用于整数运算。编写您自己的整数算术以获得您想要的结果。在某些情况下,使用round(pow(N, n)) 可能就足够了,但需要考虑这将适用的值范围(宽整数可能能够表示double 不能表示的整数),有时还有性能。 (另一种解决方法是获得更好的 C 实现。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多