2014-07-07 39 views
0

下面的表達式計算爲true的Ruby 1.9:integer-float比較如何工作?

31964252037939931209 == 31964252037939933000.0 
# => true 

,但我不知道這是怎麼發生的。我在這裏錯過了什麼嗎?

+0

評估爲假我的系統上.. – dax

+0

不適合我在1.9.3 – shiva

+2

'31964252037939931209.to_f#=> 31964252037939933000.0'(紅寶石1.9.3) – Stefan

回答

1

在這樣的比較中,Ruby用於將bignums轉換爲浮點數,並且轉換精度丟失。 The issue is solved in more recent versions

+1

Ruby 2.0並沒有給你更多的浮點精度,轉換隻是以另一種方式完成:'31964252037939933184 == 319642520379399330004#=> true' – Stefan

0

在這裏,您可以看到比較器的源代碼的Ruby:

http://www.ruby-doc.org/core-1.9.3/Comparable.html#method-i-3D-3D

,似乎是用這個實際的比較器:

https://github.com/p12tic/libsimdpp/blob/master/simdpp/core/cmp_eq.h

的methood似乎比較使用這個:

/** Compares 8-bit values for equality. 

@code 
r0 = (a0 == b0) ? 0xff : 0x0 
... 
rN = (aN == bN) ? 0xff : 0x0 
@endcode 

@par 256-bit version: 
@icost{SSE2-AVX, NEON, ALTIVEC, 2} 
*/ 

我的猜測可能是這兩個數字的值都是一樣的。

3

說明很簡單,用於在計算機上表示浮點(即十進制)數字的標準方法本質上是不準確的,並且僅提供近似表示。這不是特定於Ruby的;在你的問題中顯示的類型錯誤幾乎在每種語言和每個平臺上都會出現,你只需要意識到它們可能會發生。

試圖將大整數值在你的例子轉換爲浮點說明該問題的更好一點—可以看到翻譯無法提供一個確切的表示:

irb(main):008:0> 31964252037939931209.to_f 
=> 31964252037939933000.0 

維基百科的article on floating pointa more thorough discussion of accuracy problems與更多的例子。