浮點數的範圍和精度

2021-07-03 17:58:07 字數 1604 閱讀 7578

無論是單精度還是雙精度在儲存中都分為三個部分:

符號位(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,無論有多少尾數都不能被內部所使用的二...