什麼是在這種情況下不扔 例外的理由?這是一個 IEEE標準,還是僅僅是由Java的設計者選擇的 ?
的IEEE 754-1985標準下的部分將NaN 2.2.1 20和21和2.2.2頁無限清楚地解釋了爲什麼標準所要求的NAN和無限價值的原因。所以這不是Java的事情。
Java Virtual Machine Specification的3.8.1 Floating Point Arithmetic and IEEE 754指出,當轉換爲整數類型時,JVM將向零舍入,這將解釋您看到的結果。
該標準確實提到了一個名爲「陷阱處理程序」的功能,可用於確定何時發生溢出或NAN,但Java虛擬機規範明確指出這不是針對Java實現的。它說,在第3.8.1:
的 Java虛擬機的浮點運算不會拋出異常 ,陷阱,或否則爲零信號 無效操作,除法的IEEE 754特殊條件, 溢出,下溢或不準確。 Java虛擬機沒有信號傳遞 NaN值。
因此,不管後果如何,行爲不是未指定的。
是我 不知道如果例外是 用這樣的石膏有不好的後果?
理解標準中陳述的原因應該足以回答這個問題。該標準用詳盡的例子解釋了你在這裏要求的結果。我會發布它們,但這將是太多的信息,並且這些示例可能無法在此版本工具中適當地進行格式化。
編輯
我讀Java Virtual Machine Specification的最新維護審查由JCP最近出版作爲其工作的一部分,對JSR 924並在部分2.11.14命名類型轉換istructions包含一些更多的信息可以幫助你尋找答案,而不是你在找什麼,但我相信它有一點幫助。它說:
在 浮點值的到一個組成 類型T,其中T是int或長變窄數字轉換, 浮點值轉換 如下:
- 如果浮點值是NaN,則轉換的結果是一個
int或長0
- 否則,如果浮點值不是無限大,則
浮點值四捨五入爲
整數值V使用IEEE 754
向零模式回合。
有兩種情況:
- 如果T是長且該整數的值可以被表示爲一個長期的,然後
結果是長值V.
- 如果T是int類型和該整數值可表示爲 一個int,則結果是整型 值V.
否則:
- 要麼值必須是太小, (大 量值或負無窮大的負值),其結果是int類型或 長的最小 表示值。
- 還是值必須是太大了,結果
(幅度大或
正無窮大的正值)是 類型爲int或長最大可表示值。
從 甲縮小數字轉換雙浮動的行爲根據用 IEEE 754的結果是正確 使用IEEE 754輪 最接近的模式圓形。一個值太小,不能被 表示爲浮點數,將被轉換爲 類型爲 float的正數或負數零;一個值太大而不能被表示爲浮動的 轉換爲 正或負的無窮大。 A 雙NaN總是被轉換爲 浮點NaN。
儘管精度 溢出, 下溢,或損失可能發生,縮小之間 數字類型的轉換從未引起 Java虛擬機拋出 運行時異常的事實(不要混淆 與IEEE 754浮點數 例外)。
我知道這只是重申你已經知道的內容,但它有一條線索,看起來IEEE標準有一個要舍入到最近的要求。也許你可以找到這種行爲的原因。
編輯
IEEE標準在第2.3.2節舍入模式的國家的問題:
通過 默認情況下,圓整裝置向周圍的 最近 。該標準要求提供三種其他的圓整模式;即朝向 0,向+無窮大旋轉並朝向-Infinity。
與轉換爲整數操作一起使用時,向-Infinity舍入會導致轉換成爲落地函數,而向+ Infinity舍入則爲上限。
模式舍入影響溢出,因爲當輪朝向O或圓形朝向 無窮大是有效的,積極的數量級的溢出導致的默認結果是最大的表示數,而不是正無窮。
類似地,當向+無窮或朝向O周圍有效時,負數的上溢將產生最大的負數。
然後他們繼續提到一個爲什麼這在間隔算術中很有用的例子。不能確定,這是你正在尋找的答案,但它可以豐富你的搜索。
我懷疑的決定,沒有轉換拋出一個異常是由強烈的慾望驅使,以避免拋出異常以任何理由,怕迫使代碼中加入它是一個「拋出」條款。然而,從實際的角度來看,如果代碼嘗試將浮點數轉換爲整數並且不適合,代碼不太可能正常工作,因此異常可能比僞造數據更好。 – supercat 2014-02-12 00:22:09