質問: 0.86602540378443870761060452423407696187496185302734375000000000000000000000000000 x 2 ^ 00001 ``` 仮数部が15桁(53桁)であれば、上記のような結果がそのまま格納されていれば、オーバーフローになっているような気がします。 上記のような仮数部が全てdouble型の中に入っているわけではないですよね?? > > 小数点以下の数値の場合、2で割り切れないので無駄に桁が増えます。 > > 1ビットで1/2を表現できますね。0.5です。 > > 2ビットなら1/4で0.25です。 > > 3ビットなら1/8で0.125、4ビットなら1/16で0.0625ですね。 > > 4ビットは10進数1桁ちょっとです。 > > > コンピュータはどうやって2進数から10進数に変換しているのですか? ここによりますと、 > > PCに使われているCPUは、直接10進数を扱うことは出来ません。 > > 外部に出力するとき、サブルーチンで10進数に変換するのです > > > との事ですが、つまり**2進数では53桁までがdouble型に格納されていて、10進数に変換される時(外部に出力される時)に余分な桁が付いてくる**という理解で正しいでしょうか?? この余分な桁はdouble型の中には入っていないということですよね? つまり、余分な桁数はdouble型に相当するメモリ領域の中には、存在しないということでよろしいでしょうか? 私の理解が間違っていたらご指摘をお願いします。 > > [追記] > > > 前回の質問と状況が少し違うような気がしてきました。 漸化式でdouble型の中に値を格納している場合は**10進数に変換される時に余分な桁が付いてくるもの**だと考えていますが、今回の質問では「double型の中に直接値を代入している」という点で違いが出てきています。 仮数部が15桁を超えるような値を直接入れている今回の状況は・・・オーバーフロー起きてしまっているんでしょうか?
回答: こんにちは。 > > つまり2進数では53桁までがdouble型に格納されていて、10進数に変換される時(外部に出力される時)に余分な桁が付いてくるという理解で正しいでしょうか?? > > > そのように解釈しても間違いではないと思いますが、正確でもありません。 > > この余分な桁はdouble型の中には入っていないということですよね? > > > いえ、違います。 例えば、2進数で0.0000から0.1111までに存在する2進数の数値の数は全部で16個ですね。(値が変化するのは4ビットですから。) 2進数の0.0000は10進数でも0です。 2進数の0.1111は10進数では1.0弱です。(2進数の0.0001を加えたら1.0ですから) つまり、0.0~1.0の間を16等分してそれぞれに値を割り当てたものとなります。 この小数点下4桁の2進数で表現できる10進数の精度は何桁でしょうか? 10進数では0~1.0弱を10個の数値で表現し、それを1桁と呼びます。 ならば、0~1.0弱を16個の数値で表現した場合は、えいやっと1.6桁でも良いのでは? これは4桁には全く届きません。でも、10進数で表現すると小数点下4桁になります。 10進数で小数点下4桁の場合、数値と数値の間は10進数で0.0001離れています。 2進数で小数点下4桁の場合、数値と数値の間は2進数で0.0001離れています。 2進数の0.0001は10進数で0.0625です。0.0001に比べると遥かに大きいです。まばらなのです。 分かりにくいですね。うまく伝えられなかったら、ごめんなさい。 なかなか説明が難しいです。