Math.sin()がStrictMath.sin()にデリゲートするのはなぜですか?

emesx:

Redditスレッドで問題を見つけたときに、なぜMath.sin(double)委任するのかと思っStrictMath.sin(double)ていました上記のコードフラグメントは次のようになります(JDK 7u25)。

Math.java

public static double sin(double a) {
    return StrictMath.sin(a); // default impl. delegates to StrictMath
}

StrictMath.java

public static native double sin(double a);

2番目の宣言はnative、私にとって妥当なものです。次のようにMath述べています。

コードジェネレーターは、利用可能な場合、プラットフォーム固有のネイティブライブラリまたはマイクロプロセッサ命令を使用することをお勧めします(...)

そして問題はStrictMathプラットフォーム固有の実装を十分に行うネイティブライブラリではないでしょうか。インストールされているJREよりもJITがプラットフォームについて何を知ることができますか(この場合のみに集中してください)?つまり、なぜMath.sin()ネイティブではないのですか?

emesx:

ディスカッション全体を1つの投稿にまとめます。

通常、にMath委任しStrictMathます。明らかに、呼び出しはインライン化できるため、これはパフォーマンスの問題ではありません。

StrictMathnativeネイティブライブラリによってサポートされるメソッドを持つ最後のクラスです。ネイティブとは最適という意味だと思うかもしれませんが、必ずしもそうである必要はありません。StrictMathjavadocを見ると、以下を読むことができます。

(...)このパッケージの一部の数値関数の定義では、特定の公開アルゴリズムと同じ結果を生成する必要があります。これらのアルゴリズムは、よく知られたネットワークライブラリnetlibからパッケージ「Freely Distributable Math Library」fdlibmとして入手できます。Cプログラミング言語で記述されたこれらのアルゴリズムは、Java浮動小数点演算の規則に従うすべての浮動小数点演算で実行されると理解されます。

このドキュメントを理解する方法は、ネイティブライブラリの実装がマルチプラットフォームであり、予測可能な結果を​​生成することが知られているfdlibmライブラリのStrictMath観点から実装されていることですマルチプラットフォームであるため、すべてのプラットフォームで最適な実装になるとは期待できません。これは、スマートJITが入力範囲の統計分析やアルゴリズムの調整などによって実際のパフォーマンスを微調整できる場所だ思います/実装に応じて。

実装をより深く掘り下げると、バックアップするネイティブライブラリがStrictMath実際にfdlibmを使用 することがすぐにわかります。

OpenJDK 7のStrictMath.cソースは次のようになります。

   #include "fdlibm.h"
   ...
   JNIEXPORT jdouble JNICALL
   Java_java_lang_StrictMath_sin(JNIEnv *env, jclass unused, jdouble d)
   {
       return (jdouble) jsin((double)d);
   }

また、正弦関数はfdlibm / src / s_sin.cで定義されて__kernel_sinおり、ヘッダーfdlibm.hから直接来る関数をいくつかの場所で参照しています


私は一時的に自分の回答を受け入れていますが回答が出たら、より有能な回答を受け入れていただければ幸いです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Go定数で「math.Sin」が許可されないのはなぜですか?

分類Dev

JavaScriptにMathオブジェクトがあるのはなぜですか?

分類Dev

Math.sin`1`が機能し、Math.sin'1 'が機能しない理由

分類Dev

Math.pow()によってInteger.MIN_VALUEをデクリメントすると、同じ値が返されるのはなぜですか?

分類Dev

Math.sin内のMath.radians

分類Dev

System.Math.Sinのソースコードを確認するにはどうすればよいですか?

分類Dev

プログラムからマルチプロセッシングを削除すると、math.sin()関数で「浮動小数点数が必要です」というエラーがスローされるのはなぜですか?

分類Dev

ノードがMath.tan(Math.PI / 2)をInfinityに評価しないのに、Chrome V8は評価するのはなぜですか?

分類Dev

Math.roundがlongを返すのにMath.floorがdoubleを返すのはなぜですか?

分類Dev

Java.Lang.Mathが抽象的でないのはなぜですか?

分類Dev

Math.sin()Node.jsとC#の精度が異なる

分類Dev

java.lang.Mathとjava.lang.StrictMathの違いは何ですか?

分類Dev

Math.floorがdoubleを返すのはなぜですか?

分類Dev

Math.round(0.49999999999999994)が1を返すのはなぜですか?

分類Dev

Math.ceilがdoubleを返すのはなぜですか?

分類Dev

Math.round(-0.2)が-0を返すのはなぜですか?

分類Dev

Math.floor(float)がないのはなぜですか?

分類Dev

Math.floor(Math.random())関数が常に「0」を返すのはなぜですか?

分類Dev

Math.pow(long、(1/3))が常に1を返すのはなぜですか?

分類Dev

Java Mathライブラリに浮動小数点を返す関数がないのはなぜですか?

分類Dev

デリゲートを宣言するときに識別子が必要なのはなぜですか?

分類Dev

Python 2.xでmath.factorialが3.xよりもはるかに遅いのはなぜですか?

分類Dev

Python 2.xでmath.factorialが3.xよりもはるかに遅いのはなぜですか?

分類Dev

Func <>デリゲートが非常に遅いのはなぜですか

分類Dev

Math.pow(x、y)がDoubleとして数えるのはなぜですか?

分類Dev

Math.min([])が0と評価されるのはなぜですか?

分類Dev

Math.random()がonClickを更新し続けるのはなぜですか?

分類Dev

Math.powを使用してこのコードが「HELLO WORLD」を出力するのはなぜですか?

分類Dev

sin関数にmath.hを使用してエラーを取得すると、理由がわかりません

Related 関連記事

  1. 1

    Go定数で「math.Sin」が許可されないのはなぜですか?

  2. 2

    JavaScriptにMathオブジェクトがあるのはなぜですか?

  3. 3

    Math.sin`1`が機能し、Math.sin'1 'が機能しない理由

  4. 4

    Math.pow()によってInteger.MIN_VALUEをデクリメントすると、同じ値が返されるのはなぜですか?

  5. 5

    Math.sin内のMath.radians

  6. 6

    System.Math.Sinのソースコードを確認するにはどうすればよいですか?

  7. 7

    プログラムからマルチプロセッシングを削除すると、math.sin()関数で「浮動小数点数が必要です」というエラーがスローされるのはなぜですか?

  8. 8

    ノードがMath.tan(Math.PI / 2)をInfinityに評価しないのに、Chrome V8は評価するのはなぜですか?

  9. 9

    Math.roundがlongを返すのにMath.floorがdoubleを返すのはなぜですか?

  10. 10

    Java.Lang.Mathが抽象的でないのはなぜですか?

  11. 11

    Math.sin()Node.jsとC#の精度が異なる

  12. 12

    java.lang.Mathとjava.lang.StrictMathの違いは何ですか?

  13. 13

    Math.floorがdoubleを返すのはなぜですか?

  14. 14

    Math.round(0.49999999999999994)が1を返すのはなぜですか?

  15. 15

    Math.ceilがdoubleを返すのはなぜですか?

  16. 16

    Math.round(-0.2)が-0を返すのはなぜですか?

  17. 17

    Math.floor(float)がないのはなぜですか?

  18. 18

    Math.floor(Math.random())関数が常に「0」を返すのはなぜですか?

  19. 19

    Math.pow(long、(1/3))が常に1を返すのはなぜですか?

  20. 20

    Java Mathライブラリに浮動小数点を返す関数がないのはなぜですか?

  21. 21

    デリゲートを宣言するときに識別子が必要なのはなぜですか?

  22. 22

    Python 2.xでmath.factorialが3.xよりもはるかに遅いのはなぜですか?

  23. 23

    Python 2.xでmath.factorialが3.xよりもはるかに遅いのはなぜですか?

  24. 24

    Func <>デリゲートが非常に遅いのはなぜですか

  25. 25

    Math.pow(x、y)がDoubleとして数えるのはなぜですか?

  26. 26

    Math.min([])が0と評価されるのはなぜですか?

  27. 27

    Math.random()がonClickを更新し続けるのはなぜですか?

  28. 28

    Math.powを使用してこのコードが「HELLO WORLD」を出力するのはなぜですか?

  29. 29

    sin関数にmath.hを使用してエラーを取得すると、理由がわかりません

ホットタグ

アーカイブ