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