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
|