2016-07-04 40 views
2

打開一個Scala解釋器。斯卡拉擁有無限但沒有Infinitesimal。爲什麼?

scala> 1E-200 * 1E-200  
res1: Double = 0.0 

scala> 1E200 * 1E200  
res2: Double = Infinity 

一個非常大的產品價值評估爲無窮大。 非常小的值評估爲零。

爲什麼不對稱並創建一個叫Infinitesimal的東西?

+2

所有問題到[IEEE](https://en.m.wikipedia.org/wiki/IEEE_floating_point)。可憐的斯卡拉與它無關。 –

回答

1

基本上這與浮點數的工作方式有關,這與浮點數有關。小數將會很小,以致最接近的表示對應於+0(正零),因此它下溢到0.0。大數將溢出任何有效表示並被+ inf(正無窮)替換。請記住,浮點數是一個固定的精度估計。如果你想要一個更精確的系統,你可以使用http://www.scala-lang.org/api/2.11.8/#scala.math.BigDecimal

+0

Infinitesimal可用於捕獲下溢事件,就像無限用於捕獲溢出事件 – Mike

+0

這不適合作爲估計的浮點角色。雖然IEEE 754中描述了一個下溢異常,但它表示精度的損失,而不是特殊值的存在。有很多東西,如平等測試,浮動不是爲了。讓0.0 == 1E-200 * 1E-200可靠地成爲錯誤是違背了這一點的。 (編輯) – robot1208

+0

'''階> VAL X = 1E200 * 1E200 X:雙=無限 階> VAL Y = 1E200 * 1E200 Y:雙=無限 階> X ==ÿ res8:布爾=真 階> VAL X1 = 1E-200 * 1E-200 X1:雙= 0.0 階> VAL Y1 = 1E-200 * 1E-200 Y1:雙= 0.0 階> X1 == Y1 res9:布爾值= true – Mike

0

Scala,就像Java一樣,遵循IEEE specification for floating point numbers,它沒有「無限小」。我不太確定無限小孩會以任何方式表達意義,因爲他們沒有數學上的數學解釋。

+0

在我看來,Infinitesimal可能是一組值太小而無法適應有限數量的比特,導致精度容量有限。微積分在微積分範圍內確實有一個解釋=>將它做成儘可能小的東西,而不需要把它變成零。 – Mike