單精度和雙精度數值型別最早出現在c語言中(比較通用的語言裡面),在c語言中單精度型別稱為浮點型別(float),顧名思義是通過浮動小數點來實現資料的儲存。這兩個資料型別最早是為了科學計算而產生的,他能夠給科學計算提供足夠高的精度來儲存對於精度要求比較高的數值。但是與此同時,他也完全符合科學計算中對於數值的觀念:
當我們比較兩個棍子的長度的時候,一種方法是並排放著比較一下,一種方法是分別量出長度。但是事實上世界上並不存在兩根完全一樣長的棍子,我們測量的長度精度受到人類目測能力和測量工具精度的限制。從這個意義上來說,判斷兩根棍子是否一樣長絲毫沒有意義,因為結果一定是false,但是我們可以比較他們兩個哪個更長或者更短。這個例子很好地概括了單精度/雙精度數值型別的設計初衷和存在意義。
基於上述認識,單精度/雙精度數值型別從一開始設計的時候,就不是乙個準確的數值型別,他只保證在他這個數值型別的精度之內是準確的,精度之外則不保證,比方說,乙個數值5.1,很可能儲存在單精度/雙精度數值中的實際值是5.100000000001或者5.09999999999999。
實現
單精度浮點數在機內佔4個位元組,用32位二進位制描述。
雙精度浮點數在機內佔8個位元組,用64位二進位制描述。
浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。
數符佔1位二進位制,表示數的正負。
指數符佔1位二進位制,表示指數的正負。
尾數表示浮點數有效數字,0.******x,但不存開頭的0和點
附錄——有效數字
1)「0」在數字前,僅起定位作用,「0」本身不是有效數字,如0.0275中,數字2前面的兩個0都不是有效數字,這個數的有效數字只有3位。
2)「0」在數字中,是有效數字。如2.0065中的兩個0都是有效數字,2.0065有5位有效數字。
3)「0」在小數的數字後,也是有效數字如6.5000中的3個0都是有效數字。0.0030中數字3前面的3個0不是有效數字,3後面的0是有效數字。所以,6.5000是5位有效數字。0.0030是2位有效數字
4)以「0」結尾的正整數,有效數字的位數不定。如54000,可能是2位,3位或4位甚至5位有效數字。這種數應根據有效數字的情況改寫為指數形式。如為2位,則寫成5.4×10
4;如為3位,則寫成5.40×10
4,等等。
指數存指數的有效數字。
指數佔多少位,尾數佔多少位,由計算機系統決定。
可能是數符加尾數佔24位,指數符加指數佔8位 -- float.
數符加尾數佔48位,指數符加指數佔16位 -- double.
知道了這四部分的佔位,按二進位制估計大小範圍,再換算為十進位制,就是你想知道的數值範圍。
對程式設計人員來說,double 和 float 的區別是double精度高,有效數字16位,float精度7位。但double消耗記憶體是float的兩倍,double的運算速度比float慢得多,c語言中數學函式名稱double 和 float不同,不要寫錯,能用單精度時不要用雙精度(以省記憶體,加快運算速度)。
雙精度,單精度和半精度
浮點數是計算機上最常用的資料型別之一,有些語言甚至數值只有浮點型 perl,lua同學別跑,說的就是你 常用的浮點數有雙精度和單精度。除此之外,還有一種叫半精度的東東。雙精度64位,單精度32位,半精度自然是16位了。半精度是英偉達在2002年搞出來的,雙精度和單精度是為了計算,而半精度更多是為了降...
高精度乘單精度
沒壓位的 舉個例子,12345 5 ans 5 4 3 2 1 y 5一變 25 4 3 2 1 x 0 5 25 10 4 3 2 1 x 2 25 10 二變 5 22 3 2 1 x 0 5 2 22 10 3 2 1 x 2 22 10 三變 5 2 17 2 1 x 0 5 2 7 2 1...
高精度乘單精度
沒壓位的 舉個例子,12345 5 ans 5 4 3 2 1 y 5一變 25 4 3 2 1 x 0 5 25 10 4 3 2 1 x 2 25 10 二變 5 22 3 2 1 x 0 5 2 22 10 3 2 1 x 2 22 10 三變 5 2 17 2 1 x 0 5 2 7 2 1...