c用于二进制到十进制转换的程序

时间:2013-07-20 19:23:36

标签: c

请帮我解决以下程序中的错误。我没有得到小数部分的正确输出。 提前致谢

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

main()
{
    int p,i,j,t,x;
    float n,sum,d;

    printf("enter the binary number");
    scanf("%f",&n);

    p=(int)n;
    d=n-p;

    i=0;
    while(p>0)
    {
        t=p%10;
        sum=sum+t*pow(2,i);
        p=p/10;
        i=i+1;
    }

    i=1;
    while(d>0.0)
    {
        d=d*10;
        x=(int)d;
        sum=sum+x*pow(2,-i);
        d=d-x;
        i=i+1;
    }

    printf("decimal value is %f",sum);
    getch();
}

2 个答案:

答案 0 :(得分:2)

你的问题是你在使用int时使用float并且你没有初始化任何变量。将float更改为int并将变量初始化为0,您的代码就可以使用。

您的代码无效的原因是sum未初始化。当您使用sum = sum + t * pow (2, i)时,您将在第一次使用时为结果添加任意数字。 sum在初始化之前可以是任何内容(即-1241232)。

即使真正需要初始化的唯一变量是sumdi,最好还是初始化它们(比安慰更好)。实际上,初始化变量是导致错误的常见原因。初始化一切。

浮点数据类型也会在第二个循环中导致代码出现问题。当用户输入浮点数(如110.1101)时,它将近似为另一个数字(即110.110098) - 这与浮点数据类型的限制有关。 在第二个循环中,输入近似为110.1100998,问题是由此语句引起的:

sum = sum + x * pow (2.0f, -i);

因为x在整个循环中不是10(有时是98等)。更重要的是,循环不只迭代4次(1101),它还有更多。这是因为这句话:

d = d * 10;

d乘以10后,它会从0.100998变为大约1.00979 - 而不是1.00998 就像你期望的那样。当您输入的值比单个数字更精确时,这两个差异就会导致您的结果出错。

最后,这里有一些工作代码:

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

int main (){

    int p = 0, i = 0, j = 0, t = 0, x = 0;
    float n = 0.0f, sum = 0.0f, d = 0.0f;

    printf("enter the binary number: ");
    scanf("%f", &n);

    p = n;
    d = n - p;

    while (p > 0){ // never use the float datatype for iteration
        t = p % 10;
        sum = sum + t * pow (2.0f,i);
        p = p / 10;
        i = i + 1;
    }

    i = 1;

    while (d > 0.00001){
        d = d * 10;
        x = d;
        sum = sum + x * pow (2.0f, -i);
        d = d - x;
        i = i + 1;
    }

    printf ("decimal value is %f\n", sum);
    getchar ();
    return 0;
}

答案 1 :(得分:1)

我假设您期望输入[01.]*形式,但约束只有一个小数点。您正在读取此输入,如常规浮点数,但将其十进制数字解释为二进制数字并计算小数值。

main()应声明为int main ()getch()不是标准的C呼叫。您可以使用getchar()

由于sum未初始化为0,您可能会收到疯狂的输出。

计算小数项时,必须记住浮点表示是二进制的,并非所有十进制数都具有精确的表示。所以你需要进行舍入。此外,您正在检查d>0作为第二个循环的停止条件,但浮点比较比这更棘手。您可以阅读this answer以获得有关它为何棘手的完整说明,但您基本上应该这样做:

    float err=.000001;
    while(d>err)
    {
        d=d*10;
        err=err*10;
        x=(int)(d+.5);
        /*...*/

通过将输入作为字符串读取并解析,可以减少代码的浮点复杂性。

    char *n;
    char p[INPUT_MAX];
    char d[INPUT_MAX];
    char input[INPUT_MAX];
    float sum, p_sum = 0, d_sum = 0;
    int i;
    printf("enter the binary number: ");
    if (fgets(input, sizeof(input), stdin) == 0) {
        puts("no input!");
        exit(0);
    }
    n = strchr(input, '.');
    if (sscanf(input, "%[01]", p) == 1) {
        for (i = 0; p[i] != '\0'; ++i) {
            p_sum = 2*p_sum + (p[i] - '0');
        }
    }
    if (sscanf(n, ".%[01]", d) == 1) {
        for (i = strlen(d); i > 0; --i) {
            d_sum = (d_sum + (d[i-1] - '0'))/2;
        }
    }
    sum = p_sum + d_sum;
    printf("decimal value is %f\n",sum);
相关问题