2013-02-20 37 views
6

在Scala中,整數算術div除以零拋出java.lang.ArithmeticException:/by zero,但浮點算術(1.0/0.0)返回Double.Infinity似乎不一致。scala:爲什麼是1/0算術異常,但1.0/0.0 = Double.Infinity

我知道從類型的角度來看,同時擁有Double.Infinity和Integer.Infinity可能會非常棘手,但我認爲使用scala的強大類型系統,他們可能已經想出了一些其他方法來解決問題。

還有什麼我錯過了,會更好地解釋這兩種不同的行爲?

+0

此行爲來自JVM,不是特定於Scala的任何內容。 – 2013-02-20 22:50:15

回答

15

這是硬件限制,不是軟件之一,原因很簡單:IEEE754浮點運算明確支持+Inf-Inf,即有對應於這兩種觀念位表示,因此,它是有道理的,他們是1.0/0.0的結果。

在普通處理器中實現的整數算術沒有無窮的內部表示,因此必須拋出錯誤。

您可以在軟件中實現一個支持無限的整數類型,但由於除法運算不會直接對應處理器的指令 的指令,所以速度會更慢。這在我看來是不明智的:由於(a)算法的實現不正確或者(b)未能正確驗證用戶輸入,因此整數除零錯誤總是爲,這兩者都是基本問題,必須在你編譯你的代碼之前解決,而不是在運行時通過異常!另一方面,在FP算術中,當你不(但實際上不能)期望它時,你很容易遇到div-by-0:1e-308/1e+308具有正確的值,但它不能表示爲double,即使兩個操作數都是。

+0

你說「它會變慢」。是的,如果您需要在每個部門之前檢查零*。但是,難道你不能正常分裂,然後抓住任何例外嗎? (我根本不知道scala。) – 2013-02-20 22:18:02

+0

和你一樣,我不知道在scala中沒有發現異常的'try-catch'塊是否會帶來很多開銷。更重要的問題是,如果你想傳播無窮大,你需要再次將你的類型裝箱 - 這可能不是一個好主意,因爲*它們不應該發生在整數算術*中。我會添加一段關於上述原因的段落。 – us2012 2013-02-20 22:27:37

+0

@Joseph我已經添加了一段話來解釋爲什麼我認爲int-div-by-0應該總是一個錯誤,而將float-div-by-zero換成不同的值是有意義的。 – us2012 2013-02-20 22:46:35