命名空間
變體
動作

浮點常數

出自 cppreference.com
< c‎ | 語言

允許將浮點型別的值直接用於運算式中。

目錄

[編輯] 語法

浮點常數是一種非左值 (non-lvalue) 運算式,其形式為

有效位數 (significand) 指數 (exponent) (可選) 後綴 (suffix) (可選)

其中 有效位數 的形式為

整數部分 (whole-number) (可選) .(可選) 分數部分 (fraction) (可選)

指數 的形式為

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 但不同量級指數 (quantum exponents) 的十進位浮點型別常數(例如 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: 待定)
  • 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++ 文件 關於 浮點字面量
English Deutsch 日本語 한국어 中文(简体) 中文(繁體)