解決済み

C言語イプシロン値

  • 困ってます
  • 質問No.9625188
  • 閲覧数90
  • ありがとう数10
  • 気になる数1
  • 回答数5
  • コメント数0

お礼率 78% (183/232)

現在使用中の開発環境(C言語使用)標準ヘッダfloat.hに単精度浮動小数点数イプシロン値が下記のように定義されています。

#define  FLT_EPSILON   0x8p-26F

「0x8p-26F」なる表現を初めて見たのですが、これはどういう意味で、具体的にどんな数字になるのでしょう?
ご存じの方、教えてくださいませ。
よろしくお願いします。

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

  • 回答No.3

ベストアンサー率 72% (4274/5930)

「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

お礼率 78% (183/232)

ご回答ありがとうございます。

何と親切でわかり易い回答なんでしょう・・・
お陰様で良く理解できました。
感謝致します。
投稿日時 - 2019-06-13 10:31:35

その他の回答 (全4件)

  • 回答No.5

ベストアンサー率 44% (4258/9608)

他カテゴリのカテゴリマスター
あとで見た人が混乱しないように書いておくと
[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

お礼率 78% (183/232)

補足ありがとうございました。

う~ん、難しいですね・・・
少々混乱してきました^^;
これから色々と勉強して理解致します。
投稿日時 - 2019-06-13 11:24:32
  • 回答No.4

ベストアンサー率 72% (4274/5930)

すみませぬNo.3は間違いかも

ビット列で考えて仮数部最小の数値は、オール0の
[000 0000 0000 0000 0000 0000]
なので、表現できる最小数はやはり全ビット0の
[0000 0000 0000 0000 0000 0000 0000 0000]
になって、10進数表現では
1.0×2^-127
が最少の差分値ってことに…?(汗
お礼コメント
black2005

お礼率 78% (183/232)

補足ありがとうございます。

”差分”なので0ではなく、値を持つ最小値ではないのでしょうかね?
なので、回答3で良いような・・・
良くわかりませんけど^^;
投稿日時 - 2019-06-13 10:38:04
  • 回答No.2

ベストアンサー率 44% (4258/9608)

他カテゴリのカテゴリマスター
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

お礼率 78% (183/232)

ご回答ありがとうございます。

記述の意味は良くわかり勉強になりました。
投稿日時 - 2019-06-13 10:33:35
  • 回答No.1

ベストアンサー率 46% (104/225)

ググれば出てくるだろう?
https://ja.cppreference.com/w/cpp/language/floating_literal

8×2^-26

C++17に対応したコンパイラが必要
お礼コメント
black2005

お礼率 78% (183/232)

ご回答ありがとうございます。

ググる際のキーワードがわからなかったんです・・・^^;
早速、リンク先を読ませて頂きます。
投稿日時 - 2019-06-13 10:28:29
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

ピックアップ

ページ先頭へ