18

ここで説明されている「高速逆平方根」について聞いたことがありますが、それを自分の Java プログラムに入れたいと思っていました (研究目的のためだけに、ネイティブ ライブラリが高速であることは無視してください)。

私はコードを見ていましたが、C コードはC ポインター マジックを使用しfloatて を に直接変換します。intJava でキャストを使用してこれを実行しようとすると、うまくいきません。Java は (ご想像のとおり) float を切り捨て、プリミティブのポインターを取得することはできません (C でできるように)。では、どうやってこれを行うのですか?

4

2 に答える 2

23

これを使用する前に、コードをベンチマークすることを忘れないでください。

それが必要ないことが判明した場合、または使用している CPU アーキテクチャで遅いことが判明した場合は、プロジェクトにこの鈍いコードを含めない方がよいでしょう。


Java ライブラリには、浮動小数点数から raw ビットを取得する方法があります。

java.lang.Float( http://docs.oracle.com/javase/6/docs/api/java/lang/Float.html )のJavadocに見られるように、floatToIntBits関数とintBitsToFloat.

これは、Java で「高速逆平方根」を次のように記述できることを意味します。

public static float invSqrt(float x) {
    float xhalf = 0.5f * x;
    int i = Float.floatToIntBits(x);
    i = 0x5f3759df - (i >> 1);
    x = Float.intBitsToFloat(i);
    x *= (1.5f - xhalf * x * x);
    return x;
}

ダブルスのバージョンは次のとおりです。

public static double invSqrt(double x) {
    double xhalf = 0.5d * x;
    long i = Double.doubleToLongBits(x);
    i = 0x5fe6ec85e7de30daL - (i >> 1);
    x = Double.longBitsToDouble(i);
    x *= (1.5d - xhalf * x * x);
    return x;
}

ソース: http://www.actionscript.org/forums/showthread.php3?t=142537

于 2012-07-16T22:12:38.613 に答える