1. ホーム
  2. java

java.lang.Mathとjava.lang.StrictMathはどう違うのですか?

2023-09-09 21:28:42

質問

明らかに java.lang.StrictMath には追加の関数(双曲線など)が含まれており、その関数は java.lang.Math にはありませんが、両ライブラリにある関数に違いはあるのでしょうか?

どのように解決するのですか?

のJavadocは Math クラスの Javadoc には、2 つのクラスの違いに関するいくつかの情報があります。

のいくつかの数値メソッドとは異なり クラス StrictMath の数値メソッドとは異なり、すべての実装は の同等の関数の実装はすべて Math が同じ結果を返すとは定義されていません。 はビットごとに同じ結果を返すとは定義されていません。この この緩和により,より性能の良い より良い実装を可能にします。 この緩和により、厳密な再現性が要求されない場合、より性能の良い実装が可能になります。

デフォルトでは、多くの Math メソッド にある同等のメソッドを単に呼び出すだけです。 StrictMath の同等のメソッドを呼び出すだけです。 コード生成者は プラットフォーム固有のネイティブライブラリや マイクロプロセッサの命令 より高性能な実装を提供するために の実装をより高い性能で提供することが推奨されます。 Math メソッドを実装することができます。そのような高性能の の仕様に準拠する必要があります。 の仕様に準拠しなければなりません。 Math .

そのため Math クラスは、特定の操作がどうあるべきかというルールを定めていますが、そのルールは 正確 を要求するものではありません。

これによって、たとえば Math.cos クラスが呼び出された場合、全く同じ結果ではなく、似たような結果を返すことができます。これにより、プラットフォーム固有の実装 (x86 浮動小数点の使用と SPARC 浮動小数点の使用など) が可能になり、異なる結果を返す可能性があります。

(参照) ソフトウェアの実装 のセクションを参照してください。 正弦波 のセクションをご覧ください)。

しかし StrictMath では、異なる実装によって返される結果 は同じ結果を返さなければなりません。これは、異なるプラットフォームでの結果の再現性が求められるインスタンスに望ましいでしょう。