• ベストアンサー

floatについて

floatについて聞きたいのですが、単精度浮動小数点ということですが、仮数部は24ビットで16777216が限界だと思うのですが、調べてみると9999999827968までできてしまうのですが。これはどういうことなのでしょうか?どうか具体的に教えてください。

  • 79562
  • お礼率68% (164/239)

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.4

訂正。 >floatは、指数部7ビット、仮数部24ビットです。 >従って「2の127乗×(16777215÷16777216)」が最大値です。 は間違いでした。 floatは、指数部8ビット、仮数部23+1ビットです。 ビット並びは SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF となります。 仮数部は、データ上には23ビットしかありませんが、最上位に「常にビットが1になる24ビット目」を追加して計算します。 仮数部の実データが 01000000000000000000000 の場合、最上位に1が追加され 101000000000000000000000 となります。 指数部は-126~127です。 指数部の実際のデータは127が足され、1~254になっています(実際のデータが0と255の場合は、特別な意味があります) 従って「2の127乗×(16777215÷8388608)」が最大値です(16777215=2の24乗-1、8388608=2の23乗) この値は「3.402823466385288598e+38」です。 なお上記の 2の127乗×(16777215÷8388608) は、ANo.3の指摘の 2^127*(2*16777215/16777216) の式と同等になります。

79562
質問者

お礼

なるほど。。 わかりました。 回答ありがとうございました。

その他の回答 (3)

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

IEEE754 形式の場合, (正規化数の) 指数は -126~+127 です. で有効数字部が 23+1 ビットなので, 表せる最大の数は 2^127*(2*16777215/16777216) です. 正規化数の有効数字部は必ず 1以上 2未満です.

79562
質問者

お礼

わかりました。回答ありがとうございました。

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

仮数部のビット数など、完全に処理系に依存します。 処理系は何でしょう?

79562
質問者

お礼

VC++の2005です。

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.1

floatは、指数部7ビット、仮数部24ビットです。 従って「2の127乗×(16777215÷16777216)」が最大値です。 これは「約1.7014117331926442990585209174226×10の38乗」であり、9999999827968は「約1×10の13乗」なので「楽勝で表現可能」です。

79562
質問者

お礼

回答ありがとうございます。 「約1.7014117331926442990585209174226×10の38乗」とのことですが プログラムでやったら, #include<stdio.h> float f(float x ,int y) {      return y?(x*f(x,y-1)) : 1; } void main(void) { float i; i=f(2,127)*1.5;  //((float)16777215/(float)16777216); printf("%f\n",i); } 結果 255211775190703850000000000000000000000.000000と超えてしまいました。これはどういうことなのでしょうか? コメントを外して1.5を消してやると170141173319300000000000000000000000000.000000と出ます。

関連するQ&A

  • 浮動小数点表現

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

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

    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 です。 }

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

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

  • Accessクエリの整数型と単精度型の演算について

    Accessのクエリで長整数型と単精度浮動小数点型を 加算すると答えが一致しません。理由を知っている人いますか? ちなみに長整数型と倍精度浮動小数点型を加算したときは答えが一致します。 浮動小数点は誤差がつきものなのは分かりますが、 確か単精度浮動小数点型は有効桁数7桁までのはず。 下記の例では問題ないように見えます。 (例)長整数型と単精度浮動小数型の演算:1000+0.20=1000.20000000298 長整数型と倍精度浮動小数型の演算:1000+0.20=1000.2 それではよろしくお願いします。

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

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

  • 浮動小数点数型

    単精度浮動小数点型と倍精度浮動小数点数型、それぞれ値がとりうる範囲を教えてください。 単精度浮動小数点型 負の値は -3.4028235E+38 ~ -1.401298E-45、 正の値は 1.401298E-45 ~ 3.4028235E+38 の範囲の値 倍精度浮動小数点数型 負の値は -1.79769313486231570E+308 ~ -4.94065645841246544E-324、 正の値は 4.94065645841246544E-324 ~ 1.79769313486231570E+308 の範囲の値 とは記述してあるのですが、実際に小数1桁なら整数部はどのくらいの範囲の値がとれるのか、皆目わかりません。 どうか、わかりやすく教えてください。 よろしくお願い致します。

  • この問題の解法が分かりません。

    【問題】 4バイト(最上位ビットから1ビットの符号ビット、7ビットの指数部、24ビットの仮数部からなる)の数値で表現する浮動小数点を考える 。この形式で表現される浮動小数点数の絶対値は、 16^n * (f1 / 16 + f2 / 16^2 + f3 / 16^3 + f4 / 16^4 + f5 / 16^5 + f3 / 16^3) となる。ただし、nの負数は2の補数で表すものとする。また、fi(i=1,2,3...6)は、0から15までの数値である。例えば、10進数の16.5は 16.5=16^2*(1/16+0/16^2+8/16^3)…(1) であるから、浮動小数点形式では16進数表示で02108000・・・(2) となり、 -16.5は82108000・・・(3) となる。 分からないのは、問題文中の「例えば~」以降で(1)、(2)、(3)がどうしてそのように表されるのか理解できません。分かる方詳細に教えてください。

  • IEEE754 浮動小数点の問題

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

  • float値で整数値を判断する方法

    float i1 = 5f; //整数とします float i2 = 3.14f; //小数とします 値の取得後、計算します。 受け取ったfloatの値が、整数か小数か判断する方法はございますでしょうか? 上手く表現でき無くて、恥ずかしいのですが、 人間の計算(想定している値)で、小数が無い場合は整数、 それ以外は小数としたいのですが、 どのように対応すれば良いか全く分かりません。 計算途中の精度は問われず、あくまで受け取ったfloat値が整数か小数か判定します。 ご教示よろしくお願いいたします。

  • 浮動小数表記方式

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

専門家に質問してみよう