浮動小数点表示の情報落ちについて

このQ&Aのポイント
  • 浮動小数点表示における情報落ちについて説明します。
  • 浮動小数点表示の仮数部が23ビットであることから情報落ちが生じます。
  • 指数部の差が大きい方が情報落ちしやすく、仮数部の23ビットで表現するために指数部を18に揃えるのです。
回答を見る
  • ベストアンサー

浮動小数点表示の情報落ちについて

浮動小数点表示の仮数部が23ビットである コンピュータで計算した場合、情報落ちが発生する 計算式は、どれか。ここで、()2内の数は2進法で表示されている。 正解 「(1.01)2×2^18+(1.01)2×2^-5」 指数部の差が大きい方が情報落ちするのは分かるのですが、 仮数部の23ビットで表現した場合、なぜ指数部を18に揃えるのですか。 計算をし易くする為ですか。理由を教えて下さい。  1.0100000000000000000000   ×2^18 +0.0000000000000000000000101 ×2^18 ← (1.01)2×2^-5 =1.0100000000000000000000   ×2^18                    101が情報落ちしている。 あと、「(1.01)2×2^-5」が 「0.0000000000000000000000101」になる意味も分かりません。 出来ましたら、こちらも理由を教えて下さい。 ご丁寧に解説して頂ける方おられましたら、ご教授お願いします。 以上、よろしくお願い致します。

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

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.5

#2です。 はじめに、#2の回答で、「情報落ち」の話をしていなかったので、補足します。以下の該当部分を読み取って訂正してください。 こんなに大きな桁数をそのまま計算できない計算機だとすれば、たとえば4桁しかメモリ割り当てがないとすれば、、 1230*10^5+123= の計算をすることになりますね。この足し算でどことどこを足せばいいのでしょうか。1230+123=1353はだめなことは明らかですね。 1230*10^5+0.00123*10^5= として、指数をそろえれば、1230+0.00123=1230.00123と計算できて、 1230*10^5+=1230.00123*10^5 でいいでしょう。でも、4桁しかメモリ割り当てがないとすれば、123=0.00123*10^5の変換の時点で、0*10^5になって、「情報落ち」してしまいます。これは、1.230*10^8+0.00000123*10^8としても同じことで、0.00000123*10^8への変換の時点で、0.000*10^8になって、、「情報落ち」します。 これは、追加の質問にも関連しています。 指数をそろえないと、足し算できない。 追加の質問について、 指数を2^18にそろえるために、 (1.01)2×2^(-5)=x*2^18 としたxです。 x=(1.01)2*2(-23) 指数計算の法則は知っているのでしょうね。 a^m/a^n=a^(m-n) です。これを使っているだけなのですが。 指数を2^18にそろえるために、 (1.01)2×2^(-5)=x*2^18 とすると、xは、 x=(1.01)2*2^(-5)/2^18=(1.01)2*2^(-5-18)=(1.01)2*2^(-23)=(0.0000000000000000000000101)2 ですよ。 この質問/回答はこれで終わりです。さらに疑問があるなら、改めて質問してください。

wwmomo
質問者

お礼

ご回答ありがとうございます。 ご丁寧に説明して頂いたので解釈することが出来ました。 当方、指数計算の法則を知りませんでした。 x=(1.01)2*2^(-5)/2^18=(1.01)2*2^(-23)になるんですね。 指数計算について勉強したいと思います。 以上、ありがとうございました。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「(1.01)2×2^-5の指数を-23に変えたから (1.01)2*2^-23=0.0000000000000000000000101なんですね。」 というのは, 完全に誤解しています.「指数を -5 から -23 に変えた」のではありません. 1.01×2^-5 という値を (指数を 18 にそろえるために) (なんとか)×2^18 という形 (そして「(なんとか)」のところは小数) で表現したいだけです. もう 1度 #3 を読み返してみてください. どこに「指数を-23に変えた」とありますか? もっといえば, 最初の質問の 「(1.01)2×2^-5」が「0.0000000000000000000000101」になる の時点で, 既に誤解しています. この式を素直に読めば (1.01)2×2^-5 が 0.0000000000000000000000101 ×2^18 になる としか読めないはずです. なぜ「×2^18」を無視したんですか?

