Javaのstrictfpキーワード
strictfp
Strictfp-Javaキーワード.
strictfp、すなわち
strict float point(正確な浮動小数点).
strictfpキーワードは、クラス、インタフェース、またはメソッドに適用できます.strictfpキーワードを使用してメソッドを宣言する場合、このメソッドのfloat式とdouble式はすべてFP-strictの制限を厳格に遵守し、IEEE-754の仕様に合致します.クラスまたはインタフェースにstrictfpキーワードを使用すると、ネストタイプの初期設定値とコードを含むクラス内のすべてのコードが厳密に計算されます.厳密な制約は、すべての式の結果が、操作数に対してIEEE 754アルゴリズムによって予想される結果であり、単精度および二精度フォーマットで表される必要があることを意味する.
浮動小数点演算をより正確にし、異なるハードウェアプラットフォームで実行された結果が一致しないようにしたい場合は、キーワードstrictfpを使用します.
例1次の例では、strictfp修飾子を使用して宣言されるクラスを示します.
サンプル出力
例2
次の例では、strictfp修飾子を使用して宣言する方法を示します.
サンプル出力
==============================================================
Java 2以降、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である.
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);
-
- }
-
- }
// 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
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);
-
- }
-
- }
// 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
float: 0.6710339
double: 0.04150553411984792
sum: 0.71253945297742238
==============================================================
Java 2以降、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である.