読者です 読者をやめる 読者になる 読者になる

入門じゃないJava(4)

おはようございます。

今日も楽しくJavaを見ていきましょう。

 

前回(昨日)は書き終わらず見苦しいところをお見せしてしまいすいませんでした。

加筆の方も終わりましたので、「なんだこれは」と思われた方は、最後の部分だけ今一度ご覧いただければと思います。

creators.hateblo.jp

さて、今日は前回のキャストのお話を完結させようと思います。

まずは基本型の拡大変換と縮小変換についてみていきます。

基本型の拡大変換と縮小変換

以下の変換は、基本型の拡大変換と縮小変換は2段階で行われます。

byteからcharへの変換

まず最初に、byteは基本型への拡大変換によってint型へと変換され、その後、基本型の縮小変換によってintからcharへと変換されます。

strictfpとFP厳密式

 浮動小数点数の内部は複雑であるため、すべての実行環境で浮動小数点数の演算結果がピッタリと一致するわけではありません。というもの、厳密にIEEE745形式で表せる値のみを利用するような演算を行おうとすると、ハードウェア資源を十分に活用できなくなり、演算に時間がかかってしまうからです。

たとえば、intelのCPUの場合、浮動小数点数は内部的に80ビットで演算をする仕様になっており、それを利用した高速な演算が行われます。

実行環境に依存することなく、同じ演算結果を得られるようにするには、特別な宣言が必要です。

クラス宣言(第8章)・インタフェース(第14章)・メソッド宣言(第7章)にstrictfpというキーワードを指定します。たとえば、クラス宣言に指定する場合は以下のようになります。

    //クラスABC内のすべての浮動小数点式をFP厳密にする
    strictfp class ABC {
        //...
    }

 このように宣言されたクラス(やインタフェース)の中では、すべての浮動小数点式はFP厳密(FP-strict)となります。その場合、、実行環境に依存することなく、同一の演算結果が得られることが保障されます。

 FP厳密の場合、floatからdoubleへの拡大変換では、変換前後の数値の大きさが変化することはありません。その一方で、FP厳密でなければ、変換後の数値の大きさに関する情報が欠落する可能性があります。

 なお、クラス中の特定のメソッドのみをFP厳密にする必要があれば、そのメソッドにstrictfpをつけます。

    //メソッドf内のすべての浮動小数点式をFP厳密にする。
    strictfp void f() {
        //...
    }

クラス・インタフェース・メソッドにstrictfpがつけられていなくても、0.0や3.14のような定数に限っては、必ずFP厳密になることが保障されています。

通常の計算ではFP厳密にする必要は、それほどありません。厳密にIEEE 754形式にのっとた演算を行う必然性があるときのみ、指定するといいでしょう。

     柴田 望洋 (2016) .『新・明解Java入門』p167 Columu 5-8より

かぼす的解説

strictfpはストリクトエフピーと読みます。ちなみにIEEEアイ トリプル イーと読むとかっちょいいでしょう。アイ イー イー イーと言ってるとアイーン!って言っちゃいそうですからね。

 

 

と、今日はここまでにしましょう。

次回は拡張表記について学んでみましょう。

では!

 

参考文献

柴田 望洋 (2016) .『新・明解Java入門』167-169