double型について教えてください。
前回の質問で、仮数部の箇所で確認があります。
実験コードを作っていみました。
mac os 64bitです。
C++
1#include<iostream> 2#include<math.h> 3 4int main(){ 5 double x = 1.7320508075688774152212090484681539237499237060546875; 6 int exp; 7 8 double k = frexp(x, &exp); 9 10 printf("%1.80lf = \n%1.80lf x 2 ^ %05d\n", x, k, exp); 11 return 0; 12}
結果は以下のようになりました。
1.73205080756887741522120904846815392374992370605468750000000000000000000000000000 = 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桁を超えるような値を直接入れている今回の状況は・・・オーバーフロー起きてしまっているんでしょうか?
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/06 08:52
2017/03/06 08:54
2017/03/06 11:40
2017/03/06 14:55
2017/04/05 05:07