みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

浮動小数点について

当方、浮動小数点を勉強しているのですが、
テキストの解説を読んでも理解が出来ません。

正規化とか指数と仮数の意味が分かりません。
そこで質問なのですが、浮動小数点の計算方法を教えて下さい。
IEEE形式の浮動小数点も教えて頂けると助かります。

また、下記の問題について解説して下さい。
数値を16ビットの浮動小数点表示法で表現する。
形式は図に示す通りである。10進数0.375を正規化した表現は、どれか。
ここでの正規化は、仮数部の有効数字よりも上位の0が無くなるように、
指数部を調節する操作である。
(図は添付します)

何故「E」の値が「1111」になるのでしょうか。
お手数ですが、ご教授お願いします。

尚、特に分かり易いホームページがあったら、
そのURLを記載して頂いても結構です。

以上、よろしくお願い致します。

投稿日時 - 2010-11-23 19:56:10

QNo.6339350

困ってます

質問者が選んだベストアンサー

浮動小数点数の考え方について、まず10進数での「指数表記」について説明します。
これは、有効数字を明記するためによく使われる数値表現方法です。

例えば、1234560000 という数値を表現することを考えます。
この数値は123456×10000 と表されます。かけ算の右側は、0が続くだけですから、情報としては0の数だけで表現できます。つまり「123456」と0が「4個」という二つの数値の組で、1234560000 という数値を表現できるのです。
これは、べき乗をつかった式で「123456×10の4乗」(べき乗は、その回数だけかけ算を繰り返す演算で、10の4乗=10×10×10×10=1000です)と表現できます。
あるいは簡潔に「123456×10^4」や「123456E4」といった表記をします。
この「123456」が仮数部で、「4」が指数部になります。

さて、「123.456×10000000」すなわち「123.456×10^7」も、同じ1234560000を表します。
そこで、同じ数値を表す表現が複数あるのは紛らわしいので、表記を統一します。
10進数の指数表記では、仮数部が1以上10未満になる(1の位に数値は入っているが、10の位より上には数値が入らない)ようにします。
これを正規化といい、1234560000を正規化した指数表現で表すと「1.23456×10^9」になります。

小さい数を指数表記表現する場合も考え方は同じです。
例えば、0.00123456の場合は、=1.23456×0.01=1.23456×10^-2となります。(負の乗数はわり算になります。10の-2乗は、1÷10÷10=0.01)

以上が指数表記の考え方です。これを2進数を使って表現するのが「浮動小数点数」です。
たとえば、10進数での100という数値は、2進数では、01100100b になります。
これを、0.1100100b×128 すなわち、0.1100100×2^7 と考えて、「0.1100100b」と「7」という数値の組で表現します。

0.375の場合も、これを2進数で表すと、0.011b です。(0.375=0.250 + 0.125 = 0.01b + 0.001b)
これは、0.011b=0.11000000000b × 2^(-1) (0.11かける2の-1乗)ですので、
浮動小数点で表したときの、仮数M=0.11000000000、指数E=-1になります。
-1を4bitの2の補数表現で表すと、E=1111です。

投稿日時 - 2010-11-23 21:06:49

お礼

ご回答ありがとうございます。

「0.011」を正規化すると「0.110*2^-1」になり、
指数が、べき乗している「-1」すなわち
2進数で「1111」になるんですね。

理解が出来ました。何度も読み直して身に付けたいと思います。

以上、ありがとうございました。

投稿日時 - 2010-11-24 15:32:16

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

実際の世界では「マイナス」という値は存在しません。
-1の定義も「+1すると0になるもの」ということです。
だから「1111」が-1になるのです。これに1足すと
10000なんですが、入れ物は4ビットしかないから、
後方の0000が残るという訳ですね。
指数も正だけなら良かったんですが、あいにく負の
値もあります。そこで、表現可能な値の中点をとって
0とし、それより大きいほうを正、小さい方を負という
具合にしたのです。
問題では指数は4ビットなので、0~15が表現可能な
範囲です。そこで、中間値の8をゼロ点と仮定するなら、
6は-2を表わすことになるという意味です。

