「%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より
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます