-6

次のプログラムのエラーを整理するのを手伝ってください。小数部分の正しい出力が得られません。前もって感謝します

#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();
}
4

2 に答える 2

1

[01.]*小数点が 1 つしかないという制約のあるフォームの入力を期待していると思います。この入力を通常の浮動小数点数のように読み取りますが、10 進数を 2 進数として解釈し、10 進数値を計算します。

main()宣言する必要がありますint main ()getch()標準の C 呼び出しではありません。使用できますgetchar()

sumに初期化されていないため、おそらくクレイジーな出力が得られます0

分数項を計算するときは、浮動小数点表現は 2 進数であり、すべての 10 進数が正確に表現されるわけではないことに注意する必要があります。したがって、丸めを実行する必要があります。d>0また、 2 番目のループの停止条件としてチェックしていますが、浮動小数点の比較はそれよりもトリッキーです。なぜトリッキーなのかについての完全な説明については、この回答を読むことができますが、基本的には次のようにする必要があります。

    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);
于 2013-07-20T19:50:47.333 に答える