Java:Math.sqrt()の32ビットfp実装

user3765373

標準のMath.sqrt()方法は、Javaではすでにかなり高速に見えますが、32ビットfloatを処理するときに速度を低下させるだけの64ビット操作が常に含まれるという固有の欠点があります。floatパラメータとしてaを使用し、32ビット演算のみを実行floatし、結果としてaを返すカスタムメソッドを使用して、より適切に実行することは可能ですか?

私が見た:

精度を犠牲にしてJavaで高速sqrt

そしてそれは、Math.sqrt()が一般的に打ちにくいという概念を強化するだけでした。私も見ました:

http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi

これは、Javaに直接移植するにはあまりにも無知であるという興味深いC ++ / ASMハックの束を私に示しました。sqrt14は、JNI呼び出しの一部として興味深いかもしれませんが。

Apache Commons FastMathも調べましたが、そのライブラリはデフォルトで標準のMath.sqrt()になっているようですので、役に立ちません。そして、Yepppがあります!:

http://www.yeppp.info/

しかし、私はまだそれを気にしませんでした。

アパンギン

sqrt32ビット値の速度を上げる必要はありませんHotSpotJVMが自動的にそれを行います。

JITコンパイラは、f2d -> Math.sqrt() -> d2fパターンを認識し、それをのsqrtss代わりに高速のCPU命令に置き換えるのに十分スマートですsqrtsdソース

ベンチマーク:

@State(Scope.Benchmark)
public class Sqrt {
    double d = Math.random();
    float f = (float) d;

    @Benchmark
    public double sqrtD() {
        return Math.sqrt(d);
    }

    @Benchmark
    public float sqrtF() {
        return (float) Math.sqrt(f);
    }
}

そして結果:

Benchmark    Mode  Cnt       Score      Error   Units
Sqrt.sqrtD  thrpt    5  145501,072 ± 2211,666  ops/ms
Sqrt.sqrtF  thrpt    5  223657,110 ± 2268,735  ops/ms

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Java Math 型キャスト

分類Dev

java.math.BigIntegerの初期化

分類Dev

java.math.MathContextの使用

分類Dev

Java Math.random()の懸念

分類Dev

効果的なJava hashCode()実装でのビットシフト

分類Dev

Javaでのチェスビットボードの実装

分類Dev

ビットコインとjava.util.Currencyの実装

分類Dev

JavaでのMath.ceilのシフト

分類Dev

Javaの:追加/減算Math.ulp()対Math.nextAfter()

分類Dev

Javaの64ビットマシンで32ビットDLLを実行する

分類Dev

JavaでのMath.floorDivのceil conterpart?

分類Dev

java.math.BigDecimalの分割不正確

分類Dev

Java Math.acos()の戻り値

分類Dev

Java Math.acos()の戻り値

分類Dev

doubleと同等のjava.math.BigDecimal.scale()

分類Dev

Math.pow での Java.Lang.Exception

分類Dev

java.math.BigIntegerはjava.math.BigDecimalにキャストできません

分類Dev

JavaでのCスタイルのビットフィールドの実装

分類Dev

JavaでのビットごとのAND問題の実装に関する問題

分類Dev

ErdelskyのRijndael128ビットブロック256ビットキーJavaでの実装

分類Dev

Math.isFinite()メソッドの実装

分類Dev

Java列挙型を使用したビットフィールドの実装

分類Dev

JavaのUNIXソケット実装?

分類Dev

Java Math.pow(x、2.0)とMath.pow(x、2.0000001)のパフォーマンス

分類Dev

Math.roundの高速実装?

分類Dev

Math.powのJavaScript実装

分類Dev

Java:Java Swingでのサービスメソッドの実装

分類Dev

java.base / java.math.BigInteger.powの負の指数

分類Dev

java9での32ビットと64ビットのJRE

Related 関連記事

ホットタグ

アーカイブ