Java放棄了可移植浮點的哪方面?
Java是以“編寫一次,隨處運行”為口號發布的;而它的采用可能更多的是為了“現在我們有了一種語言,可以在熟悉的工作流中提供垃圾收集,并具有良好的標準庫”,
解答動態
中間結果的范圍。
Java語言規范,第2版。通過引入“FP strict”表達式的概念,放寬了浮點表達式的求值規則,定義如下(§15.4,p.319):
在FP strict表達式中,所有中間值必須是浮點值集或雙值集的元素,這意味著所有FP strict表達式的結果必須是ieee754算術對使用單格式和雙格式表示的操作數所預測的結果。在非FP嚴格的表達式中,允許實現使用擴展的指數范圍來表示中間結果;粗略地說,凈效果,在單獨使用浮點值集或雙值集可能導致溢出或下溢的情況下,計算可能會產生“正確答案”。
實際語義在§5.1.8“值集轉換”中有詳細說明;這兩個部分將在其他部分中引用,這些部分指定規范所考慮的“中間”浮點結果(基本上歸結為所有算術運算,但不是變量賦值或參數傳遞)。
fp strict模式可以通過strictfp關鍵字啟用,該關鍵字可以應用于類(JLS第2版,§8.1.1.3)、方法(§8.4.3.5)和接口(§9.1.1.2)。
此定義在Java 15中一直保持不變(分別為JLS 15、§15.4和§5.1.13)。在第一版中,沒有這樣的“嚴格性”概念,因此所有浮點表達式都是隱式嚴格的。
這與C語言的問題基本相同(參見GCC臭名昭著的bug 323和GCC手冊中的“失望”部分);盡管在Java中,由于規范只允許JVM實現擴展指數范圍,并要求在變量賦值(JLS第2版§5.2)和參數傳遞(§5.3)時嚴格將值四舍五入到它們的標稱類型,因此這一點的影響要小得多。
@超級跑車他的回答更詳細地說明了動機;這也讓我意識到我對規范有點誤讀。
據我所知,除非情況有所改變,否則我認為即使在非嚴格模式下,Java也要求浮點值在尾數中舍入到適當的長度。但是,允許留有余地,其值小于最小標準化浮點值。大多數浮點值應具有24位精度,但幅度在最小標準化值的0.5到1.0倍之間的值應具有23位,幅度在最小標準化值的0.25到0.5倍之間的值應具有22位,等等。許多硬件平臺都有將尾數快速舍入到24位的方法,但是除了將一個值以浮點形式存儲到內存中,然后將其讀回外,無法有效地強制進行與大小相關的舍入。
如果語言提供不同的浮點類型,這些浮點類型具有匹配的表示形式,但語義不同,那么圍繞這些問題的許多爭議是可以避免的,以及一種指定哪個特定類型應該由float或double等關鍵字表示的方法。如果希望通用實現提供顯式選擇語言默認行為的模式,以及使用最有效行為的模式,然后,希望編寫在各種平臺上高效但正確運行的代碼的人可以使用在他們的平臺上運行效率更高的模式和在他們的平臺上運行效率更低但會模仿其他平臺行為的模式來測試他們的代碼。不幸的是,盡管不同的行為對于不同的平臺和目的更有用,但通常的趨勢是試圖推動所有實現以相同的方式處理所有事情。- End
免責聲明:
本頁內容僅代表作者本人意見,若因此產生任何糾紛由作者本人負責,概與琴島網公司無關。本頁內容僅供參考,請您根據自身實際情況謹慎操作。尤其涉及您或第三方利益等事項,請咨詢專業人士處理。