おまけのコーナー☆☆2進数数値型SC言語 あなたの預金額はただいま10011101100000円です?(ギャグです 笑)

再び場面は トラスト アンド フェイス銀行内の


システム管理室において


カールトン 「どうだ、ソーラー


片付きそうか?」


カールトンが豪快にはなしかけてくる。


ソーラー 「みてくださいよ^^~」


パソコン画面にさらさらとプログラムをうちこむソーラー。


#include <stdio.h>


int main(void)

{

float a;

a=1.05;


printf("あなたの預金額はただいま%f円です。\n",10000*a);

return 0;

}


ソーラー 「コンパイルっ。」


プログラムの実行結果(EAZY IDECの場合)


あなたの預金額はただいま10499.999523円です。


プログラムの実行結果(Visual Studioの場合)


あなたの預金額はただいま10500.000000円です。





ソーラー 「みてください(^^)カールトンさん。


あなたの預金額はただいま10499.999523円です。


と表示されています。(^^)/


大分15000円に近づいてきました。」


カールトン 「うむ。やるな。


いいところまでいっているようじゃないか。」


ソーラー 「(EAZY IDECの場合)


10000*a(a=1.05)は


コンピュータが数値計算する過程の中で


a=1.05でなく


a=1.05に近似されたa=1.0499999のような数値を10000にかけ合わせて


10000*aを計算するため


必然的に


あなたの預金額はただいま10499.999523円です。


となるのです。」


カールトン 「う、うむう ということは・・・」


ソーラー 「つまり、コンピュータのシステムでは


あなたの預金額はただいま10500円です。と表示するのは


む~り~(^^)/なの。わかったかな?


(Visual Studioでは


プログラムの実行結果(Visual Studioの場合)

あなたの預金額はただいま10500.000000円です。


と正しく表示できていますが


原理的には無理なのです


ということは


Visual Studioでは人為的に


あなたの預金額はただいま10500.000000円です。


となるような仕組みがコンパイラに加えられています。)




カールトン 「う、うぐぅ」


普段は精悍な顔つきのカールトンの顔面がひきつっている。


ぐっじょぶC 「ソーラー・・・ここからが見せ所だよ。


ここで!君の芸人魂をみせるんだ!」


ぐっどワークC「ぷぷぷ・・・おもしろくなってきた・・・」


笑いをこらえるぐっどワークC。


ソーラー 「ああっ今日もいいしごとしたなあ~~~


よかった(^^)よかった さあ帰るとするか。


ハウスでポッキーでも食~べよっと。」


カールトン「オオォ ジュ ジュテーム・・・」


カールトン 「う、うう」


ソーラー 「しかし これをうまく切り抜ける方法が


あるんですよ(^^)/」


カールトン 「な、なんと 本当か?」


ソーラー 「とっておきの方法があるんです。


それは・・・」


ぐっじょぶC 「はらはらっ」


ぐっどワークC 「ぷぷっ ソーラー


なにをはじめるのかな・・・・・」


カールトン 「それは・・・」


ソーラー 「今度からお金の単位


いえ


この世のすべての数値の表記法を


10進数から2進数にきりかえるのです。


つまりコンピュータと人間の世界の境をなくすのです。」


カールトン 「なんと?」


ソーラー「つまり


人間界の10進数2円は


コンピュータでも理解できる2進数10円に


10進数4円は2進数100円

10進数8円は2進数1000円

10進数16円は2進数10000円


にするということです。


この新しい基準にした場合


#include <stdio.h>


int main(void)

{

float a;

a=1.05;


printf("あなたの預金額はただいま%f円です。\n",10000*a);

return 0;

}

の10進数数値はすべて2進数に書き直されます。」


カールトン 「???」



ソーラー

「そうですね。すこしずつ10進数から2進数へ


数値変換していきましょうか?


まず


a=1.05は2進数に変換するとa=1.1000011001100110011・・・

(小数点以下6位から無限循環小数になっています。


ここでは小数点12位以下を切り捨てて


a=1.10000110011と近似しましょう。)


10000は2進数10011101100000になります。


これらをいまのプログラムに代入すると


#include <stdio.h>


int main(void)

{

float a;

a=1.10000110011


printf("あなたの預金額はただいま%f円です。\n",10011101100000*a);

return 0;

}


となります。


さらに


新たに自ら創り出した


小数点以下の項をもつ2進数を格納する変数に対応する


変数の型


sfloat


を導入し


🌞🌞

小数点以下の項を含まない2進数を格納する変数に対応する


変数の型


sint   


もかんがえちゃったよん(^^)/)

🌞🌞🌞


今のプログラムのfloatのかわりにsfloatをもちいると


#include <stdio.h>


int main(void)

