pow功能出错

Ved*_*yak 0 c

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

void main() {
    int decimal, count, binary, digit;
    printf("Enter the number : ");
    scanf("%d", &decimal);
    count = 0; binary = 0;
    while (decimal > 0) {
        digit = decimal % 2;
        binary = binary + digit * pow(10, count);
        decimal = decimal / 2;
        ++count;
    }
    printf("Binary form : %d", binary);
}
Run Code Online (Sandbox Code Playgroud)

我使用上面的代码将Decimal转换为二进制.但问题是输出.

Input           : 12
Expected Output : 1100
Actual Output   : 1099
Run Code Online (Sandbox Code Playgroud)

[img] https://i.imgur.com/1mZlMQN.png [/ img ]

其他输入也存在此问题.只有8给出正确的输出.

有人可以解释为什么会这样吗?当我将它移植到那里时,这个错误也出现在C++中.

PS:pow在检查数字是否是阿姆斯特朗以及是否为回文时,也会弹出此错误.

chq*_*lie 5

问题来自double算术的有限精度.pow(10, count)可以计算为exp(log(10) * count),其可以产生非常接近但与实际整数结果不同的值.如果此值小于数学值,则转换为int不舍入到最接近,它将采用将是前一个整数的整数部分,因此99而不是100.

你应该使用整数算术:

#include <stdio.h>

int main(void) {
    int decimal, binary, digit, pow10;
    printf("Enter the number : ");
    if (scanf("%d", &decimal) == 1) {
        binary = 0;
        pow10 = 1;
        while (decimal > 0) {
            digit = decimal % 2;
            decimal /= 2;
            binary = binary + digit * pow10;
            pow10 *= 10;
        }
        printf("Binary form: %d\n", binary);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的代码中还存在其他一些问题:

  • main没有参数的原型是int main(void).
  • 您应该在输出结尾处打印换行符.
  • 你应该测试的返回值scanf().
  • 您的方法本质上限于下面的整数值2047(使用32位int).

这是一个改进版本:

#include <limits.h>
#include <stdio.h>

int main(void) {
    unsigned long long decimal;
    printf("Enter the number: ");
    if (scanf("%llu", &decimal) == 1) {
        char binary[sizeof(decimal) * CHAR_BIT + 1];
        char *p = binary + sizeof(binary);
        *--p = '\0';
        while (decimal > 1) {
            *--p = '0' + (decimal & 1); // '0' or '1' for all encodings
            decimal >>= 1;
        }
        *--p = '0' + decimal;
        printf("Binary form: %s\n", binary);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)