コンピュータは足し算しかできません。今でもマイコン
あたりでは引き算(実際は2の補数を足す)までしか
できないものも多いです。
やると面白いのですが足し算と引き算だけで、実数の
計算、特に三角関数や対数のような非線形関数を
作ると、この辺の感性が身に付きます。そこまでは
無理としても実数の乗算、除算を考えるだけでも結構
理解できると思いますよ。

投稿日時 - 2010-11-24 23:23:06

お礼

回答ありがとうございます。

正規化したときの指数が「2^-1」なので、
2の補数表現を利用して「1111」になるんですね。

ご回答ありがとうございました。

投稿日時 - 2010-11-25 00:02:54

ANo.3

指数は、0点を0x3FFにしているということです。
以下に表を書いて見ました

+1023:0x7FE
-- 略 --
+2:0x401
+1:0x400
0:0x3FF
-1:0x3FE
-2:0x3FD
-- 略 --
-1022:0x001

尚、0x7FFはエラー、0x000はゼロを示します。
エラーは負の平方根を求めようとした時などの
戻り値に使ったりします。ゼロは仮数に関わらず
値が0になります。(そう解釈しなければいけない)
つまり、指数=0x000なら仮数≠0でも、0とみなす
ということです。

先の問題では指数が符号付4ビットでしたが、
符号無し4ビット(0~15)だとすると、8をゼロ点と
仮定するなら、-2を表す値は6ということです。

投稿日時 - 2010-11-24 18:32:17

お礼

ご回答ありがとうございます。

「0x3FF」の意味が分かりました。

>先の問題では指数が符号付4ビットでしたが、
>符号無し4ビット(0~15)だとすると、8をゼロ点と
>仮定するなら、-2を表す値は6ということです。

更なる質問で申し訳ないのですが、
上記は、どういう意味なのでしょうか。
宜しければ、ご教授お願い致します。

以上、よろしくお願い致します。

投稿日時 - 2010-11-24 19:01:12

ANo.1

問題の0.375ですけど、2進数表現できますか?
これができないと意味分かりませんよ。
先ず、0.375は0.25(2の-2乗)と0.125(2の-3乗)の
和です。2進数で表現すると、「.011」です。
正規化とは仮数の最上位ビットが1になるようにする
ことなので、このままではダメですね。従って、左に
1回シフトします。すると「.110」となり、最上位の
ビットが1になりました。左1回シフトは2の+1乗なので、
指数部は逆に-1してあげないと値が正しくなりません。
-1はもうお分かりと思いますが「1111」になります。

IEEE規格の浮動小数点ですが、単精度は32ビット、
倍精度は64ビットから成り立っています。倍精度の
場合の最上位ビットから内訳を示しますと以下の通り
です。
(1)1ビット:符号 0なら+、1なら-です。
(2)11ビット:指数で、中間値の0x3FFをゼロ点とし、
  0x400は+1、0x3FEは-1という具合です。
  但し、0x000はゼロですし、0x7FFはエラー値です。
(3)52ビット:仮数です。但し、最上位ビットは常に1と
  仮定するので、これはあるものとして省略します。
  従って、実際の仮数は53ビットと考えます。

先の問題の0.375を考えると、仮数部は最上位ビットは
省略されるので「1000・・・」になります。最上位ビットは
2の-2乗なので、0x3FFをゼロ点とすると、0x3FDという
ことになります。
単精度実数は指数部と仮数部のビット数がそれぞれ
8、23になっているだけで、原理は同じです。

投稿日時 - 2010-11-23 20:43:53

お礼

ご回答ありがとうございます。

「IEEE」浮動小数点表示をすると、
例えば「1.100」の場合は「100」になるんですね。
そこに移動した桁数を掛ければ答えが出るんですね。

ちょっと書き部分については理解が出来ませんでした。
「最上位ビットは2の-2乗なので、0x3FFをゼロ点とすると、0x3FDということになります。」

出来ましたら解説をして頂けると助かります。

以上、よろしくお願い致します。

投稿日時 - 2010-11-24 15:39:02

あなたにオススメの質問