java中的float和double的精度問題

此文解釋了爲什麼float的範圍比int大(一樣4字節),但有些int是float沒法正確表達的(精度丟失)java


java中的float和double的精度問題
c++

 

一、背景知識 
在java中沒有細講,只是講了float佔32位(bit),double佔 64位。 
對於計算機來講,用位數表示是合適的。但有人喜歡用字節(byte)表示。一個字節佔8位。 
1 byte = 8 bit. 
因此float佔4個字節,double佔8個字節。 
不過我仍是喜歡用位數表示。這樣更直接,也更容易理解計算機是怎麼存儲這些類型的。 

對於精度和範圍,仍是參考一下c++吧。 


二、存儲知識 
計算器存儲浮點數的方法:(用科學計數法存儲) 
將要存的數先轉換爲小數(0.xxxxxx)x10的n次冪的形式進行存儲。 
例如: 
3.1415 將被轉換爲:0.31415 x 10^1 
100000 將被轉換爲:0.1 x 10^6 

首先申明一點,先範圍(有效數字位,包括整數位和小數位),再精度。 


三、下面切入正題 
===================== 
在c++中單精度float類型與雙精度double類型的問題 

【"單精度用float表示,在計算機中使用4位字節(32位bit)來表示,具備7位有效數字"】 

float類型存儲的時候1個bit是符號位,8個bit是指數位,剩下的23個bit是有效數字位。 
2的23次方是8388608,即7位有效數字,精度(10進制)。 

一個單精度的浮點數在內存當中佔用了32個bit位,按照浮點數的表示標準,最高位表示符號,這32位一部分用來表示階碼,一部分用來表示小數部分。 
按照這個表示方法轉化成10進制以後,它能表示的最高精度是7位有效數字。 

好比 
float a=3.14159;a在內存中實際上表示爲0.314159乘以10的1次方(0是符號位),而分配給a的存儲單元就分爲兩部分,一部分存0.314159,一部分存指數1,並且也都是轉化爲2進制來存。 

================== 
float ,1位符號位, 8位指數位,23位尾數位 
double,1位符號位,11位指數位,52位尾數位 

float尾數位23位,2^23=8.3E6,7位,因此不一樣的編譯器規定不一樣,有些是7位,有些8位 
double尾數52位,2^52=4.5E15,15位,因此double的有效位數是15位 內存


後記: 
數一下有效數字位數(整數位+小數位),7位之內的用float,15位之內的用double 
可是還有一點小小的區別: 
float f =  (float) 62345678.912345;  // => 6.234568E7  共 7 位 
float f2 =  (float) 12345678.912345; // => 1.2345679E7 共 8 位 編譯器

(精度問題,float精度爲7--8位,8位的狀況是第一位是1,當是2時進位後面的精度丟失?)it

相關文章
相關標籤/搜索