• ベストアンサー

floatについて

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

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

  • ベストアンサー
回答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です。

回答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