天国にいけるC言語入門 シーズン1 パソコン超初心者がゼロから東方風シューティングをつくる編 ver.0.4.15.789 RELIEF
おまけのコーナー☆☆2進数数値型SC言語 あなたの預金額はただいま10011101100000円です?(ギャグです 笑)
おまけのコーナー☆☆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にならないのか?と思われた方・・・
・・・マニアですね・・・
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます