a、b、c、a2、b2、c2 の6 つの倍精度数があるとします。
そんなこと知ってる:
a == a2
b == b2
c == c2
すべてのプラットフォームと JVM バージョンで次のことを確認できますか?
a * b + c == a2 * b2 + c2 // This runs within the same JVM process
この演算の結果は有限 (無限ではない) であり、NaN ではないと想定されます。
a、b、c、a2、b2、c2 の6 つの倍精度数があるとします。
そんなこと知ってる:
a == a2
b == b2
c == c2
すべてのプラットフォームと JVM バージョンで次のことを確認できますか?
a * b + c == a2 * b2 + c2 // This runs within the same JVM process
この演算の結果は有限 (無限ではない) であり、NaN ではないと想定されます。
いいえ、クラスまたはメソッドがstrictfp
修飾子で宣言されていない限り、それが正しいかどうかはわかりませんa * b + c == a2 * b2 + c2
。
クラスまたはメソッドを と宣言するとstrictfp
、浮動小数点演算の動作が明確に定義され、Java VM 内だけでなく、異なるプラットフォーム間でも一貫している必要があります ( Java 言語仕様 $15.4 )。
クラスまたはメソッドがで宣言されていないstrictfp
場合、Java VM は浮動小数点演算にプラットフォームまたはハードウェア固有の関数を使用して、予測可能性を犠牲にしてパフォーマンスを向上させることができます。この場合の JLS は、同じ VM 内で一貫性を要求することさえしないため、まったく同じ計算が複数回実行された場合、同じ VM が異なる結果を生成することが許可されることを意味します。たとえば、少なくとも解釈されたバイトコードと JIT コンパイルされたバイトコードを比較すると、異なる結果が生成されるか、少なくとも異なる結果が生成される可能性があると想定します。したがって、式の両側がa * b + c == a2 * b2 + c2
異なる結果に評価される可能性が非常に低いことは認められますが、JLS ではそれが許容されます。