1989年開業 情報工学部門 文部科学省登録番号 第22082号 公益社団法人日本技術士会会員 東大阪商工会議所会員

≫サンプルプログラム一覧 

オープンソース/C言語サンプルプログラム 10進数→2進数変換(小数・筆算)

●10進数の小数を入力すると、筆算で2進数の小数に変換し、表示する
 プログラムです。
●2進数小数の位取りは、0.5, 0.25, 0.125, 0.0625, … です。
●0.5で割っていくことにより、「その位」の数があるかないか求める
 ことができます。例えば、0.5で2回割ったとき整数部が1になれば、
 「0.25の位」があるということです。
●整数部は0か1にしかなりません。1より小さい数を0.5で割っても
 (つまり2倍しても)、2には届かないからです。
●0.5で割っていく操作は、2を掛けていく操作と同じ結果になります。
 ≫ソースファイルのダウンロード: binary052.c
【問題】
●0.5や0.25など計算しやすい数で、手計算した結果と比較してみよう。
●0.1を入力して、循環する様子を確認してみよう。
●割り切れないと見なす回数を32回以上にして、計算誤差が発生する
 様子を確認してみよう。
●この筆算で2進数が求まる仕組みを説明しなさい。
●0や負数を入力しても、正しく結果を表示するように改造してみよう。

/****************************************/
/*  10進数→2進数変換(小数・筆算)  */
/****************************************/
#include <stdio.h>
#include <stdlib.h>
void  main( )
{
    char    c[128],c1[128];
    double  dn;
    int     m,i,j;

    printf("\n***10進数の小数を2進数に変換します***");
    printf("\n10進数: 0."); fflush(stdout);
    gets(c1);                          // 文字列を入力
    sprintf(c,"0.%s",c1);              // 小数の文字列に
    dn=atof(c);                        // 実数値に変換

    printf("\n 0.5 )  %f\n",dn);

    for( i=0; dn>0.0; i++ )            // dn>0 のとき繰り返す
      {
        printf("     -----------\n");
        m=(int)(dn/0.5);               // 0.5で割った整数部
        dn=dn/0.5-(double)m;           // 0.5で割った小数部
        printf(" 0.5 )  %f + %d\n",dn,m);
        c[i]=m+'0';                    // 文字1桁格納

        if ( i>32 ) break;             // 割り切れないと見なす
      }

    printf("\n答 0.");
    for( j=0; j<i; j++ )               // 大きい位から表示
      { printf("%c",c[j]); }
    printf("\n");
}
   

※SSL暗号化通信対応

佐伯英子技術士事務所 〒542-0073 大阪市中央区日本橋 1-14-13 サンオフィス日本橋601  E-mail: info@saeki-pe.com