{

sfloat a; * /<<10進数実数のいれものfloatから2進数実数のいれものsfloatに


入れ替えました/*


a=1.10000110011


printf("あなたの預金額はただいま%f円です。\n",10011101100000*a);

return 0;

}


このように美しい形態にかきかえられます。はあ、はあ。」


興奮してきたソーラー。


カールトン 「???????????」


ソーラー

「さらに10進数実数出力変換指定子%fは


新しい新型2進数実数出力変換指定子%sfに


切り替えるとプログラムは


#include <stdio.h>


int main(void)

{

sfloat a; * /<<10進数実数のいれものfloatから2進数実数のいれものsfloatに


入れ替えました/*


a=1.10000110011;* /<<変数aに2進数数値を代入し初期化しました/*


printf("あなたの預金額はただいま%sf円です。\n",10011101100000*a);


*/10進数実数出力変換指定子%fは


新しい新型2進数実数出力変換指定子%sfに


切り替えました/*

return 0;

}


と この世のものとは思えない荘厳な美しさとなります。


どうです。カールトンさん(^^)」


カールトン 「???どうして 


この新型2進数数値プログラムが10進数数値型プログラム


より優れていると・・・」


ぐっじょぶC 「ソーラー・・・ここまでかんがえていたとは・・・」


ぐっどワークC「ぷぷぷ・・・のってきてるな カールトンさん。」


ソーラー「この新型プログラムの場合


#include <stdio.h>


int main(void)

{

sfloat a;


a=1.10000110011


printf("あなたの預金額はただいま%sf円です。\n",10011101100000*a);


return 0;

}



a=1.10000110011の

1.10000110011


10011101100000*aの

10011101100000


これら2つの数値は


コンパイルされて


コンピュータのメモリにおくりこまれる際


もともと2進数なので10進数から2進数に変換するときのような


数値の近似はおこらず そのままダイレクトに


1.10000110011


10011101100000のまま


そのあるがままの姿で


コンピュータのメモリにおくりこまれ格納されます。


そして


a=1.10000110011と10011101100000がかけあわされて


👇

10011101100000*a=10011101100000*1.10000110011


(aに1.10000110011を代入しました。ソーラーより)


=10011101100000+1001110110000+


10011101.1+1001110.11+1001.11011+100.111011


=101011010101011.000001


でてきた計算結果


101011010101011.000001


を・・・」



カールトン 「?????」


ぐっジョブC 「がんばれソーラー\(^^)/」


ぐっどワークC 「iいiい感じ、ぼけるんだソーラー\(^^)/」


ソーラー


そのまま


printf関数によって


コマンドプロンプト画面に


あなたの預金額はただいま101011010101011.000001円です


と表示するんです!


もうそのまま!


一切の近似なしで!


完璧なんです!」


カールトン 「????????」


ぐっジョブC 「それ、それ、ソーラー\(^^)/」


ぐっどワークC 「ソーラー🌞\(^^)/🌞ソーラー\(^^)🌞」


ソーラー 「そうなんです。このように この世であつかうすべての数値を


2進数であらわすようにすれば


コンピュータのメモリに格納するため


10進数から2進数に変換する際の近似がなくなり


ソースコードに書かれた計算式の結果と


コマンドプロンプト画面で表示される計算式の結果が一致することになります


そう


近似がおこなわれることにより


ソースコードに書かれた計算式の結果と


コマンドプロンプト画面で表示される計算式の結果が


多少違ってくるということはなくなります。」


満面の笑みをたたえながら朗らかにはきはき答えるソーラー。


カールトン 「・・・・・・・・・」


ぐっジョブC 「あと少しだ ソーラー\(^^)/」


ぐっどワークC 「もう一押し ぼけきるんだ ソーラー\(^^)/」


ソーラー

「さらにメリットとしては


10進数から2進数、2進数から10進数


へ変換するという手間が省けるため


さらなるプログラムの高速動作も


確実です。


そして


このように2進数数値を数値の基準にした場合


C言語のシステムもコンパイラも


大分改良が加えられるでしょう


そう・・・


根本的に


もっと簡単で優美なものに・・・・・・・・・・」


うっとり・・・


2進数数値型プログラムの説明を終え


うっとり・・・


余韻に浸るソーラー。


その目は遠くを見つめている。


カールトン 「______________」


ぐっジョブC 「き、きまった・・・や、やりきったか・・・」


ぐっどワークC 「さすがにカールトンさんも


ソーラーにシステム改善をまかせるのはあきらめるだろう・・・」


ぐっジョブC ぐっどワークC 


「わははははははははは\(^^)/」

























#include <stdio.h>


int main(void)

{

sfloat a;


a=1.10000110011


printf("あなたの預金額はただいま%sf円です。\n",10011101100000*a);


return 0;

}



int



sintにならないのか?と思われた方・・・


・・・マニアですね・・・



  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る