Java之strictfp關鍵字

參考:
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方法中,所有的指令都將使用嚴格的浮點計算。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章