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

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

解決済みの質問

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

 浮動小数点の正規化の必要性について教えてください。

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

投稿日時 - 2008-10-05 18:06:24

QNo.4379634

困ってます

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

回答ANo.1への補足,に対して。

浮動小数点数における正規化の必要性を説明するのに2進数を持ち出す必要はありません。10進数のままでも説明できます。

一例としてANo.2で挙げられた仮数部長で説明すると,2進数で23bitということは,10進数の桁に換算するとlog10(2^23)=約7桁となります。

もし仮に,仮数部・指数部ともに10進数で記録する浮動小数点数があると仮定し,さらにその仮数部長が7桁だと仮定するならば。

>[10進数]
>0.0000000000123456789012345678901234567890

という数は,7桁の仮数部長では正確に表現できませんから,丸め誤差が生じます。
同じ数値であっても,仮数と指数を組み合わせれば無限のパターンの表現ができます。今回の場合は,次の7つのパターンのうちのいずれかの表現形式を積極的に採用することになるでしょう。

(0.1234567)×10の-10乗
(0.0123456)×10の-9乗
(0.0012345)×10の-8乗
(0.0001234)×10の-7乗
(0.0000123)×10の-6乗
(0.0000012)×10の-5乗
(0.0000001)×10の-4乗

上記はすべて同じ数値なのですが,では「限られたビット数の中に少しでも多くの情報を詰め込」んでいるのはどれでしょう? 仮数部の長さ(=有効桁数)をムダにしないで,同じ数値であってもより精度の高い数として表現できているのはどのパターンでしょう?

その答えは「指数部を調整して、仮数部の最上位けたを“0以外にする”」というルールにのっとった,(0.1234567)×10の-10乗 であるのは明らかではないですか。

追伸.
ANo.2では IEEE754の「隠れ"1"表現」にまで触れているのですが,今回の問いに回答するだけならばそれは不要だと判断しましたので,省いてあります。

投稿日時 - 2008-10-06 02:18:18

補足

ご回答ありがとうございます。
お返事が遅れて申し訳ありません。

色々考えた末でようやくわかってきました。

>という数は,7桁の仮数部長では正確に表現できませんから,丸め誤差が生じます。
これは7桁の仮数部長と範囲から、
他の少数第8位以降の数字が「その数が存在できる7桁という範囲」から外れて、切捨て(場合によっては切り上げ?)されてしまう、丸め誤差が生じるということですよね?

あ。そうかっ!
仮数部の制度を調整するために 指数部があるのですね。

「仮数部の最上位けたを“0以外にする”」というルールを元に、
指数部による、仮数部の値の調整を設けておくことで、表現できる数を増やしているのですね。

仮に32ビットが仮数部だった場合

【元の数】
「0.0000000000123456789012345678901234567890」

↓実際に表現できる数
【実際に表現された数】
「0.000000000012345678901234567890」(この32ビット分だけ)

※この場合だと負数の表現は不可能ですね・・・


そこで次に32ビット中の情報の中で必要となったのが
符号部の「1」ビットの保持だった、ということですね。

よって
1(符号部)ビット + 31(仮数部)ビット となった?


しかしこれだと保持できる値の範囲は限られてしまう。
そこで! 「最上位桁を0以外にする」 という ルールと、「指数部を扱う」 という発想が産まれた。 ことによって、「浮動小数点」という数の取り扱いの一つの手法が出た、ということでしょうか。


実は「隠れ"1"表現」も知りたかったのです。
言葉的に何といったらいいのか難しいところなのですが、
丁度基本情報処理試験の勉強をしていたもので、その中で――…

【平成19年度 秋 午後 問1】で出てきた問題の中で、
IEEE754に関する浮動小数点の話があがっていたのです。
で、その問題を解いて行く中で、何故「浮動小数点で数を表す際に、正規化は必ずしも必要なもの(行わなければならないもの)のだろうか」という疑問が上がってきたのです。


つまり、浮動小数点とは
「指数部を調整して、仮数部の最上位けたを“0以外にする”」というルールに則ることで、限られた仮数部長の中に、表現すべき元ある値を精度高く(元あった数に近く)表現することを可能とする、数を取り扱う手法の一つである、という認識で置いているのですが

