「%f出力変換指定子の小数点以下6位までしか計算結果を表示しない」 というしばりから離れてさらに小さな小数点以下の位の数をもとめる


「%f出力変換指定子の小数点以下6位までしか計算結果を表示しない」 というしばりから離れてさらに小さな小数点以下の位の数をもとめる




マックス 「まあ、13.0割る3.0と


割る数、割られる数がdouble型におさめられる場合でも


int型の場合のように


いいアイデアあるうぅんだよ ソーラーよ」


ソーラー 「ほ、ほう?」


マックス 「まあ、さきほどのエピソードでもみたように


13.0割る3.0を足し算でのみ計算していくと


4.33333333・・・・となっていく。


計算結果も整数型(int型)におさめられる


13÷3なら答え4で計算終わり。と


コンピューターのまねをすればよいのだが


13.0÷(割る)3.0のように


計算結果も実数型(double型)におさめられる場合では


計算結果は整数値4で終わり。は ちょ~っとまずいか?ははは。


まあ、すこしは小数点以下も計算したものを整数4にひっつけて


結果としてかかないといけないか・・


でも、でもぉ


まともに計算していけば4.33333333・・・・・・・ときりがない。


おおっ、そうだ


4.33とか4.33333(4.33から4.33333と小数点以下のくらいを3桁増やしてみました)


これでなんとかしてもらおっ


ほらほら いいじゃないか。


ふふふ


ようは割り算を足し算のみであらわして


計算していく場合


どこらへんで計算をやめるか?


そこで!!!」


ソーラー 「???」


アレサ 「どきどき」


マックス「そこで登場してくるのが%f出力変換指定子だああああああああっ」


ソーラー 「?????はいっ?」


アレサ 「はらはら」


マックス 「%f出力変換指定子では計算結果を出力するとき


1.434566

123.567897

1222226.879066


などのように小数点以下6位までしか計算結果を表示しない


コンピューターにとって便利なシステムぅ~


なので


コンピュータですら小数点以下6位までしか計算結果を表示しないので



『俺たちが実数型同士の割り算を足し算のみで実行していく場合は


小数点以下7位まで足し算のみで求め、次に小数点以下7位を


四捨五入すればよいのだ』


ようは


小数点以下6位までの値


それでゆるしてもらおっ!


なあっソーラー」


アレサ 「許します(^^)」


ソーラー「あの~最初から思ってたんですが


そんな計算、どこでも好きなところで


やめたらいいんじゃないですか(^^)」


マックス「うぐう、ううぉぉおお、うむ、うむぅううう」


苦しみだすマックス。


マックス


「俺はあああ・・・


俺はああ・・ちょっとおしゃべりしたかっただよ~


ま、まあ とにかく


つまり計算を有限回で終わらせるんだ~。


えんえんと計算しなくてもいいんん、


いや~めでたし、めでたし。


%f出力変換指定子は小数点以下6位までしか計算結果を表示しない


のだから、我々もそれ以上の桁数を計算しなくてOK///


完璧だろ、ソーラー」


ソーラー「??んん?????おおっ?? もしや??


逆に言えば、%f出力変換指定子をつかう


コンピューターの方式では


小数点以下6位までしか計算結果を表示しない


つまり


割り算を行っても


小数点以下6位までしか計算できないが


割り算を足し算の組み合わせで計算する方法なら


%f出力変換指定子の小数点以下6位までしか計算結果を表示しない


というしばりから離れて


小数点以下何桁でも計算し計算結果を表示できそうですね。」


マックス 「おおっ 驚いた、冴えてるじゃないか


何か知らんけど・・・いつのまにか・・


おしゃべりしているうちに


小数点以下何桁まででも計算できるようになったィィィィィ・・・


つまりコンピュータの通常の(割り算の計算結果)では表示できない


小数点以下XX桁のめっちゃめっちゃ桁数の多い答え(割り算の計算結果)を


自分たちで新たにプログラムをくんで


計算かつ表示できる・・・と


割り算を足し算のみで計算する方法、これは意外と優れた方法じゃないか?」


アレサ 「冴え、冴え(^^)/」


ソーラー 「ぉぉぉおおおお・・・」


