• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:浮動小数点について)

浮動小数点の計算方法と正規化

このQ&Aのポイント
  • 浮動小数点の計算方法と正規化について解説します。IEEE形式の浮動小数点も紹介します。
  • 16ビットの浮動小数点表示法での数値表現についても解説します。正規化の操作についても説明します。
  • 「E」の値が「1111」になる理由についても説明します。わかりやすいホームページも紹介します。

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

浮動小数点数の考え方について、まず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です。

wwmomo
質問者

お礼

ご回答ありがとうございます。 「0.011」を正規化すると「0.110*2^-1」になり、 指数が、べき乗している「-1」すなわち 2進数で「1111」になるんですね。 理解が出来ました。何度も読み直して身に付けたいと思います。 以上、ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.4

実際の世界では「マイナス」という値は存在しません。 -1の定義も「+1すると0になるもの」ということです。 だから「1111」が-1になるのです。これに1足すと 10000なんですが、入れ物は4ビットしかないから、 後方の0000が残るという訳ですね。 指数も正だけなら良かったんですが、あいにく負の 値もあります。そこで、表現可能な値の中点をとって 0とし、それより大きいほうを正、小さい方を負という 具合にしたのです。 問題では指数は4ビットなので、0~15が表現可能な 範囲です。そこで、中間値の8をゼロ点と仮定するなら、 6は-2を表わすことになるという意味です。 コンピュータは足し算しかできません。今でもマイコン あたりでは引き算(実際は2の補数を足す)までしか できないものも多いです。 やると面白いのですが足し算と引き算だけで、実数の 計算、特に三角関数や対数のような非線形関数を 作ると、この辺の感性が身に付きます。そこまでは 無理としても実数の乗算、除算を考えるだけでも結構 理解できると思いますよ。

wwmomo
質問者

お礼

回答ありがとうございます。 正規化したときの指数が「2^-1」なので、 2の補数表現を利用して「1111」になるんですね。 ご回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.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ということです。

wwmomo
質問者

お礼

ご回答ありがとうございます。 「0x3FF」の意味が分かりました。 >先の問題では指数が符号付4ビットでしたが、 >符号無し4ビット(0~15)だとすると、8をゼロ点と >仮定するなら、-2を表す値は6ということです。 更なる質問で申し訳ないのですが、 上記は、どういう意味なのでしょうか。 宜しければ、ご教授お願い致します。 以上、よろしくお願い致します。

すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.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になっているだけで、原理は同じです。

wwmomo
質問者

お礼

ご回答ありがとうございます。 「IEEE」浮動小数点表示をすると、 例えば「1.100」の場合は「100」になるんですね。 そこに移動した桁数を掛ければ答えが出るんですね。 ちょっと書き部分については理解が出来ませんでした。 「最上位ビットは2の-2乗なので、0x3FFをゼロ点とすると、0x3FDということになります。」 出来ましたら解説をして頂けると助かります。 以上、よろしくお願い致します。

すると、全ての回答が全文表示されます。

関連するQ&A