無論是單精度還是雙精度在儲存中都分為三個部分:
符號位(sign) : 0代表正,1代表為負
指數字(exponent):用於儲存科學計數法中的指數資料,並且採用移位儲存
尾數部分(mantissa):尾數部分1範圍
float
和double
的範圍是由指數的位數來決定的。
float
的指數字有
8位,而
double
的指數字有
11位,分布如下:
float
:1bit
(符號位)
8bits
(指數字)
23bits
(尾數字)
double
:1bit
(符號位)
11bits
(指數字)
52bits
(尾數字)
在數學中,特別是在計算機相關的數字(浮點數)問題的表述中,有乙個基本表達法[1]:
value of floating-point
= significand x base ^ exponent , with sign --- f.1
譯為中文表達即為:
(浮點)數值 = 尾數 × 底數 ^ 指數,(附加正負號)---------------- f.2
於是,float
的指數範圍為
-127~128
,而double
的指數範圍為
-1023~1024
,並且指數字是按補碼的形式來劃分的。其中負指數決定了浮點數所能表達的絕對值最小的數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。
float
的範圍為
-2^128 ~ +2^128
,也即-3.40e+38 ~ +3.40e+38
;(2表示底數,二進位制中只有0和1,要想值最大,則尾數字應全為1,即:
1.1111111111111111111111,所以:1.111111... * 2*128 約等於 2^128,換成十進位制就是3.40e+38。負數同理)
double
的範圍為
-2^1024 ~ +2^1024
,也即-1.79e+308 ~ +1.79e+308
。(double型別同理) 2
精度float
和double
的精度是由尾數的位數來決定的。浮點數在記憶體中是按科學計數法(二進位制的科學計數法)來儲存的,其整數部分始終是乙個隱含著的「
1」(即如果為011這種,前面的0是什麼用的,就等於11),由於它是不變的,故不能對精度造成影響。
float
:2^23 = 8388608
,一共七位,這意味著最多能有
7位有效數字(第七位可能由它的後面一位做了捨入操作),但絕對能保證的為
6位,也即
float
的精度為
6~7位有效數字;
double
:2^52 = 4503599627370496
,一共16
位,同理,
double
的精度為
15~16位。
浮點數精度問題
一 例子 首先我們去編譯器試試 double a 1.9 通過新增監視檢視a的值 會發現a的值是1.8999999 二 開始今天的學習 在最開始學c 的時候並沒有對浮點數進行很深入的學習,認為浮點不就是小數嘛,首先在c 的巨集裡面有 flt max 和 flt min 的定義,float是四位元組的...
浮點數精度之謎
話要從業務 裡的bug說起,大致過程是前端運算 2.07 1 之後結果卻是1.0699999999999998,老司機們都知道是浮點數運算的精度丟失導致的,在檢視了下具體 果然處理不當。因此我深究一番,並誕生了此文。此處重點強調兩個認識誤區 首先不得不說說浮點數的表示方法,任何數在計算機面前都會被處...
PHP 浮點數的精度
浮點數的精度有限。儘管取決於系統,php 通常使用 ieee 754 雙精度格式,則由於取整而導致的最大相對誤差為 1.11e 16。非基本數 算可能會給出更大誤差,並且要考慮到進行復合運算時的誤差傳遞。此外,以十進位制能夠精確表示的有理數如 0.1 或 0.7,無論有多少尾數都不能被內部所使用的二...