strictfp_Keyword

strictfp

維基百科,自由的百科全書
strictfp是Java編程語言中的一個修飾符,它限制浮點計算以確保可移植性。strictfp命令是使用Java虛擬機(JVM)1.2版引入Java的,可用於所有當前更新的Java VM。

內容

1 基礎
2 它是如何工作的
3 用法
4 參考文獻

基礎

的IEEE標準IEEE 754規定了兩個浮點計算並且以各種格式,包括單(32位,在Java的使用浮點值的存儲的標準方法float)或雙(64位,在Java的使用double)的精度。

某些硬件還提供擴展的精度格式,可提供更高的精度和/或更大的指數範圍。在這樣的體系結構上,使用這種擴展格式計算中間結果可能更有效。這可以避免可能發生的舍入錯誤,溢出和下溢,但是可能導致程序在這樣的體系結構上產生不同的輸出。在傳統的x87浮點架構的x86機器上避免使用擴展精度是特別昂貴的。儘管控制計算精度很容易,但限制中間結果的指數範圍需要額外的昂貴指令。

在JVM 1.2之前,浮點計算要求嚴格; 也就是說,所有中間浮點結果都需要表現爲使用IEEE單精度或雙精度表示。這使得在常見的基於x87的硬件上成本很高,以確保在需要時可能發生溢出。

從JVM 1.2開始,默認情況下,中間計算允許超過與IEEE 32位和64位格式相關的標準指數範圍。它們可以代表爲“擴展指數”值集的成員。在像x87這樣的平臺上,溢出和下溢可能不會發生在預期的位置,從而產生可能更有意義但更不可重複的結果。

由於Java實現不再廣泛使用x87浮點,因此有一個主動提議再次使所有浮點運算嚴格,有效地恢復1.2之前的語義。[1]

它是如何工作的

在沒有溢出或下溢的情況下,有或沒有strictfp的結果沒有差異。如果重複性是必要的,則strictfp修飾符可用於確保在所有平臺上的相同位置發生溢出和下溢。如果沒有strictfp修飾符,中間結果可能會使用更大的指數範圍。[2]

該strictfp修改由代表所有的中間值作爲IEEE單精度和雙精度值,如發生在早期版本的JVM實現這一目的。[3]

用法

程序員可以使用修飾符strictfp來確保按照早期版本執行計算; 也就是說,僅使用IEEE單精度和雙精度類型。使用strictfp可確保浮點計算的結果在所有平臺上都相同。

它可以用於類,接口和非抽象方法。[4]當應用於方法時,它會導致方法內的所有計算都使用嚴格的浮點數學。應用於類時,類中的所有計算都使用嚴格的浮點數學。編譯時常量表達式必須始終使用嚴格的浮點行爲。[5]

例子

public strictfp class MyFPclass { 
    // ... contents of class here ...
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章