知道單精度和雙精度,有沒有3精度4精度5精度………………無限精度?

同上

一個浮點數:1.3333333333333………

越往右延伸就越精確,越往左延伸就越模糊。可以無限往右延伸,能不能無限往左延伸?用程序語言怎麼表達?比如python、c++…………


四精度:Quadruple-precision floating-point format

八精度:Octuple-precision floating-point format

目前所有CPU的指令集直接支持單精度和雙精度的計算,部分特殊CPU的指令集直接支持四精度,而八精度,在硬體層面並無實現,只能用軟體模擬

浮點數的標準原本就是用32位表示的,這個就是單精度。後來覺得不夠精確,所以就用64位表示,這就是雙精度,因為位數翻了翻。

標準的單精度在十進位裡面可以精確表示7位有效數字,再多就不精確了。標準的雙精度可以精確表示15~17位有效數字。

其實題主只需要記住用法就好了,不用扣那麼細。想要詳細了解為什麼浮點數不夠精確,看這篇單精度的wiki就好了:Single-precision floating-point format

我做一個簡略的解釋,因為浮點數是二進位,所以只能用2的次方表示,他有一個指數部分和一個小數部分。

先理解什麼是小數部分,0.5對浮點數來說,是2^{-1} ,0.25對浮點數來說是2^{-2}

那麼怎麼表示0.75呢,是2^{-1} +2^{-2} ,這樣看起來皆大歡喜,這些數都能精確表示。

然而,碰到0.3呢,就只有一臉蒙蔽了,為啥,因為0.3不能精確拆成2的次方,最後只能儘可能的精確成0.3000000,至於第7個0後面是啥,單精度浮點數就不管了。

實際上的浮點數實現中,小數部分會加1,變成1.XXXXXX,這樣。

指數部分也是二的次方,舉一個簡單的例子,24,在浮點數裡面,24的指數部分是2^{4} ,小數部分是 1+2^{-1} ,24用浮點數表示就是2^{4} 	imes left( 1+2^{-1}  
ight)

在上面的例子中,0.5完整的用浮點數表示是2^{-1} 	imes 1.0,指數部分是2^{-1} ,小數部分是 1.0;

0.25完整的用浮點數表示是2^{-2} 	imes 1.0,指數部分是2^{-2} ,小數部分是 1.0;

0.75完整的用浮點數表示是2^{-1} 	imes left( 1+2^{-1}  
ight) ,指數部分是2^{-1} ,小數部分是1+2^{-1}


除了常見的單精度(Single)和雙精度(Double)以外,浮點數的種類還有很多~

比如x86的擴展精度(Extended,80位):

四倍精度(Quadruple,128位):

八倍精度(Octuple,256位):

當然還有更小的半精度(Half,16位):

還有非標準的迷你浮點數(Minifloat,8位),不過這貨太小了也沒啥用……

需要更大的精度的話就直接上高精度計算吧(逃

註:圖片均來自於Wikipedia

---------------- 關於浮點數的表示法 ----------------

其實浮點數的表示可以簡單地理解為「科學計數法」,也就是說以類似於

(-1)^{sign} cdot fraction cdot 2^{exponent}

的形式進行表示。其中小數部分 fraction in [ 1, 2 ),也就是說代表一個 1.xxxxx 的小數, fraction 的位數越多,浮點數就越精確。而指數部分 exponent 的位數越多,浮點數能夠表示的範圍也就越大。除此之外還有 ±0、±Inf、NaN 等特殊值。


程序寫出來是為了解決實際問題的。

地球上大約有10^50個原子,轉換成二進位大約是2^167。也就是說,當你的fraction的部分超過167的時候(比如有人提到的八倍精度,236位fraction),你去用這個值來表示地球上的原子數,誤差就不會超過一個了。我們可觀測宇宙中的原子數大約是10^80,也就差不多是2^267,用上面的八倍精度,會有2^30左右的誤差,大約是10^9也就是10億個。10億很多麼?這比構成人類DNA的原子數還少了不止一個數量級。換言之,用八位精度的浮點數來計算宇宙中的原子數,誤差是少於一個精子的。

請問,你要這麼高的精度,有啥子用?在數值計算上基本已經失去了意義。

當然,「絕對正確」在數學上有時候是重要的。然而就計算機的本質來說,用浮點數的方法,無論你精度做得多高,都無法達到所謂「絕對正確」。因此在精度足夠數值計算之後為精度做出的努力,大多都是徒勞的。

而如果要完成「絕對正確」,就要開發新的數據結構,去保存完整的數據。最簡單的例子,1/3可以保存成分子為1分母為3的一個數據,而非0.333333333……(多少個3都不是1/3)。


請先了解IEEE 754標準,然後再了解高精度計算及符號計算的


有無限精度的

symbolic計算就是。

半精度也有,相應的1/4精度也有。 這些都是以4byte 位單位,1/4不能再少了。

單精度和雙精度的原因是 硬體支持。更高精度大部分就是軟體模擬或者特殊硬體了。


有4精度:https://msdn.microsoft.com/en-us/library/ayeb3ayc.aspx


一般2精度以上就有用無限精度的bigdecimal


精確度 和 效率之間有trade off的。

精確度夠用就行。

假設第15位有效數字之後的微小變動會帶來結果的巨大變化,這問題也太混沌了吧,所以大家都不怎麼關心無限精度的事。


我在想是否可以這樣:先int這個無限的浮點數,使之變成一個整數a,再給a設定一個隨機值,通過改變隨機值的大小來控制a的精度,從而達到使1.3333333能無限往左延伸。

有話好好說,磚頭先放下!


推薦閱讀:

哪位大神知道從安裝hadoop2.7.1到配置文件的所有正確流程啊?
賣烤冷麵一個月凈賺3萬,說法靠譜么?
大數據方向實習生到底該做些什麼?
分析、抽象代數這種課對搞 data science 幫助大嗎?

TAG:Python | 編程 | 數據 | C編程語言 | CC |