?
This document uses PHP Chinese website manual Release
允許直接在表達式中使用浮點類型的值。
浮點常量是一個非左值表達式,其形式為:
significand exponent(optional) suffix(optional) |
---|
有效數(shù)字的形式。
whole-number(optional) .(optional) fraction(optional) |
---|
指數(shù)的形式。
e | E exponent-sign(optional) digit-sequence | (1) | |
---|---|---|
p | P exponent-sign(optional) digit-sequence | (2) | (since C99) |
1)十進制浮點常量的指數(shù)語法
2)十六進制浮點常量的指數(shù)語法
如果有效數(shù)字以字符序列0x或0X開頭,則浮點常量是一個十六進制浮點常量。否則,它是一個十進制浮點常量。對于十六進制浮點常量,有效數(shù)被解釋為十六進制有理數(shù),并且指數(shù)的數(shù)字序列被解釋為必須縮放有效數(shù)的2的整數(shù)次冪。雙d = 0x1.2p3; //十六進制小數(shù)1.2(十進制1.125)按2 ^ 3縮放,即9.0 | (自C99以來) |
---|
對于十進制浮點常量,有效數(shù)被解釋為十進制有理數(shù),并且指數(shù)的數(shù)字序列被解釋為10的整數(shù)冪,有效數(shù)必須被縮放到該冪。
double d = 1.2e3; // decimal fraction 1.2 scaled by 10^3, that is 1200.0
一個沒有任何固定的浮點常量具有類型double
。如果后綴是字母f
或者F
,浮動常數(shù)是類型的float
。如果后綴是字母l
或者L
,浮動常數(shù)是類型的long double
。
評估浮點常量的結(jié)果或者是最接近的可表示值,或者是以實現(xiàn)定義的方式選擇的緊鄰最接近的可表示值的較大或較小的可表示值(換句話說,翻譯期間的默認舍入方向是實現(xiàn)定義的) 。
如果由 FLT_EVAL_METHOD 指示,則浮點常量可能會轉(zhuǎn)換為更多的范圍和精度。例如,在表達式中,常數(shù)0.1f可能表現(xiàn)為0.1L。 | (自C99以來) |
---|
如果 FLT_RADIX 為2,則評估十六進制浮點常量的結(jié)果是由浮點常量表示的精確值,正確地舍入到目標類型。 | (自C99以來) |
---|
如果指數(shù)存在且不使用小數(shù)部分,則可以省略小數(shù)點分隔符:
double x = 1e0; // floating-point 1.0 (period not used)
對于十進制浮點常量,指數(shù)部分是可選的。如果省略,則該期間不是可選的,并且必須存在整數(shù)或分數(shù)。
double x = 1.; // floating-point 1.0 (fractional part optional)double y = .1; // floating-point 0.1 (whole-number part optional)
For hexadecimal floating constants, the exponent is not optional to avoid ambiguity resulting from an f suffix being mistaken as a hexadecimal digit. | (since C99) |
---|
對于十六進制浮點常量,指數(shù)不是可選的,以避免f后綴被誤認為十六進制數(shù)字而引起的歧義。 | (自C99以來) |
---|
當(dāng)浮點常量轉(zhuǎn)換為內(nèi)部表示時,默認的舍入方向和精度有效,即使#pragma STDC FENV_ACCESS
有效(對于字符串的執(zhí)行時間轉(zhuǎn)換,strtod
也可以使用),浮點異常不會 產(chǎn)生。請注意,這與浮點類型的算術(shù)常量表達式不同。
在浮動常量字母是不區(qū)分大小寫的:0x1.ep+3
與0X1.EP+3
表示相同的浮點值15.0。
指定的小數(shù)點setlocale
對浮點常量的語法沒有影響:小數(shù)點字符始終為句點。
與整數(shù)不同,并不是每個浮點值都可以用十進制或甚至十六進制常量語法直接表示:宏 NAN 和 INFINITY 以及諸如nan
提供生成這些特殊值的方式的函數(shù)。請注意0x1.FFFFFEp128f
,它可能看起來像一個 IEEE 浮點型NaN,實際上以這種格式溢出到無窮大。
沒有負向浮動常量; 一個表達式,如-1.2
算術(shù)運算符一元減號應(yīng)用于浮點常量1.2
。請注意,特殊值負零可以用-0.0
。
#include <stdio.h> int main(void){ printf("15.0 = %a\n", 15.0); printf("0x1.ep+3 = %f\n", 0x1.ep+3); // Constants outside the range of type double. printf("+2.0e+308 --> %g\n", 2.0e+308); printf("+1.0e-324 --> %g\n", 1.0e-324); printf("-1.0e-324 --> %g\n", -1.0e-324); printf("-2.0e+308 --> %g\n", -2.0e+308);}
輸出:
15.0 = 0x1.ep+30x1.ep+3 = 15.000000+2.0e+308 --> inf+1.0e-324 --> 0-1.0e-324 --> -0-2.0e+308 --> -inf
C11 standard (ISO/IEC 9899:2011):
6.4.4.2 Floating constants (p: 65-66)
C99 standard (ISO/IEC 9899:1999):
6.4.4.2 Floating constants (p: 57-58)
C89/C90 standard (ISO/IEC 9899:1990):
3.1.3.1 Floating constants