wwmomo
質問者

お礼

ご回答ありがとうございます。 (1.01)2^-5が0.0000000000000000000000101になるのは、 (1.01)2^-5を(1.01)2^18に直したからなんですね。 すると、#2・#3・#5さんの言われている通り、 (1.01)2*2^(-5)/2^18=(1.01)2*2^(-23)になるからなんですね。 当方、全く勘違いしておりました。 ご丁寧に解説して頂き、ありがとうございました。 以上、ありがとうございました。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

#2です。 最後ちょっとミスがありました。 指数を10^18にそろえるために、 (1.01)2×2^-5=x*10^18 としたxです。 x=(1.01)2*10(-23) だから、 (0.0000000000000000000000101)2 になるのです。 ↓ 指数を2^18にそろえるために、 (1.01)2×2^(-5)=x*2^18 としたxです。 x=(1.01)2*2(-23) だから、 (0.0000000000000000000000101)2 になるのです。

wwmomo
質問者

お礼

ご回答ありがとうございます。 (1.01)2×2^-5の指数を-23に変えたから (1.01)2*2^-23=0.0000000000000000000000101なんですね。 そこで疑問に思ったのですが、 なぜ-5の指数が-23になるのですか。 なぜ(1.01)2×2^18は指数が23で 1.0100000000000000000000なんですか。 これも同じように指数は-23にならないのですか。 お手数ですが、ご教授お願い致します。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

ふつうに10進数で考えてみたらどうでしょう。 123000000+123=123000123 ですよね。これは、指数部が0、すなわち10^0にそろえ計算したものです。 これは9桁ですが、こんなに大きな桁数をそのまま計算できない計算機だとすれば、たとえば、 1230*10^5+123= の計算をすることになりますね。この足し算でどことどこを足せばいいのでしょうか。1230+123=1353はだめなことは明らかですね。 1230*10^5+0.00123*10^5= として、指数をそろえれば、1230+0.00123=1230.00123と計算できて、 1230*10^5+0.00123*10^5=1230.00123*10^5 でいいでしょう。指数をそろえないと、足し算できない、いいでしょうか。 「(1.01)2×2^-5」が 「0.0000000000000000000000101」 になんかなりません。 指数を10^18にそろえるために、 (1.01)2×2^-5=x*10^18 としたxです。 x=(1.01)2*10(-23) だから、 (0.0000000000000000000000101)2 になるのです。

wwmomo
質問者

お礼

ご回答ありがとうございます。 #3の方へ更なる疑問点を書きましたので、 面倒かと思われますが詳しく教えて下さい。 以上、ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「計算をしやすく」というか, そもそも指数部をそろえないと計算できないよね. たとえば 13.7 + 4.25 という計算をするときに, 末尾の 7 と 5 をそろえて 1 3.7 4.2 5 ----- 5 6.2 のように計算しますか? 最後の「(1.01)2×2^-5」が「0.0000000000000000000000101」になるというのは, 単に指数部の値を変更した結果仮数部も (指数部の変化を相殺するように) 変えなきゃならないってだけです. ここは「指数部をそろえなければならない」というだけで分かるはずです. ちなみに指数部を 18 にそろえているのは, 単純に「大きい方にそろえている」だけであって特に意味はありません. 最終的には仮数部が一定の範囲に入るように調整し直すので, どこにそろえたとしても同じことです.

wwmomo
質問者

お礼

ご回答ありがとうございます。 指数部を合わせる意味が分かりました。 そして18にしてるのに特に意味は無いんですね。 以上、ありがとうございました。

