`
bornlone
  • 浏览: 29399 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Java 算术运算与移植性

阅读更多

    Java 语言中的其中一个设计目标是可移植性。无论在哪个虚拟机上运行,同一个计算应该得到同样的结果。对于浮点数的算术运算,实现这样的可移植性是相当困难的。double 类型使用 64 位存储一个 double 数值,而有些处理器使用 80 位浮点寄存器。这些寄存器增加了中间过程的计算精度。例如:

 

    double w = x * y / z;

 

    很多 Intel 处理器计算 x * y,并且将结果存储在 80 位的寄存器中,再除以 z 将结果截断为 64 位。这样可以得到一个更为精确的计算结果,并且还能够避免产生指数溢出。但是,这个结果可能与始终在 64 位机器上计算的结果不一样。因此,Java 虚拟机最初规范规定所有的中间计算都必须进行截断。这种行为遭到了数值计算团体的反对。截断计算不仅可能导致溢出,而且由于截断操作需要消耗时间,所以在计算机速度上要比精确计算慢。为此,Java 程序设计语言承认了最优性能与最理想结果之间的冲突,并予以了改进。在默认情况下,虚拟机设计者允许将中间计算机结果采用扩展的精度。但是,对于使用 strictfp 关键字标记的方法来说,必须使用严格的浮点计算,以产生理想的结果。例如可以把 main 方法标记为

    public static strictfp void main(String[] args){}

于是,在 main 方法中的所有指令都将使用严格的浮点计算。如将一个类标记为 strictfp ,这个类的所有方法都必须使用严格的浮点计算。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics