共找到5條詞條名為FLOAT的結果 展開
FLOAT
數據類型
浮點型數據類型,FLOAT數據類型用於存儲單精度浮點數或雙精度浮點數。浮點數使用IEEE(電氣和電子工程師協會)格式。浮點類型的單精度值具有4個位元組,包括一個符號位、一個8位excess-127二進位指數和一個23位尾數。尾數表示一個介於1.0和2.0之間的數。由於尾數的高順序位始終為1,因此它不是以數字形式存儲的。此表示形式為float類型提供了一個大約在-3.4E+38和3.4E+38之間的範圍。
構成
浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。
數符佔1位二進位,表示數的正負。
指數符佔1位二進位,表示指數的正負。
尾數表示浮點數有效數字,0.xxxxxxx,但不存開頭的0和點。
指數存指數的有效數字。
指數佔多少位,尾數佔多少位,由計算機系統決定。
區別
可根據應用程序的需求將變數聲明為float或double。這兩種類型之間的主要差異在於它們可表示的基數、它們需要的存儲以及它們的範圍。
取值範圍
類型 | 比特數 | 有效數字 | 數值範圍 |
---|---|---|---|
float | 32 | 6-7 | -3.4*10(-38)~3.4*10(38) |
double | 64 | 15-16 | -1.7*10(-308)~1.7*10(308) |
longdouble | 128 | 18-19 | -1.2*10(-4932)~1.2*10(4932) |
浮點變數由尾數(包含數字的值)和指數(包含數字的數量級)表示。
下表顯示了分配給每個浮點類型的尾數和指數的位數。任何float或double的最高有效位始終是符號位。如果符號位為1,則將數字視為負數;否則,將數字視為正數。
指數和尾數
類型 | 指數長度 | 尾數長度 |
---|---|---|
float | 8位 | 23位 |
double | 11位 | 52位 |
由於指數是以無符號形式存儲的,因此指數的偏差為其可能值的一半。對於float類型,偏差為127;對於double類型,偏差為1023。您可以通過將指數值減去偏差值來計算實際指數值。
存儲為二進位分數的尾數大於或等於1且小於2。對於float和double類型,最高有效位位置的尾數中有一個隱含的前導1,這樣,尾數實際上分別為24和53位長,即使最高有效位從未存儲在內存中也是如此。
浮點包可以將二進位浮點數存儲為非標準化數,而不使用剛剛介紹的存儲方法。“非標準化數”是帶有保留指數值的非零浮點數,其中尾數的最高有效位為0。通過使用非標準化格式,浮點數的範圍可以擴展,但會失去精度。您無法控制浮點數以標準化形式還是非標準化形式表示;浮點包決定了表示形式。浮點包從不使用非標準化形式,除非指數變為小於可以標準化形式表示的最小值。
下表顯示了可在每種浮點類型的變數中存儲的最小值和最大值。此表中所列的值僅適用於標準化浮點數;非標準化浮點數的最小值更小。請注意,在80x87寄存器中保留的數字始終以80位標準化形式表示;數字存儲在32位或64位浮點變數(float類型和long類型的變數)中時只能以非標準化形式表示。
類型 | 最小值 | 最大值 |
---|---|---|
float | 1.175494351E–38 | 3.402823466E+38 |
double | 2.2250738585072014E–308 | 1.7976931348623158E+308 |
如果存儲比精度更重要,請考慮對浮點變數使用float類型。相反,如果精度是最重要的條件,則使用double類型。
浮點變數可以提升為更大基數的類型(從float類型到double類型)。當您對浮點變數執行算術時,通常會出現提升。此算術始終以與具有最高精度的變數一樣高的精度執行。例如,請考慮下列類型聲明:
floatf_short;doublef_long;longdoublef_longer;f_short=f_short*f_long;
在前面的示例中,變數f_short提升到類型double並且與f_long相乘;然後,結果舍入到類型float,然後賦給f_short。
在以下示例中(使用前面示例中的聲明),將以浮點(32位)精度對變數執行算術;結果隨後將提升到double類型:
f_longer=f_short*f_short;
doublef_long;
longdoublef_longer;
f_short=f_short*f_long;
在前面的示例中,變數f_short提升到類型double並且與f_long相乘;然後,結果舍入到類型float,然後賦給f_short。
在以下示例中(使用前面示例中的聲明),將以浮點(32位)精度對變數執行算術;結果隨後將提升到double類型:
f_longer=f_short*f_short;
在C和C++中,如下賦值語句:
1 | floata=0.1; |
編譯器報錯:warningC4305:'initializing':truncationfrom'constdouble'to'float'
原因:在C/C++中,上述語句等號右邊0.1,認為是個float,但是編譯器卻把它認為是個double(因為小數默認是double),所以要報這個warning,一般改成0.1f就沒事了。