參考:
Java核心技術
https://www.iteye.com/blog/neil-yang-341476
背景
因爲處理器的緣故,有些處理器使用80位的浮點寄存器,而Java中的浮點數double類型只有64位(8字節),正因爲寄存器多了些位數,會導致中間結果的精度爲80位,比預期的要更精確。所以在不同的處理器平臺,可能會導致浮點數的計算結果不一致,這裏主要指使用64位浮點寄存器與使用80位浮點寄存器的處理器。
strictfp關鍵字
默認情況下,虛擬機設計者允許對中間計算結果採用擴展的精度(擴展的指數),即浮點運算結果不可預知。有時我們可能想要得到完全可預測的浮點計算,即浮點計算的結果在各處理器平臺都一樣,那麼就可以使用strictfp關鍵字。但是由於該關鍵字會對中間結果進行截斷操作,而截斷操作需要消耗時間,所以在計算速度上比精確計算要慢。因此,在Java中,最優性能與理想結果之間存在衝突。
strictfp 關鍵字可用來修飾類、接口或方法。使用strictfp關鍵字標記的方法必須使用嚴格的浮點計算來生成可再生的結果。嚴格的浮點計算表示浮點計算完全依照浮點規範IEEE-754來執行。需要注意的是,採用嚴格浮點計算可能會產生溢出,而默認情況下,不會產生溢出。對大多數程序來說, 浮點溢出不屬於大向題。
strictfp使用範例
下面是一個使用strictfp 關鍵字修飾方法的範例。
```java
public class StrictfpTest
{
public static strictfp void main(String[] args)
{
float aFloat = 0.6710339f;
double aDouble = 0.04150553411984792d;
double sum = aFloat + aDouble;
float quotient = (float)(aFloat / aDouble);
System.out.println("float: " + aFloat);
System.out.println("double: " + aDouble);
System.out.println("sum: " + sum);
System.out.println("quotient: " + quotient);
}
}
於是main方法中,所有的指令都將使用嚴格的浮點計算。