• ベストアンサー

C言語イプシロン値

現在使用中の開発環境(C言語使用)標準ヘッダfloat.hに単精度浮動小数点数イプシロン値が下記のように定義されています。 #define  FLT_EPSILON   0x8p-26F 「0x8p-26F」なる表現を初めて見たのですが、これはどういう意味で、具体的にどんな数字になるのでしょう? ご存じの方、教えてくださいませ。 よろしくお願いします。

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6809/9681)
回答No.3

「0x8」-- 16進数の8 「p」-- 指数表記 「-26」-- 2の-26乗 「F」-- float 型 という、指数表現です。 この値は、1.0と、その次に大きい最少の小数値との差を、示しています。 いわば「floatで表現できる最少差分」といった意味になるでしょうか。 ---- 8なら8と書けばいいのに何でわざわざ0x8なんて書いてあるかというと。 「16進数の」指数表現ってところにポイントがあると思います。 >浮動小数点数の内部表現(IEEE) >https://www.k-cube.co.jp/wakaba/server/floating_point.html 32ビットfloatのバイナリ表現は、上記ページのようになっています。 0x8 とは、二進数で書くと 0b1000。※ 0b は2進数プレフィックス そして2のマイナスn乗っていうのは、マイナス1つごとに1/2する、それをコンピュータ処理的に言うと、「nビット右シフトする」に相当します。 例) 8÷2=4 を2進表現すると 0b1000 ÷ 2 = 0b0100。1桁右にずれている すなわち 0x8p-26F という浮動小数点値のビット列は、以下の並びになります。 [0000 0000 0000 0000 0000 0000 0000 0001] 符号0(プラス)、指数部000 0000 0(最少値=-127乗)、仮数部 000 0000 0000 0000 0000 0001(表現できる最小の数)。 これは紛れもなく、このfloat形式でで表現できる最少の差分値というわけなのです。

black2005
質問者

お礼

ご回答ありがとうございます。 何と親切でわかり易い回答なんでしょう・・・ お陰様で良く理解できました。 感謝致します。

その他の回答 (4)

  • f272
  • ベストアンサー率46% (8477/18147)
回答No.5

あとで見た人が混乱しないように書いておくと [0111 1111 1000 0000 0000 0000 0000 0000]=1 [0111 1111 1000 0000 0000 0000 0000 0001]=1+2^(-23) ですから,1.0とその次に大きい最小の小数値との差は2^(-23)です。 [0000 0000 0000 0000 0000 0000 0000 0000] は非正規化数であり+0です。また [0000 0000 1000 0000 0000 0000 0000 0000]=2^(-126) は最小の正の数であって,1.0とその次に大きい最小の小数値との差ではありません。実際,1+2^(-126)を表現しようとしても [0111 1111 1000 0000 0000 0000 0000 0000 ...ずっと先の方で1] にしかできませんから32bitでは表現できません。。

black2005
質問者

お礼

補足ありがとうございました。 う~ん、難しいですね・・・ 少々混乱してきました^^; これから色々と勉強して理解致します。

  • asciiz
  • ベストアンサー率70% (6809/9681)
回答No.4

すみませぬNo.3は間違いかも ビット列で考えて仮数部最小の数値は、オール0の [000 0000 0000 0000 0000 0000] なので、表現できる最小数はやはり全ビット0の [0000 0000 0000 0000 0000 0000 0000 0000] になって、10進数表現では 1.0×2^-127 が最少の差分値ってことに…?(汗

black2005
質問者

お礼

補足ありがとうございます。 ”差分”なので0ではなく、値を持つ最小値ではないのでしょうかね? なので、回答3で良いような・・・ 良くわかりませんけど^^;

  • f272
  • ベストアンサー率46% (8477/18147)
回答No.2

https://cpprefjp.github.io/lang/cpp17/hexadecimal_floating_literals.html 0x...十六進プレフィックス 8...仮数部(十六進整数) p...指数部(プレフィックス) -...指数部(符号) 26...指数部(十進数) F...サフィックス(float型) つまり0x8p-26Fは8*1*2^(-26)=2^(-23)=1.19209*10^(-7)を意味します。

black2005
質問者

お礼

ご回答ありがとうございます。 記述の意味は良くわかり勉強になりました。

回答No.1

ググれば出てくるだろう? https://ja.cppreference.com/w/cpp/language/floating_literal 8×2^-26 C++17に対応したコンパイラが必要

black2005
質問者

お礼

ご回答ありがとうございます。 ググる際のキーワードがわからなかったんです・・・^^; 早速、リンク先を読ませて頂きます。

関連するQ&A