関連するQ&A

  • 浮動小数点について

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

  • 浮動小数点表示の考え方

    平成22年春期 応用情報技術者試験 午前の問い2で出た問題についてです。 10進数の0.25を2進数の浮動小数点表示した場合、 どのような表示になるかという問いで分からない部分があります。 0.1×2^-1で表せるので、指数部は-1で仮数部は1となると言っているのですが、 どうして0.1の1が最上位ビットとして考えるのかわかりません。 解説動画みてもわかりませんでした。 10進数の1.25を2進数にすると、1×2^0+0×2^-1+1×2^-2ですが、 この場合は0.101×2^1として表して指数部は1で仮数部は101と考えるという事でしょうか? なぜ1.01×2^0としてそのまま扱わないのか良くわかりません。 情報系の計算方法としては、小数点より前の数字を0にして有効数字をカウントするのが一般的という事でしょうか? 分かる方教えてください。 [問題文] http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2010h22_1/2010h22h_ap_am_qs.pdf [答え解説] https://www.youtube.com/watch?gl=JP&hl=ja&v=lqZBsBmLtpI

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

    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未満になるよう指数部を増減する操作である

  • 浮動小数点表示 加算方法 IEEE

    指数部3bit、仮数部4bit、符号1bitの合計8bitの2進数の浮動小数点表示で、 (1)0.125+0.125+2.5 (2)2.5+0.125+0.125   (10進数) を計算せよ。 という問題です。 0.125(10)は00000000(2)、2.5(10)は01000100(2)となることはわかるのですが、この二つの計算方法がよく理解できません。 どちらかが誤差が生じたりすると思うのですが、それがよくわからず困っています。 教えてください。

  • 基本情報の浮動小数点について

    基本情報技術者試験の勉強をしているのですが、浮動小数点の問題がどうしても解けません。問題を読んでもいまひとつ理解できず、四苦八苦しています。 下記の問題なのですが、教えていただけますでしょうか。 (平成12年に出題された問題(十進数0.375を正規化)は、理解できました) 問題集には解き方が載っているのですが、それが理解できません。解き方は以下です。 26.5を長さ32ビットの浮動小数点で表す (1) 26.5を16進数に変換  26.5の2進数:11010.1  11010.1の16進数:0001 1010 . 1000 1  A . 8   (2) 小数点位置の移動          小数点を左に2けた移動:1A.8 → (0.1A8) × 16の2乗  #ここまでは理解できます (3) 指数部の値16の2乗 → 16の0乗を(1000000)2進数=64とする  #ここがまるで分かりません        16の2乗の2を64に加える        1000000 … 64の2進数       + 10 … 2の2進数       ─────        1000010 … 指数の値とする  #「16の0乗を1000000=64とする」の部分が分かりません (4) まとめ  符号 指数部 仮数部   0│1000010│0001│1010│1000│00…0     16の2乗 1  A  8  #符号と仮数部は理解できるのですが、指数部が分かりません よろしくお願いいたします。

  • 浮動小数点表現

    2^{24}を32bit整数表現及び32bit(単精度)浮動小数点表現で表せ。 結果は16進数で示せ。 符号ビット:MSB 指数部n:7ビット 仮数部:24ビット という問題があるのですが、 解いてみたものの、答えもないのであっているのか分かりません。 以下の答えで合っているでしょうか? また、合っていなかったら、どのように解くのか教えていただけませんか? 整数表現 0100 0000H 浮動小数点 0100 1000 0100 0000 0000 0000 0000 0000

  • 浮動小数点の精度と範囲からすると、「0」はどうなるのでしょうか

    IEEE754の単精度による浮動小数点表現(符号部1ビット、指数部8ビット、仮数部23ビット)ですと、その表現できる範囲が数値の絶対値で、2^(-126)=1.2×10^(-38)から(2 - 2^(-23))×2^(127)=3.4×10^(38)になりますが、数値の「0」はどう表現されるのでしょうか。たとえば、C言語などで、変数の値が「0」の場合、コンピュータ内部の2進数表現はどのようになっているのでしょうか。よろしくお願いいたします。

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

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

  • 浮動小数点について

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

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

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