http://sourceware.org/ml/glibc-cvs/2013-q1/msg00115.htmlに出くわしました。これには次の行が含まれています
#define TWO5 0x1.0p5 /* 2^5 */
どうやら、 TWO5 は明示的な値を持つ double として定義されています1<<5
。しかし、この表記は初めて見ました。この形式はどのように使用されてきましたか? また、単に書くことよりも優れている点は何2.5
ですか?
http://sourceware.org/ml/glibc-cvs/2013-q1/msg00115.htmlに出くわしました。これには次の行が含まれています
#define TWO5 0x1.0p5 /* 2^5 */
どうやら、 TWO5 は明示的な値を持つ double として定義されています1<<5
。しかし、この表記は初めて見ました。この形式はどのように使用されてきましたか? また、単に書くことよりも優れている点は何2.5
ですか?
この表記法は C99 で導入されました。利点は、値が 16 進数形式で表現されるため、基になる表現と 10 進数形式の間で浮動小数点値を変換するときに発生する丸めなどの影響を受けないことです。
この表記について説明しているページはたくさんあります。たとえば、次のようになります。
http://www.exploringbinary.com/hexadecimal-floating-point-constants/
これは、C99 に付属していた 16 進浮動小数点表記です (と思います)。利点は、そのような定数を正確に表現可能な値で指定できることです。(これは、浮動小数点数の基数が 2、4、8、または 16 であることを前提としています:)
これは、 C99 ドラフトで定義されている 16 進浮動小数点定数の文法であり、正規表現として記述されています。
0[xX]([a-fA-F0-9]*[.][a-fA-F0-9]+|[a-fA-F0-9]+[.]?)[pP][+-]?[0-9]+[flFL]?
4つの部分で構成されています:
0[xX]
: 16 進数のプレフィックス、次の 2 つのいずれか:
0x 0X
([a-fA-F0-9]*[.][a-fA-F0-9]+|[a-fA-F0-9]+[.]?)
: 16 進数の小数定数。例:
34.2f .de b3.
または 16 進数の数字列 (16 進数の整数)。例:
2f4 10
2 番目の部分では、基本的に仮数部について説明します。
[pP][+-]?[0-9]+
: 2 進指数部 (10 進数で指定)。例:
p-4 p20
仮数部を 16 進数で指定し、指数 b (基数 2) を 10 進数で指定して、16 進数の浮動小数点定数を指定します。
[flFL]?
float
: タイプ ( 、double
または)を示すオプションの浮動サフィックスlong double
。