浮點數的數據結構


周末在家,重新學習了一下以前不太懂的知識點。浮點數和數據結構。

 

1 什么是浮點數?

通俗來說帶有小數點的數都是浮點數。比如1.1,121.212,-1.11,-222.111

 

2 在JAVA中常用表示浮點數的類型是什么?區別是什么?

在JAVA中,通常使用的浮點數的類型為 FLoat和Double,他們的區別在於大小與儲存方式不同

public class App {
    public static void main(String[] args) {
        System.out.println("Float:"+Float.SIZE);
        System.out.println("Double:"+Double.SIZE);
    }
}
Float:32
Double:64

從這里可以看出FLoat是32位的,Double是64位

Float的儲存結構          0        00000000 00000000000000000000000

                            符號位1     階數位8      小數位23(8388607(7位十進制)<9999999(7位十進制))所以他的精度是保證6但不到7

Double的儲存結構      0        00000000000    0000000000000.。。。。。。。。。。。。。。。。

                            符號位1     階數位11     小數位52---------這個就很多了

3 浮點數二進制源碼如何轉換成對應的FLOAT和DOUBLE的數據結構呢?

這里有幾個步驟 

step1 得到 二進制浮點數源碼 比如1010101.101011011

step2 二進制源碼轉換為二進制科學計數法1.010101101011011E0110(0110表示<<6)

step3 E0110轉換成階碼,如果是FLOAT的階位轉換是0110+1111111(7位)Double的階位轉換是0110+1111111111(10位) 

step4 按照浮點數的儲存結構來存放咯。

 

4 做一道例題(摘自網上)

    public static void main(String[] args) {
        float f_v1 = 20;
        float f_v2 = 20.3f;
        float f_v3 = 20.5f;
        double d_v1 = 20d;    
        double d_v2 = 20.3d;
        double d_v3 = 20.5d;
        System.out.println(f_v1==d_v1);
        System.out.println(f_v2==d_v2);
        System.out.println(f_v3==d_v3);
    }
true
false
true

第一題和第三題的TRUE的原因是,二進制浮點數的位數比較少,小於Float的23位,所以Float完全能精確到

第二題中的FLASE的原因是,0.3的二進制浮點數是一個無線循環小數,超過了Float的23位,Float進行了截短到23位,而Double有52位,所以2者不相同。

知道了原理后,我們怎么讓他變成TRUE呢?

    public static void main(String[] args) {
        float f_v2 = 20.3f;
        double d_v2 = (float)20.3d;
        System.out.println(f_v2==d_v2);
    }
true

很簡單,我們去按照Float類型截短一下就OK了。

 

5 幫助小貼士-如何轉換10進制浮點數-->2進制源碼

10進制20.3

step1 整數部分 20-->10100

計算過程:

除法    是否有余數 

20/2    0

10/2    0

5/2      1

2/2      0

1/2      1

step2 小數部分 0.3-->010011001100。。。

計算過程

0.3*2 = 0.6     0

0.6*2 =  1.2    1

0.2*2 = 0.4     0

0.4*2 = 0.8     0

--------------

0.8*2 = 1.6     1

0.6*2 = 1.2     1

0.2 *2 = 0.4    0

0.4*2 = 0.8     0

--------------

...                  1

...                  1

...                  0

...                  0

step3 整合整數和小數部分 10100.010011001100

如果需要轉換成Float或者Double的話,參照上面文中的流程

1 轉科學計數法

2 指數部分轉換為階數位(Float是127,Double是1023)

3 按值填入數據結構中

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM