「%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位を


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


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


なあっソーラー」


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


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


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


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


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


苦しみだすマックス。


マックス


「俺はあああ・・・


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


ま、まあ とにかく


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


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


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


%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);

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になっている可能性があります。


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


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


#include <stdio.h>


int main(void)

{

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

return 0;

}


コンパイル結果

5620515557.1150002


この

コンパイル結果

5620515557.1150002

100000000


で割れば


562.05155571150002


となり


この結果により


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



このコンパイル結果で


四捨五入により


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



コンパイル結果は

5620515557.1150002


本当の計算結果は


5620515557.1150001876・・


なのかもしれないものが


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


5620515557.1150002


とコンパイル結果に表示されているかもしれないわけです


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


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


5620515557.115000


正確な値なので


コンパイル結果

5620515557.1150002

100000000


で割った


562.05155571150002


から


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


よいのですね。





                       solarplexussより

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

作者を応援しよう!

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

応援したユーザー

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