浮點常數
允許將浮點型別的值直接用於運算式中。
目錄 |
[編輯] 語法
浮點常數是一種非左值 (non-lvalue) 運算式,其形式為
| 有效位數 (significand) 指數 (exponent) (可選) 後綴 (suffix) (可選) | |||||||||
其中 有效位數 的形式為
整數部分 (whole-number) (可選) .(可選) 分數部分 (fraction) (可選) |
|||||||||
指數 的形式為
e | E 指數符號 (可選) 數字序列 |
(1) | ||||||||
p | P 指數符號 (可選) 數字序列 |
(2) | (自 C99 起) | |||||||
|
可在數字之間插入單引號 ( |
(C23 起) |
[編輯] 說明
|
若 有效位數 以字元序列 對於「十六進位浮點常數」,有效位數 被解釋為十六進位有理數,而指數的 數字序列 被解釋為有效位數需進行縮放的 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。若 後綴 為字母 f 或 F,則該浮點常數型別為 float。若 後綴 為字母 l 或 L,則該浮點常數型別為 long double。
|
若實作預定義了巨集
十六進位浮點常數不允許使用十進位浮點型別的後綴。 |
(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)
|
對於十六進位浮點常數,指數部分不可省略,以避免因 |
(自 C99 起) |
[編輯] 可表示的值
評估浮點常數的結果為最接近的可表示值,或是最接近值相鄰的較大或較小可表示值,其選擇方式由實作定義(換句話說,編譯期間的預設捨入方向由實作定義)。
相同原始形式的所有浮點常數會轉換為具有相同值的相同內部格式。不同原始形式的浮點常數(例如 1.23 和 1.230)不一定會轉換為相同的內部格式和值。
|
若 FLT_EVAL_METHOD 有指示,浮點常數可能會轉換為比其型別所指示的範圍和精度更高。例如,常數 0.1f 在運算式中可能會表現得如同 0.1L 一樣。 若 FLT_RADIX 為 2,評估十六進位浮點常數的結果即為浮點常數所代表的精確值,並正確捨入至目標型別。 |
(自 C99 起) |
|
具有相同數值 x 但不同量級指數 (quantum exponents) 的十進位浮點型別常數(例如 1230.dd、1230.0dd 和 1.23e3dd)具有可區分的內部表示。 十進位浮點型別常數的量級指數 q 的確定方式是,盡可能使 10q |
(C23 起) |
[編輯] 附註
當浮點常數轉換為內部表示時,預設的捨入方向與精度生效,即使 #pragma STDC FENV_ACCESS 生效時也不會引發浮點異常(若需執行期字串轉換,可使用 strtod)。請注意,這與浮點型的算術常數運算式不同。
浮點常數中的字母不區分大小寫,但十進位浮點型別的後綴不可同時混用大小寫(自 C23):0x1.ep+3 和 0X1.EP+3 代表相同的浮點值 15.0。
由 setlocale 指定的小數點對浮點常數的語法沒有影響:小數點字元始終是句號。
與整數不同,並非所有浮點值都能直接透過十進位甚至十六進位(自 C99)常數語法表示:巨集 NAN 和 INFINITY 以及諸如 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++ 文件 關於 浮點字面量
|