strictfp,与“移植”有染,与“精确”无关

作者:fbysssmsn:jameslastchina@hotmail.com blog:blog.csdn.net/fbysss声明:本文由fbysss原创,转载请注明出处关键字:java strictfp IEEE754 浮点数运算

一、前言

本文是针对java语言的strictfp关键字的扩展性研究,所引用博文内容,只关注问题,不针对作者,,若有不当之处,还望指正。

二、背景

”strictfp的意思是FP-strict,也就是说精确浮点的意思。在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,Java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。“

和大多数人一样,看到这段话,心里很是Happy。因为我们知道Java处理浮点数运算,存在不精确的情况,我们往往使用BigDecimal或者乘除10的n次方的办法来解决。但还是够麻烦的。如果加入这个关键字就能解决问题,岂不妙哉?

于是,用一个小程序来检验一下:

输出结果

result:0.049999997

去掉strictfp之后也一样,看来和想象的不是一回事。

再查查,在百度百科中发现了strictfp的词条,?fr=ala0

感觉说的和上面差不多,里面的例子跑了一下,结果如下:

float: 0.6710339double: 0.04150553411984792sum: 0.71253945297742238quotient: 16.1673355

看来,strictfp不能解决所谓”精确“问题。但到底有啥用处呢?这几个例子实在看不出什么名堂来。只有研究研究国外的资料了。

三、文档研究

中的第一句:strictfp is a Java keyword used to restrict floating-point calculations to ensure portability。目的很明确,就是用来保证可移植性的。

再看看sun官方怎么说:

原文有这么一段:

strictfp is important because its use guarantees common behavior across different Java implementations. In other words, you can know that the floating-point arithmetic in your application behaves the same when you move your application to a different Java implementation or hardware platform.

同样,和不同的Java实现或硬件平台相关,还是移植性。

官方的例子:

输出结果为

Infinity

1.6E308

我们看到的是2.0 * d和4.0 * d * 0.5不一样。因为java是从左到右进行运算的(because the Java programming language guarantees a left-to-right order of evaluation),即在计算4.0 * d的时候,就已经溢出了(Double.MAX_VALUE大概是1.8e+308)。之后的运算也就无效了。By contrast, if the expression is not FP-strict, an implementation is allowed to use an extended exponent range to represent intermediate results.这句话大概意思就是说,如果没有加strictfp关键字,在不同的平台下面,可能会得到不同的结果。

= 2K-1-1

Parameter

float

float-extended-exponent

double

double-extended-exponent

N

24

24

53

53

K

8

11

11

15

Emax

+127

+1023

+1023

+16383

Emin

-126

-1022

-1022

-16382

一个背包,几本书,所有喜欢的歌,

strictfp,与“移植”有染,与“精确”无关

相关文章:

你感兴趣的文章:

标签云: