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

Java中的strictfp关键字

    博客分类:
  • JAVA
阅读更多

strictfp

  Strictfp —— Java 关键字。
  strictfp, 即 strict float point (精确浮点)。
  strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字声明一个方法时,该方法中所有的float和double表达式都严格遵守FP-strict的限制,符合IEEE-754规范。当对一个类或接口使用 strictfp 关键字时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着所有表达式的结果都必须是 IEEE 754 算法对操作数预期的结果,以单精度和双精度格式表示。
  如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,可以用关键字strictfp.
  示例 1
下面的示例演示了一个使用 strictfp 修饰符声明的类。
  
  
// Example of precision control with strictfp 

  public strictfp class MyClass

  {

  public MyClass(){}

  public static 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);

  }

  } 
 
  示例输出
  
    float: 0.6710339

  double: 0.04150553411984792

  sum: 0.71253945297742238

  quotient: 16.1673355
 
  示例 2
  下面的示例演示了一个使用 strictfp 修饰符声明的方法。
  
// Example of precision control with strictfp: 

  public class MyClass2

  {

  public float aFloat;

  public double aDouble;

  public MyClass2(){}

  public strictfp double add(float a, double b)

  {

  return (a + b);

  }

  public static void main(String[] args)

  {

  MyClass2 myClass2 = new MyClass2();

  myClass2.aFloat = 0.6710339f;

  myClass2.aDouble = 0.04150553411984792d;

  double sum = myClass2.add(myClass2.aFloat, myClass2.aDouble);

  System.out.println("float: " + myClass2.aFloat);

  System.out.println("double: " + myClass2.aDouble);

  System.out.println("sum: " + sum);

  }

  } 
 
  示例输出
  
    float: 0.6710339

  double: 0.04150553411984792

  sum: 0.71253945297742238
 
==============================================================

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

你可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字,例如下面的代码:

1. 合法的使用关键字strictfp

strictfp interface A ...{}
public strictfp class FpDemo1 ...{
    
strictfp void f() ...{}
}

2. 错误的使用方法

interface A ...{
    
strictfp void f();
}

public class FpDemo2 ...{
    
strictfp FpDemo2() ...{}
}

一旦使用了关键字strictfp来声明某个类、接口或者方法时,那么在这个关键字所声明的范围内所有浮点运算都是精确的,符合IEEE-754规范的。例如一个类被声明为strictfp,那么该类中所有的方法都是strictfp的。


分享到:
评论
8 楼 bfyycdi 2014-04-06  
精确这个词有误导意义啊,IEEE的浮点也不是精确的啊!
7 楼 xiaguangme 2013-11-29  
xiaguangme 写道
strictfp 在类中,是可以用来修饰方法的

private strictfp void test()
    {}
6 楼 xiaguangme 2013-11-29  
strictfp 在类中,是可以用来修饰方法的
5 楼 dracularking 2013-04-03  
翻译成浮点严格更好一点
4 楼 littleboyandgirl 2012-12-12  
利用博主的例子做了一下,加不加结果都一样.而且博主的第一个例子结果好像不是很对吧~~~对这个关键字体会还不是很透彻.......
3 楼 小羊fc 2012-10-02  
感激博主的教导!咦!我都不知道还有这样的关键字
2 楼 linchixiong 2011-11-04  
这有点前后矛盾啊……下面提到的错误用法,在上面却是例子……
1 楼 jorwen_fang 2010-01-24  
天啊,我用了java5年了,也才知道有这种关键字啊。白活了

相关推荐

    strictfp-changes.pdf

    关于strictfp关键字的官方语法解释

    java关键字.docx

    strictfp:严格浮点,用于声明一个浮点计算的方法。 super:超类,用于调用父类的构造方法或方法。 switch:开关,用于switch语句中的不同情况。 synchronized:同步,用于实现线程同步的方法。 this:这个,用于...

    JAVA笔试总结 -- 非常全面

    native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,JVM ClassLoader,IO流,反射机制,JNDI, GUI布局管理器,JMS, Java Mail, JNDI reference,java事件处理...

    java面试800题

    7.在java中尽量使用preparestatement执行sql,从而共享执行计划" Q0032 Oracle的集合操作函数,如sum(),avg(),max(),min(),与select,where,grouby,having的先后顺序,使用方法 Oracle集合查询基本知识,只有进行...

    java 面试题 总结

    Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨...

    99乘法表java源码-biji:课堂笔记

    java关键字 abstract do implement private this boolean double import protected throw break else instanceof public throws byte extends int return transient case false interface short true catch final ...

    仿知乎java源码-Java2Cpp-Translator:Java到C++转换器

    仿知乎java源码SevenBobcat-Java2CppTranslator 翻译器支持将受限版本的 Java 翻译成 C++。 源语言是 Java 的受限版本,没有高级功能...将“testxxx”和“Testxxx.java”中的xxx替换为你要运行的Java类文件的编号。 输

    java学习总结 1.《Java核心技术》.rar

    Java中没有 3、移位操作符右边的参数要先进行模32运算(当左边的变元是long型,则模64),如1。浮点运算的中间结果程度是不一致的。有些处理器适用80bit浮点存储器,有些则使用64bit、80bit。直到最后才把结果截断为...

    Learn.Java.for.Android.Development_Apress.2010+src

    Continuing, you investigate strictfp, class literals, synchronized, volatile, the enhanced for loop statement, autoboxing/unboxing, and transient fields. The book also briefly presents most (if not ...

    JavaOOPTrainingCourse

    Java 关键字(静态、最终、strictfp)。 内部类和嵌套类。 抽象类。 第2课。 继承和封装。 第3课。 多态性。 InstanceOf 关键字。 异常(已检查、未检查、错误)。 编写自己的异常。 第 4 课。 接口(功能接口,...

    java_demo:这是java_demo

    抽象const for int公共抛出断言继续最终接口返回抛出布尔值默认值最终长短瞬变中断做浮点数本地静态真字节双转到新strictfp尝试情况否则,如果null超级无效捕获枚举实现包开关volatile char扩展导入私有同步,而类...

    Learning-Java-Beginner-Level:开始学习 Java 时包含的练习

    --> JAVA IDENTIFIERS:- 用于类、变量和方法的名称称为标识符。 --> JAVA MODIFIERS:- 像其他语言... 有两类修饰符: 访问修饰符:default、public、protected、private 非访问修饰符:final、abstract、strictfp

    【05-面向对象(下)】

    •一个类可以实现一个或多个接口,继承使用extends关键字,实现接口则使用implements关键字。 实现接口 •一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是...

    Speed's IRC API-开源

    一个用于IRC开发的Java API,特别是为IRC bot开发的,但几乎可以用于任何与IRC相关的内容。 可以在irc.strictfp.com的#IRC频道上找到我们的IRC频道,希望在那里见到您!

Global site tag (gtag.js) - Google Analytics