名稱空間
變體
操作

浮點常量

來自 cppreference.com
< c‎ | language

允許浮點型別的值直接用於表示式中。

目錄

[編輯] 語法

浮點常量是一個非左值表示式,形式如下:

有效數字 指數 (可選) 字尾 (可選)

其中有效數字的形式如下:

整數部分 (可選) .(可選) 小數部分 (可選)

指數的形式如下:

e | E 指數符號 (可選) 數字序列 (1)
p | P 指數符號 (可選) 數字序列 (2) (C99 起)
1) 十進位制浮點常量的指數語法
2) 十六進位制浮點常量的指數語法

可選的單引號(')可以插入數字之間作為分隔符,在編譯時會被忽略。

(自 C23 起)

[編輯] 解釋

如果有效數字以字元序列0x0X開頭,則該浮點常量是十六進位制浮點常量。否則,它是十進位制浮點常量

對於十六進位制浮點常量有效數字被解釋為十六進位制有理數,指數的數字序列被解釋為2的整數次冪,有效數字必須按此比例縮放。

double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0
(C99 起)

對於十進位制浮點常量有效數字被解釋為十進位制有理數,指數的數字序列被解釋為10的整數次冪,有效數字必須按此比例縮放。

double d = 1.2e3; // decimal fraction 1.2 scaled by 10^3, that is 1200.0

[編輯] 字尾

無後綴的浮點常量型別為double。如果字尾是字母fF,浮點常量型別為float。如果字尾是字母lL,浮點常量型別為long double

如果實現預定義了宏__STDC_IEC_60559_BFP__,則額外支援以下字尾和相應的浮點常量:

  • 如果字尾dfDF,浮點常量型別為_Decimal32
  • 如果字尾ddDD,浮點常量型別為_Decimal64
  • 如果字尾dlDL,浮點常量型別為_Decimal128

十進位制浮點型別的字尾不允許用於十六進位制浮點常量。

(自 C23 起)

[編輯] 可選部分

如果指數存在且未使用小數部分,則可以省略十進位制分隔符

double x = 1e0; // floating-point 1.0 (period not used)

對於十進位制浮點常量,指數部分是可選的。如果省略它,則句點不是可選的,並且整數部分小數部分必須存在。

double x = 1.; // floating-point 1.0 (fractional part optional)
double y = .1; // floating-point 0.1 (whole-number part optional)

對於十六進位制浮點常量,指數不是可選的,以避免f字尾被誤認為是十六進位制數字而引起的歧義。

(C99 起)

[編輯] 可表示值

浮點常量的求值結果是最近的可表示值,或者是緊鄰最近可表示值的更大或更小的可表示值,選擇方式由實現定義(換句話說,翻譯期間的預設舍入方向由實現定義)。

所有相同源形式的浮點常量都會轉換為具有相同值的相同內部格式。不同源形式的浮點常量,例如1.231.230,不一定需要轉換為相同的內部格式和值。

如果FLT_EVAL_METHOD指示,浮點常量可能轉換成比其型別所指示的更大範圍和精度。例如,常量0.1f在表示式中可能表現得像0.1L

如果FLT_RADIX是2,則十六進位制浮點常量的求值結果是浮點常量所表示的精確值,並正確舍入到目標型別。

(C99 起)

具有相同數值x但不同量子指數的十進位制浮點型別的浮點常量,例如1230.dd1230.0dd1.23e3dd,具有可區分的內部表示。

十進位制浮點型別浮點常量的量子指數q的確定方式是,如果可能,10q
表示有效數字最後一位的位置的1。如果上述確定的量子指數q和係數c=x·10-q
不能在浮點常量的型別中精確表示,則在型別限制內根據需要增加q,並相應減少c,並進行必要的舍入。舍入可能導致零或無窮大。如果在q達到最大值後,(可能經過舍入的)c仍然超出允許範圍,則生成的浮點常量的值為正無窮大。

(自 C23 起)

[編輯] 注意

當浮點常量轉換為內部表示時,預設的舍入方向精度生效,即使 #pragma STDC FENV_ACCESS生效,也不會引發浮點異常(對於字元字串的執行時轉換,可以使用strtod)。請注意,這與浮點型別的算術常量表達式不同。

浮點常量中的字母不區分大小寫,但十進位制浮點型別字尾中不能同時使用大寫和小寫字母(C23 起)0x1.ep+30X1.EP+3表示相同的浮點值15.0

setlocale指定的十進位制小數點對浮點常量的語法沒有影響:小數點字元始終是句點。

與整數不同,並非所有浮點值都可以透過十進位制甚至十六進位制(C99 起)常量語法直接表示:宏NANINFINITY以及諸如nan的函式提供了生成這些特殊值的方法(C99 起)。請注意,0x1.FFFFFEp128f,它可能看起來是IEEE浮點NaN,但實際上在該格式中會溢位為無窮大。

沒有負浮點常量;像-1.2這樣的表示式是將算術運算子一元減應用於浮點常量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+3
0x1.ep+3 = 15.000000
+2.0e+308 --> inf
+1.0e-324 --> 0
-1.0e-324 --> -0
-2.0e+308 --> -inf

[編輯] 參考資料

  • C23 標準 (ISO/IEC 9899:2024)
  • 6.4.4.2 浮點常量 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 6.4.4.2 浮點常量 (p: 47-48)
  • C11 標準 (ISO/IEC 9899:2011)
  • 6.4.4.2 浮點常量 (p: 65-66)
  • C99 標準 (ISO/IEC 9899:1999)
  • 6.4.4.2 浮點常量 (p: 57-58)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 3.1.3.1 浮點常量

[編輯] 參閱

C++ 文件,關於浮點字面量