マックス 「ソーラーさん、どうされましたの?」


ソーラー 「ぉぉぉおおおおっ


ひらめいたあああ・・・ということは


『コンピューターが小数点以下6桁までしか計算結果を表示しない』


というのも理にかなっているということになってるかもぉ」


マックス 「えっ、なんで」


ソーラー 「それは、そういうふうに


計算プログラムを組めるのなら


そういうハードなひとには自分で自由にプログラムを組んで


いくらでも小数点以下の位を


計算してもらえばいいってことになるんですよ。


そして 一般の方々はそんなに小さな小数点以下の位は必要ないよね。


そこで開発者の方は


通常は「小数点以下6桁までしか計算結果を表示しない」


ように設定しておいたんですよ。」


マックス 「な、なんだってぇぇぇぇぇぇ!!!」


アレサ 「!!」


マックス 「いっ一部のどうでもいい人って、俺たちのことかぁぁぁぁぁぁぁぁぁ」


マックス 「おおおおおおおおおおおおおぉぉっぉぉぉおっぉぉんんん」


ソーラー 「おおおおおおおぉぉぉぉぉぉぉぉぉぉんんんんんんんんん」







え~


#include <stdio.h>


int main(void)

{

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

return 0;

}


プログラムの実行結果

562.051556


このように プログラムの実行結果は小数点以下6桁までしか表示されません。


では 小数点以下8桁目がどうなっているかを知りたければどうしたらよいのでしょうか?


次のプログラムをご覧ください


#include <stdio.h>


int main(void)

{

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

//🌞👆ここに注目 10000をかけあわせています

return 0;

}


プログラムの実行結果

5620515.557115


このように 割り算


1686.1546671345/3.0


を10000倍しておいて


得られたプログラムの実行結果


5620515.557115



10000で割れば


562.0515557115


となり


小数点以下 8桁目は1になっているのがわかります。


前のプログラムの

プログラムの実行結果

562.051556


10000倍したプログラムの

プログラムの実行結果

5620515.557115

10000で割った


562.0515557115


をくらべてみると


前のプログラムでは小数点以下7桁目の7を四捨五入して


小数点以下6桁目を

6にしているのがわかります。


ですから


小数点以下10桁目がどうなっているかを知りたいとき


いままでのように 割り算1686.1546671345/3.0を10000倍してしまうと


#include <stdio.h>


int main(void)

{

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

return 0;

}


プログラムの実行結果

5620515.557115


プログラムの実行結果

5620515.557115

を10000で割った


562.0515557115から


小数点以下10桁目は5と予想されるのですが


プログラムの実行結果

5620515.557115は


小数点以下11桁目を四捨五入して5になっている可能性があります。


本当は


計算結果は


5620515.55711477356・・・・・・・


のように


小数点以下10桁目が4で

小数点以下11桁目が7となっていて


小数点以下10桁目が


小数点以下11桁目を四捨五入して5になっている可能性があります。



そこで 正確に小数点以下10桁目を知るためには


多めに100000000などをかけておく必要があります。


#include <stdio.h>


int main(void)

{

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

return 0;

}


プログラムの実行結果

56205155571.150002


この

プログラムの実行結果

56205155571.150002

100000000


で割れば


562.05155571150002


となり


この結果により


小数点以下10桁目は正確に5となっているのがわかります。



このプログラムの実行結果で


四捨五入により


近似されている可能性のある数値は小数点以下6位の2のみです



ようは


一番下の小数点以下6位の数値は四捨五入されて1大きい値になっている可能性があるわけです



プログラムの実行結果は

56205155571.150002


となっていても


本当の計算結果は


56205155571.150001876・・


なのかもしれず


小数点以下7位の8が四捨五入されて


56205155571.150002


とプログラムの実行結果に表示されているかもしれないわけです


ですが近似がおこなわれていても


小数点以下6位の2以外の部分


小数点以下5位までの部分


56205155571.15000


正確な値なので


プログラムの実行結果

56205155571.150002

100000000


で割った


562.05155571150002


から


小数点以下10桁目の値5をもとめた場合


その値は


正しい


小数点以下10桁目の値となるのです





                       solarplexussより

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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