#pragma twice

KAB-studio > プログラミング > #pragma twice > 230 Version 12.07 浮動小数点のまとめ

#pragma twice 230 Version 12.07 浮動小数点のまとめ

前のページへ 表紙・目次へ 次のページへ

 Version 12.07
浮動小数点のまとめ

では、ここまでをまとめます
かなり複雑だったものね……
まず、 VC では実数、つまり小数点付きの数を〈浮動小数点〉って呼びま

小数点がずれる、ってことね
そう。小数点を固定した【仮数部】と、小数点をずらす数【指数部】のふ
たつで実数を表す方法が、浮動小数点

仮数部:
 小数点を取り除いた数。
指数部:
 小数点の位置を示す数。

計算だと、仮数部の方が重要だから別にする、ってことでいいんだよね
それもあるし、この方法ならすごく大きな数や小さな数も表せるからね。
小数点が固定だと桁数が決まっちゃうから
 int とかそうだもんね
で、浮動小数点を入れられる型は、 VC だと double と float がありま

 double は float の倍入るんだよね
倍、ってのは微妙に違うかも。確かに float は 4 バイト、 double は
8 バイトだけど、中のビットは違うんです

float
 仮数部: 23 ビット
 指数部: 8  ビット

double
 仮数部: 52 ビット
 指数部: 11 ビット

あ、指数部はそんなに増えてなくて、仮数部がだいぶ増えてるね
 float の指数部は 8 ビット= 1 バイト。 1 バイトってことは整数で考
えると char と同じ。ってことは 0 から 255、つまり float の指数部は 
2 の 255 乗まで使えます
んー、じゃあ double だと 11 ビット……って、きれいにいかないね
 Version 4.03 ( No.053 ) で説明したでしょ、 2 を掛けていけばいいん
だから。というか 2 の 11 乗すればいいから
あ、そっか……ってことは 2048 ? あ、 0 からだから 2047 か
そう。つまり 3 ビット増えただけでそれだけ増えるし、指数はそれだけ
あれば十分だから
その分仮数部に割いてるわけね
そういうこと。あと、上のには書いてないけど、最初のビットは正負のフ
ラグ
これは両方とも同じね
で、その後ろに指数部が来て、その後ろに仮数部。これで浮動小数点を表
してるわけです
……でもさ、なんか説明聞いた感じだと、浮動小数点〜って感じじゃない
かも
確かに10進数とは違うからね、浮動小数点って言葉にそれほどこだわら
ない方がいいかも。前々回に見たように〈小数点のずれ〉を表すのは指数部
なんだけど、この指数部が 2 の乗数だから

...
0111111 1101 :  2 の -2 乗 :  0.25
0111111 1110 :  2 の -1 乗 :  0.5
0111111 1111 :  2 の  0 乗 :  1.0
1000000 0000 :  2 の  1 乗 :  2.0
1000000 0001 :  2 の  2 乗 :  4.0
1000000 0010 :  2 の  3 乗 :  8.0
1000000 0011 :  2 の  4 乗 : 16.0
...

って感じに変わられても
小数点が移動してるって感じ、しないね……
このあたりが、 Version 12.04 ( No.227 ) で〈これから説明するのは簡
単な概念で、正確な内容じゃないから〉って言った理由
 10 の乗数とはえらい違いだものね
ただ、根本的な考え方は同じ。 2 進数の時にはちゃんと小数点が動いて
るわけだから
……でもイメージできない
あ、限定的にならできるよ。 1 以上の整数に限れば

0111111 1111 :  2 の  0 乗 :  1.0 : 0001
1000000 0000 :  2 の  1 乗 :  2.0 : 0010
1000000 0001 :  2 の  2 乗 :  4.0 : 0100
1000000 0010 :  2 の  3 乗 :  8.0 : 1000

お、ずれてるずれてる!
指数部は2進数でのこのずれを表してる、ってところかな
で、仮数部はその間を、ってことね
そう。たとえば 2.0 と 4.0 の間は

0000 00000000 2.0000000
0100 00000000 2.5000000
1000 00000000 3.0000000
1100 00000000 3.5000000
0000 00000000 4.0000000

 1/2 や 1/4 を足して、間の数を作っていくんだよね
だから、きっちりした間じゃない微妙な数は正確には表せません。たとえ
ば、 2.0 から 3.0 の方に近づいて近づく値

0000 00000000  2.0000000
0000 00010000  2.0078125
0000 00100000  2.0156250
0000 01000000  2.0312500
0000 10000000  2.0625000
0001 00000000  2.1250000
0010 00000000  2.2500000
0100 00000000  2.5000000
1000 00000000  3.0000000

仮数部のビットが右の方に行くと、かなり細かい数字になっちゃうね
仮数部は、こういう数字を足し合わせて作るから、たとえば 2.1 とかは
……それってすごく難しくない?
そう。仮数部が、たとえば 000 11000000 なら、  
0.0312500 + 0.0625000 = 0.09375 、これだと 2.1 までもう少し足さない
といけないから
つまり、他のビット立てて 0.00625 って数字を作らなきゃいけない……
作れるの?
作れないから、誤差が出るってこと
あー、そうなるんだよね
ただ、これは小数の話。整数を表すときには絶対に誤差はないから。たと
えば 128 から 192 = 128 と 256 の間の数までの場合

0000 00000000 128.0000000
0000 00100000 129.0000000
0000 01000000 130.0000000
0000 10000000 132.0000000
0001 00000000 136.0000000
0010 00000000 144.0000000
0100 00000000 160.0000000
1000 00000000 192.0000000

さっきと仮数部のビットが同じだけど、全部整数なんだね
指数部で表す数の【間にある整数】は、こうやって絶対に仮数部で表せま
す。指数部が 2 の乗数で、仮数部は 2 の分数だからね
そか、両方とも 2 ……2進数の世界って感じだね
そこがイメージの難しいところかもね。10進数に置き換えて考えるより
も、2進数で直感的に解るようになる方がいいかもね
そんなことできんの?
 0101 は?
 4 + 1 で 5 
っていうふうにできればいいと思うよ
……できるのかな
たぶん必要ないと思う
……へ?
 int とかの整数に比べて、 double や float を直に見て計算するってこ
とはまずないと思うよ。デバッグモードで見てもバイト単位だから

double
 仮数部: 52 ビット
 指数部: 11 ビット

を見ればわかるように、指数部と仮数部の間は同じバイトに入っちゃうか

げ……普通に見てもわかんないね
しかもバイトオーダーもあるから
逆に見なきゃいけない……
ビットフラグとかに使うこともないから、ビットと実際の数字との変換は
できなくてもいいんじゃないかな
……じゃあさ、今回の浮動小数点講座って、なんの意味があったの?
一番の目的は、誤差の説明
うん、誤差の原因はわかったけど
そうじゃなくて、火美ちゃんが説明できるように、ってこと
へ?
たとえば、計算に double を使いました。誤差が出ました、なんで? 
っていう時に〈 double だから誤差が出る〉じゃダメでしょ
その理由もわからなきゃいけない、説明できなきゃいけない
そういうこと。どういう場合に誤差が出て、どういう場合には誤差は出な
いのか、っていうことを把握するためには仕組みからわかってないと
確かにそうかも……
本当は、誤差が出る場合の代替案とかも出せなきゃいけないんだけど、 VC 
だとちょっと難しいからね
誤差が出ない方法なんてあるの?
1桁ずつ char で管理するとか
文字列ってこと?
それに近いかも。方法はいくらでもあるけど、実際に作るのは難しいから
ね。それと、浮動小数点の仕組みについて見てもらったもうひとつの理由
は、いろんな仕組みがあるってことをわかってもらいたかったから
いろんな仕組み?
どんな数字も int みたいになってるってイメージ、持ってなかった?
持ってた。 int に小数点が付いてるみたいな
でも実際にはそうじゃないってこと。文字コードみたいに、ひとつの表現
に対していろんな仕組みがあるのがコンピューターの世界
……それって全部知らないとだめ?
駄目ってことはないけど、知っていればそれだけ応用できるから
……いろんな戦術を知ってればいろんな場面に対処できる、ってこと?
そういうことになるね。そういう幅の広さも重要ってこと
ちょっと大変そうだけど……
ま、それは少しずつ憶えていけばいいから。最後に、浮動小数点のリファ
レンスについて。 MSDN なら【IEEE 浮動小数点表現と Microsoft 言語】
ってページに書いてあるから
あ、ホントだ
このタイトルにあるように、 VC の浮動小数点は IEEE っていう組織が定
めたものになってます
 IEEE って、ケーブルとかコネクタとかにあるよね
そう、あの IEEE 。共通規格だから他のプログラミング言語でも使えると
思うから、今回のは憶えておいて損はないと思うよ

/*
    Preview Next Story!
*/
たぶん

見えれば、難しくないと思う
ビットとか?
そう。ポインタとかもメモリ直接見れたし
そういえばそうかも
……
というわけで次回
< Version 12.08 TEXT と BYNARY >
につづく!
どしたの?
んー……なんでもない
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。