?
Ce document utilise Manuel du site Web PHP chinois Libérer
允許直接在表達(dá)式中使用浮點(diǎn)類(lèi)型的值。
浮點(diǎn)常量是一個(gè)非左值表達(dá)式,其形式為:
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)十進(jìn)制浮點(diǎn)常量的指數(shù)語(yǔ)法
2)十六進(jìn)制浮點(diǎn)常量的指數(shù)語(yǔ)法
如果有效數(shù)字以字符序列0x或0X開(kāi)頭,則浮點(diǎn)常量是一個(gè)十六進(jìn)制浮點(diǎn)常量。否則,它是一個(gè)十進(jìn)制浮點(diǎn)常量。對(duì)于十六進(jìn)制浮點(diǎn)常量,有效數(shù)被解釋為十六進(jìn)制有理數(shù),并且指數(shù)的數(shù)字序列被解釋為必須縮放有效數(shù)的2的整數(shù)次冪。雙d = 0x1.2p3; //十六進(jìn)制小數(shù)1.2(十進(jìn)制1.125)按2 ^ 3縮放,即9.0 | (自C99以來(lái)) |
---|
對(duì)于十進(jìn)制浮點(diǎn)常量,有效數(shù)被解釋為十進(jìn)制有理數(shù),并且指數(shù)的數(shù)字序列被解釋為10的整數(shù)冪,有效數(shù)必須被縮放到該冪。
double d = 1.2e3; // decimal fraction 1.2 scaled by 10^3, that is 1200.0
一個(gè)沒(méi)有任何固定的浮點(diǎn)常量具有類(lèi)型double
。如果后綴是字母f
或者F
,浮動(dòng)常數(shù)是類(lèi)型的float
。如果后綴是字母l
或者L
,浮動(dòng)常數(shù)是類(lèi)型的long double
。
評(píng)估浮點(diǎn)常量的結(jié)果或者是最接近的可表示值,或者是以實(shí)現(xiàn)定義的方式選擇的緊鄰最接近的可表示值的較大或較小的可表示值(換句話(huà)說(shuō),翻譯期間的默認(rèn)舍入方向是實(shí)現(xiàn)定義的) 。
如果由 FLT_EVAL_METHOD 指示,則浮點(diǎn)常量可能會(huì)轉(zhuǎn)換為更多的范圍和精度。例如,在表達(dá)式中,常數(shù)0.1f可能表現(xiàn)為0.1L。 | (自C99以來(lái)) |
---|
如果 FLT_RADIX 為2,則評(píng)估十六進(jìn)制浮點(diǎn)常量的結(jié)果是由浮點(diǎn)常量表示的精確值,正確地舍入到目標(biāo)類(lèi)型。 | (自C99以來(lái)) |
---|
如果指數(shù)存在且不使用小數(shù)部分,則可以省略小數(shù)點(diǎn)分隔符:
double x = 1e0; // floating-point 1.0 (period not used)
對(duì)于十進(jìn)制浮點(diǎn)常量,指數(shù)部分是可選的。如果省略,則該期間不是可選的,并且必須存在整數(shù)或分?jǐn)?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) |
---|
對(duì)于十六進(jìn)制浮點(diǎn)常量,指數(shù)不是可選的,以避免f后綴被誤認(rèn)為十六進(jìn)制數(shù)字而引起的歧義。 | (自C99以來(lái)) |
---|
當(dāng)浮點(diǎn)常量轉(zhuǎn)換為內(nèi)部表示時(shí),默認(rèn)的舍入方向和精度有效,即使#pragma STDC FENV_ACCESS
有效(對(duì)于字符串的執(zhí)行時(shí)間轉(zhuǎn)換,strtod
也可以使用),浮點(diǎn)異常不會(huì) 產(chǎn)生。請(qǐng)注意,這與浮點(diǎn)類(lèi)型的算術(shù)常量表達(dá)式不同。
在浮動(dòng)常量字母是不區(qū)分大小寫(xiě)的:0x1.ep+3
與0X1.EP+3
表示相同的浮點(diǎn)值15.0。
指定的小數(shù)點(diǎn)setlocale
對(duì)浮點(diǎn)常量的語(yǔ)法沒(méi)有影響:小數(shù)點(diǎn)字符始終為句點(diǎn)。
與整數(shù)不同,并不是每個(gè)浮點(diǎn)值都可以用十進(jìn)制或甚至十六進(jìn)制常量語(yǔ)法直接表示:宏 NAN 和 INFINITY 以及諸如nan
提供生成這些特殊值的方式的函數(shù)。請(qǐng)注意0x1.FFFFFEp128f
,它可能看起來(lái)像一個(gè) IEEE 浮點(diǎn)型NaN,實(shí)際上以這種格式溢出到無(wú)窮大。
沒(méi)有負(fù)向浮動(dòng)常量; 一個(gè)表達(dá)式,如-1.2
算術(shù)運(yùn)算符一元減號(hào)應(yīng)用于浮點(diǎn)常量1.2
。請(qǐng)注意,特殊值負(fù)零可以用-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