web-dev-qa-db-ja.com

Cの16進浮動定数

0x0.3p10はどのような値を表しますか?

そして、上記のステートメントのpの意味は何ですか?

40
Nano HE

0x0.3p10は、C99で導入された16進浮動小数点リテラルの例です。 pは、基数を指数から分離します。

0x0.3ビットは仮数部(オプションの分数を含む全体)と呼ばれ、指数は2の累乗でスケーリングされます。

その特定の値は、16進数の0.3、または3 * 16-13/16)に2101024)を掛けて計算され、3 * 1024 / 16または192

次のプログラムはこれを確認します:

#include <stdio.h>
int main (void) {
    double d = 0x0.3p10;
    printf ("%.f\n", d);
    return 0;
}

C99のセクション6.4.4.2にはすべての詳細があります。

浮動定数には仮数部分があり、その後に指数部分とそのタイプを指定する接尾辞が続く場合があります。仮数部の構成要素は、整数部分を表す数字列、それに続くピリオド(。)、それに続く小数部分を表す数字列を含み得る。

指数部分のコンポーネントは、e、E、p、またはPの後に、オプションで符号付き桁シーケンスで構成される指数が続きます。整数部分または小数部分のいずれかが存在する必要があります。 10進浮動定数の場合、ピリオドまたは指数部分のいずれかが存在する必要があります。

仮数部は(10進数または16進数の)有理数として解釈されます。指数部分の桁シーケンスは、10進整数として解釈されます。 10進浮動定数の場合、指数は、仮数部をスケーリングする10の累乗を示します。 16進浮動定数の場合、指数は、仮数部をスケーリングする2の累乗を示します。

10進数の浮動定数の場合、およびFLT_RADIXが2の累乗でない場合の16進数の浮動定数の場合、結果は、実装定義で選択された、最も近い表現可能な値、または最も近い表現可能な値に直接隣接する大きいまたは小さい表現可能な値のいずれかになります。マナー。 FLT_RADIXが2の累乗である場合の16進浮動定数の場合、結果は正しく丸められます。

50
paxdiablo