勉強過程の分野でもあるのですが、
ひとまずこの認識で問題はないでしょうか?

投稿日時 - 2008-10-26 16:18:56

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

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

回答(5)

ANo.5

>ひとまずこの認識で問題はないでしょうか?(回答ANo.3への補足)

はい,問題ないと思います。

>省略されている「1」はビット上では見えないだけで、
>「存在はしている」という認識でよいでしょうか?(回答ANo.2への補足)

基本的にはそれでよいです。きちんとお知りになりたければ,例えばja.wikipediaなどを参照していただくと,ゼロや非正規化数などではそうでないことが分かるでしょう。
http://ja.wikipedia.org/wiki/IEEE_754

投稿日時 - 2008-10-27 01:21:20

お礼

ご回答ありがとうございます。
お返事が遅れて申し訳ありません。

認識についてのご確認ありがとうございます。

投稿日時 - 2008-11-22 18:57:28

ANo.4

#1・2です。
私の回答は、質問者さんの意図のとらえ方が狭すぎたようですね。

投稿日時 - 2008-10-06 21:53:10

補足

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

意図は捉えられておられたかと思います。
IEEE754を例に出されているところが凄かったと思います。

ご回答者様が教えてくださった内容に、
知りたかった点がちゃんと含まれていました。

ご回答下さった回答者 様方 
ご丁寧なご回答をありがとうございます。

投稿日時 - 2008-10-26 16:43:49

ANo.2

たとえば、IEEE 754単精度の場合、仮数部は23ビットあります。
しかし、仮数部の最上位ビットが必ず1である (←正規化の結果) ことが分かっているなら、それを上記の23ビットに入れるのは無駄です。ここで、値が分かっている最上位ビットを除いて、代わりに24ビット目の値を入れます。これによって、23ビットの仮数部を使って、実質24ビット分の値を表現できるわけです。

投稿日時 - 2008-10-05 22:48:38

補足

ご回答ありがとうございます。
お返事が遅れて申し訳ありません。

色々考えに考えたものの、
まだ理解に至らずに「?」が残ったままです・・・(汗)

>IEEE 754単精度の場合、仮数部は23ビットあります。
ここはわかりました。

>しかし、仮数部の最上位ビットが必ず1である (←正規化の結果)
これはIEEE754の特性の一つとして「仮数部の最上位ビットは必ず1である」という条件からですよね?

>ことが分かっているなら、それを上記の23ビットに入れるのは無駄です。

あ。わかったかもしれません。
つまり「仮数部の23ビットの領域に、24ビット目以降とされるビット列を入れる」ということですよね。

例えば

正規化前
「 0.0000000000100000000001111111111000」(小数部 34ビット)

↓ 正規化で「1」が省略される。
  (最初の1までの 「0」10個 と 最初の1の「1」個が消える)

正規化後 
「 0.00000000001111111111000 」(小数部 23ビット)

この場合だと、
第1少数点の1は除かれて、それ以降の第2小数点のビットのを含む23個のビットが表現されることとなる、ということですよね。

結果、
「 0.00000000001111111111000」 という値が仮数部として
表現されることになる。


一つ疑問なのですが、
省略されている「1」はビット上では見えないだけで、「存在はしている」という認識でよいでしょうか?

投稿日時 - 2008-10-26 16:16:31

ANo.1

IEEE 754の場合、正規化をするのは「限られたビット数の中に少しでも多くの情報を詰め込むため」です。

投稿日時 - 2008-10-05 20:45:25

補足

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

「限られたビット数の中に少しでも多くの情報を詰め込むためのもの。」
という役割はわかったのですが、すみません。まだちょっと理解できなかったところがあります。


例えば
[10進数]
0.0000000000123456789012345678901234567890

このような、少数が第何位になる10進数を2進数化する際、
正規化を行っておくことで、少数点の表示できるところまで限界で表示できる、ということでしょうか?

まだちょっと理解に至っていなく、
質問も意味不明かもしれませんが、できましたら補足をお願いいたします。

投稿日時 - 2008-10-05 21:50:44

あなたにオススメの質問