• ベストアンサー

浮動小数点数の内部表現について教えてください

float型の内部表現を表示するプログラムを書いていくつか試してみたのですが、どこからどこまでが仮数部でどこからどこまでが指数部なのか良くわかりません。 曲がりなりにも自分で考えた結果は次のとおりです。 10進表示: 内部表現 ;2進の指数表現 2 :01000000000000000000000000000000;10.0*10^0 4 :01000000100000000000000000000000;10.0*10^1 8 :01000001000000000000000000000000;10.0*10^10 16:01000001100000000000000000000000;10.0*10^11 32:01000010000000000000000000000000;10.0*10^100 また、 1 :00111111100000000000000000000000;0.1111111*10^0 0.5 :00111111000000000000000000000000;0.0111111*10^0 0.25:00111110100000000000000000000000;? 0.125:00111110000000000000000000000000;? 0.0625:00111101100000000000000000000000;? となりました。最上位ビットが符号だということは分かります。 質問をまとめると、 (1) 10進で 0.5 の2進指数表現は 0.0111111*10^0 ということなのでしょうか。もしそれで正解なら、どうして 0.1*10^0 としないでわざわざ丸め誤差を含む無限小数で表すのでしょうか。 (2) 仮数部と指数部のビットは決められていなくて、例えば状況によって仮数部のビットが少なくなり指数部のビットが多くなったりするのでしょうか。 (3)仮数部での小数点はどこにあるのでしょうか。 (4)float 型の小数精度は最小6桁ということですが、これは10進で6桁なのか2進で6桁なのか教えてください。 どれか一つでも教えていただけると助かります。 使ったコンパイラは Borland C++ Compiler 5.5 です。 }

  • ondy
  • お礼率94% (66/70)

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 使ったコンパイラは Borland C++ Compiler 5.5 です。 とのことですので、IEEE754(IEC559)に限った話として回答します。 > 1) 10進で 0.5 の2進指数表現は 0.0111111*10^0 ということなのでしょうか。もしそれで正解なら、どうして 0.1*10^0 としないでわざわざ丸め誤差を含む無限小数で表すのでしょうか。 たとえばfloat型の場合、最上位ビットが符号ビット、続く8ビットが指数部、下位23ビットが仮数部です。 0.5のビット表現は、 00111111000000000000000000000000 ですが、これは 符号: 0 (正) 指数部: 01111110 (-1) 仮数部: 00000000000000000000000 (1.0) の意味ですので、1.0×2^(-1) = 0.5 ということになります。 ここで、指数部には+127というバイアスがあります。簡単にいうと、指数部が127 (=01111111) の場合に 2^0 となるという意味です。上記では126ですので、2^(-1)になっています。 なお、指数部表現における基数は、FLT_RADIXマクロを調べればわかります。IEC559では、FLT_RADIXは2になるため、2^(指数部-127)になるわけです。 > (2) 仮数部と指数部のビットは決められていなくて、例えば状況によって仮数部のビットが少なくなり指数部のビットが多くなったりするのでしょうか。 仮数部と指数部のビット幅は固定です。 > (3)仮数部での小数点はどこにあるのでしょうか。 仮数部では、指数部が0の場合を除いて、常に 1.~ であるとして扱われます。そのため、最初の1はビット表現の中には現れません。ビット表現は、すべて小数点以下と考えてください。 > (4)float 型の小数精度は最小6桁ということですが、これは10進で6桁なのか2進で6桁なのか教えてください。 FLT_DIGのことを言われているのかと思いますが、FLT_DIGにせよDBL_DIGにせよ(LDBL_DIGにせよ)、すべて10進数での桁数です。

ondy
質問者

お礼

いままでもやもやしていたものが、目からウロコが落ちたようにはっきりと分かりました。 大変丁寧な回答ありがとうございました。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

BCCのfloat/doubleは、IEEE 754に準拠してるみたいです。

参考URL:
http://ja.wikipedia.org/wiki/IEEE754
ondy
質問者

お礼

とても分かりやすいサイトでした。 ありがとうございました!

関連するQ&A

  • 浮動小数点数について

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

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

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

  • IEEE754 浮動小数点の問題

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

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

    数値を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にも符号ビットがないと出来ないように思い質問しました。回答宜しくお願い致します。

  • 32bitの浮動小数点数表現について悩んでいます

    情報処理の初心者です。 今、14070366(10)を数値データとしてとらえ、 32bitの浮動小数点数で表現するという問題について考えています。 14070366(10) =100111000001010000101110(2) 10進数を2進数に基数変換した部分、25桁が仮数部になるんですよね? 符号部は+なので0。 では指数部の7桁には何が入るのでしょうか? 以上が私の分かっていることですが、 最終的な解答を16進数で表記すると、 14070366はどうなるのでしょうか? お願いします。

  • 浮動小数点表現

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

  • 浮動小数点数

    再質問で畏れ入ります。 数値を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 はどうやって導くのか教えてください。 お願いいたします

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

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

  • 16ビット浮動小数点数の表現方法について

    学校の課題において、ある数を2進数で表現し、さらにその数を16ビット浮動小数点数で表しなさい。またそのとき生じる誤差の名称を記しなさい、という課題がでており取り組んでいるのですが、ネットで調べていても計算方法が理解できず行き詰っております。どなたか計算方法の手助けをお願いできないでしょうか。 与えられた条件 符号ビット:1ビット(0:正、1:負) 指数部:4ビット 仮数部:11ビット 16ビット浮動小数点数で表す数 10011100011000011 です。計算方法を理解したいので、なるべく詳しくお願いいたします。 誤差の名称もできればご教授願います。

  • 浮動小数表記方式

    こんにちわ すいません、よろしくお願い致します。 以下のIEEEが提唱する32ビット浮動小数点の表記形式を用いて、十進数の503.625を表記すると、どのようになるか。#IEEEの32it浮動小数点表記方式#符号部:1bit(0:正、1:負)指数部:8bit(2の乗数部分に127を加える ex.8乗→8+127=135=二進数で10000111)仮数部:23bit(仮数を二進小数で1.xxxxxとなるよう調整したxxxxxの部分)符号部、指数部、仮数部の順で左から詰め、仮数部の残りは0で埋める。それを16進数で表す。