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

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

浮動小数点について

当方、浮動小数点を勉強しているのですが、 テキストの解説を読んでも理解が出来ません。 正規化とか指数と仮数の意味が分かりません。 そこで質問なのですが、浮動小数点の計算方法を教えて下さい。 IEEE形式の浮動小数点も教えて頂けると助かります。 また、下記の問題について解説して下さい。 数値を16ビットの浮動小数点表示法で表現する。 形式は図に示す通りである。10進数0.375を正規化した表現は、どれか。 ここでの正規化は、仮数部の有効数字よりも上位の0が無くなるように、 指数部を調節する操作である。 (図は添付します) 何故「E」の値が「1111」になるのでしょうか。 お手数ですが、ご教授お願いします。 尚、特に分かり易いホームページがあったら、 そのURLを記載して頂いても結構です。 以上、よろしくお願い致します。

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

  • ベストアンサー
  • 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/1415)
回答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/1415)
回答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/1415)
回答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

  • 32ビットの浮動小数点について

    32ビットの浮動小数点(符号1ビット指数8ビット仮数23ビット)で非正規表現をもとめるには例えば(符号0指数0仮数1.01101)はどういう計算をすれば良いのでしょうか?

  • 浮動小数点の表現(基本情報)

    数値を16ビットの浮動小数点表示法で表現する。形式は図に示すとおりである。10進数0.375を正規化した表現はどれか。ここでの正規化は,仮数部の有効数字よりも上位の0がなくなるように指数部を調節する操作である。(H9 秋 問13) S(1ビット):仮数部の符号(正は0,負は1) E(4ビット):2のべき乗の指数部で,負数は2の補数 M(11ビット):仮数部の絶対値 【参考にしたサイト】 http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/fudo.htm 【質問】 Eは、負数は2の補数とありますが、Eの先頭1ビットは符号を表すのでしょうか? 手持ちの参考書にも同じような説明があったのですが、先頭が符号なのか分かりませんでした。IEEE754では、指数にE-127を使っているので、非負、負の表現は出来る事は分かりました。しかし、上記の場合は、非負、負の判断はEにも符号ビットがないと出来ないように思い質問しました。回答宜しくお願い致します。

  • IEEE754 浮動小数点の問題

    -10.375(10進数)をIEEE754規格の単精度浮動小数点表現のビット列で示せ。という問題で、 ・仮数部の符号ビットが1bitで指数部が8bitで仮数部が23bitで合計32bitでいいんですよね?本によって割り当てが違うんですけど。 ・僕自身この問題を解いた結果、1 10000010 0100110・・・0 (一番前が、符号bit。真中が指数bit。一番後ろが仮数bit) で合っていますか?答え合わせのほどを。 どうか、願いします。

  • 浮動小数点数について

    現在情報処理の勉強をしているのですが、下記の問題が解けません。。 もし、わかりすく教えてもらえれば,,,と思い、、、 ↓ 数値を16ビットの浮動小数点数で表現する。10進数0.375を正規化した表現を、2進数であらわすとどうなるか求めよ。ここでの正規化は仮数部の有効数字よりも上位の0がなくなるように指数部を調整する操作である。 仮数部の符号(正は0 負は1)(1ビット) 奇数を2とする指数部で、負数は2の補数(4ビット) 仮数の絶対値(11ビット) で、 答えは 0111 1110 0000 0000 なのですが、この指数部がどうしてもわかりません。 初心者なので、、わかりやすく教えてくだされば、、うれしいな。と思うのです。

  • 浮動小数点の問題です。

    10進数+0.375を浮動小数点で記憶させ、その記憶領域のダンプリストを読み取ると、 0.375は16進数で(1)に、 -1は16進数で(2)となる。 答えは(1)は7F00、(2)8600です。 この2つの問題の途中式と解説をお願いします。 バイト型:バイト数は1バイト,負の補数は2の補数で表す 整数型:バイト数は2バイト,負の補数は2の補数で表す 浮動小数点:バイト数は2バイト,符号1ビット,指数部5ビット,仮数部10ビット ビット番号0:符号部.仮数部の符号が入っている.0なら正,1なら負 ビット番号1-5:指数部.負の値を2の補数で表す ビット番号6-15:仮数部.ビット番号6を小数点第1位とする仮数部の小数点以下の絶対値が、正規化された2進数で入っている 正規化とは,仮数部が2進数で0.1以上1.0未満になるよう指数部を増減する操作である

  • 浮動小数点について

    独学でプログラミングの勉強をしています。Wiki等で調べたりしましたが、 下記テキストの質問の計算が全く分かりません。 分かりやすく説明して頂けるとありがたいです。 宜しくお願い致します。 質問: 二つの浮動小数点の数字があり、SEEMMMM(S=符号付数値、E=指数、M=仮数)の形式で表示されています。 指数はエクセス数50、仮数は符号付数値、小数点は右の仮数に表示されます。 0 53 1110 0 50 3020 二つの数字を加算し、正しく表示された浮動小数点形式と実数をすべての計算式も含め表しなさい。

  • 浮動小数点形式の問題

    数値を32ビット浮動小数点形式で表す。指数部は2を基数とし、負数は2の補数で表現する。10進数0.375をこの2を基数とした浮動小数点形式で正規化したものはどれか。ただし結果は16進数で表現する。 答え:7FC00000 という問題です。 まず0.375を2進数に 0.011 正規化 0.11 * 2^-1 指数部-1を2進数で求める -0000 0001 ->1111 1111 仮数部符号は正の数なので0 0111 1111 ???? ???? ???? ???? ???? ???? と・・・ ここの部分からわかりません・・・ (なぜか手持ちの参考書には省略してあり・・・) 7Fの部分はこれで間違いないでしょうか? またそのあとのC00000 はどうやって導くのか教えてください。 お願いいたします

  • 浮動小数点の正規化方法について

    基本情報処理技術者試験を20日に受けます。勉強不足で困っています。どなたか教えてください。 問題「数値を16ビットの浮動小数点表示法で表現する。10進数0.375を正規化せよ:ここでの正規化は仮数部の有効数字よりも上位の0がなくなるように指数部を調節する操作である。」  答え「0111111000000000」 最初の1ビットが仮数部の符号、次の4ビットが2のべき乗の指数部で負数は2の補数、残りの11ビットが仮数部の絶対値 となっています。 0.375を2進数に直すところまではわかったのですが、次の正規化がよくわかりません。よろしくお願いいたします。

  • 浮動小数点について

    32ビットの浮動小数点(符号1ビット指数8ビット仮数23ビット)で最小値を求めるにはどういう計算をすればいいのでしょうか?また調べた数値だと最小値 1.175494351E-38 最大値3.402823466E+38のところ±3.40282347E+38 ~ ±1.40239846E-45のところがあるのですがどちらが正しいのでしょうか?

  • 浮動小数点の正規化の必要性について

     浮動小数点の正規化の必要性について教えてください。  浮動小数点で数を表す際に、正規化は必ずしも必要なもの(行わなければならないもの)なのでしょうか?    また浮動小数点の正規化のルールとして、  2進数か16進数に変換したとき  「指数部を調整して、仮数部の最上位けたを“0以外にする”」というルールがあるようなのですが、何故「指数部を調整して、仮数部の最上位けたを“0以外にする”」という処理が必要となるのでしょうか?