2017-09-14 230 views
0

我想知道爲什麼雙精度和單精度數有時相等,有時不相等。因爲當我下面舉個例子,他們是不相等的:雙精度和單精度浮點數?

import numpy as np 

x=np.float64(1./3.) 
y=np.float32(1./3.) 

但以下是平等的:

x=np.float64(3.) 
y=np.float32(3.) 

我明白爲什麼第一套X和Y是不相等的,但我不是很肯定爲什麼第二套是平等的。

回答

1

這個答案假定單個是IEEE 754 32位二進制浮點,double是相應的64位類型。

任何可以準確表示爲單個值的值也可以精確地表示爲雙精度值。 3.0的情況就是這樣。最接近的單個和最接近的兩個都具有恰好3的值,並且是相等的。

如果一個數字不能準確地表示在一個單一的,雙重可能是一個更接近的近似和不同於單一。這是1.0/3.0的情況。最接近的一個是0.3333333432674407958984375。最接近的兩倍是0.333333333333333314829616256247390992939472198486328125。

單和雙是二進制浮點。除非等於表格A/(2**B)的一部分,否則不能正確表示數字,其中A是整數,B是自然數,「**」表示指數。諸如終止小數部分但不終止二進制部分的數字(如0.1和0.2)表現得像1/3.0。例如,與0.1最接近的單數是0.100000001490116119384765625,最接近的兩倍是0.1000000000000000055511151231257827021181583404541015625

+0

第一個不等式對於像0.2這樣的數字實際上是成立的。如果我有x = np.float64(0.2)和y = np.float32(0.2),當我做x == y它會打印出False。是不是0.2在一個單一的? – MSB

+0

@MSB我已在回答中回覆了您的評論。 –

1

想象一下,您必須用有限的位數表示基數10中的1/3。

有了2個位數(我們稱之爲單精度),這將是0.33
隨着4位(雙精度),這將是0.3333
因此,兩者近似是不相等的。

現在轉這在基地2代表1/5還需要位無限多的(二進制位) - 這是0.001100110011 ....

隨着24位有效位數(IEEE 754單精度)和53 bits significant(雙精度),兩個浮點近似值將會不同。

同樣爲1/3 ...

如果該數量可以精確地表示在沒有單精度近似,那麼兩個表示將相等。

這是一個小於25位(無尾隨零)的分子擬合和一個分母是2的冪(但分子或分母都不是指數太高)。

例如1/2 3/2 5/2 ... 1/4 3/4 5/4等...將具有相等的表示。

2^24 + 1將不具有相同的表示。
但2^60會。

有時表示將不準確,但是近似將是相同的另一種情況下:
2^54 + 1將具有相同的浮點和雙精度近似。例如
因此將1 + 2^-60。