みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語イプシロン値

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

#define  FLT_EPSILON   0x8p-26F

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

投稿日時 - 2019-06-12 16:19:50

QNo.9625188

困ってます

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

「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形式でで表現できる最少の差分値というわけなのです。

投稿日時 - 2019-06-12 18:50:12

お礼

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

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

投稿日時 - 2019-06-13 10:31:35

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.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では表現できません。。

投稿日時 - 2019-06-12 21:19:05

お礼

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

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

投稿日時 - 2019-06-13 11:24:32

ANo.4

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

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

投稿日時 - 2019-06-12 19:07:28

お礼

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

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

投稿日時 - 2019-06-13 10:38:04

ANo.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)を意味します。

投稿日時 - 2019-06-12 18:03:17

お礼

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

記述の意味は良くわかり勉強になりました。

投稿日時 - 2019-06-13 10:33:35

ANo.1

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

8×2^-26

C++17に対応したコンパイラが必要

投稿日時 - 2019-06-12 17:55:31

お礼

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

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

投稿日時 - 2019-06-13 10:28:29

あなたにオススメの質問