std :: sqrt()関数はどのように機能しますか?

誰もがstd :: sqrt()関数の仕組みを知っていますか? (または少なくともアイデアを持っている?)

私は、インターネット上で、多くの近似と反復を使って、実際には遅い方法を見てきました。

誰もがsqrt()関数が遅いことを知っていますが、stdの関数がどのように動作しているか知りたいので、避けたいときは漠然とした考えがあります。 (はい、私がプロファイルすることができることを確認したい場合は、漠然としたアイデアを持っているのはいいです)

編集:本当にあまりにもよく質問を策定していない...私が興味を持っているもの:

  • 平方根を計算する最速のC ++関数はどのように見えますか? (多かれ少なかれ、実際のロジックを知りたいだけです)
1
平方根を計算するための最速のC ++関数は次のようになります。 double sqrt(double x){return std :: sqrt(x);} }
追加された 著者 Mankarse,
怠惰な答えは、多分浮動小数点値の平方根を計算するためのハードウェア(FPU)命令があるということです。もちろん、ソフトウェアエミュレーションが存在します。
追加された 著者 Kerrek SB,
@moshbear:残念ながら、それは逆数sqrtです
追加された 著者 Oliver Charlesworth,
Carmack定数を使う:P
追加された 著者 moshbear,
@OliCharlesworth ...実際の平方根から1倍のFP乗算
追加された 著者 moshbear,
@xcrypt en.wikipedia.org/wiki/&hellip 、 a href = "http://ja.wikipedia.org/wiki/Fast_inverse_square_root#History_and_investigation" rel = "nofollow noreferrer"> en.wikipedia.org/wiki/…
追加された 著者 moshbear,
@moshbear wut:O
追加された 著者 xcrypt,
@Mankarseうわー、それは固体です! :p
追加された 著者 xcrypt,

4 答え

現代のマシンでは、浮動小数点機能がハードウェア(浮動小数点ユニットまたは演算コプロセッサ)に渡されています。

3
追加された
それを「コプロセッサー」と呼んでいる誤った名前のビットは、あなたは思いませんか?私はそれを20年以上に渡ってメインCPUから分離して見たことがありません。
追加された 著者 Mark Ransom,
だからこそ私はCMAで、「浮動小数点ユニット」を含んでいます。私はあなたの人生で一度に286を使ったことを賭ける!
追加された 著者 Steve Wellens,

場合によっては、CPUが提供するものを使用します。

$ cat main.cc
#include 
#include 
#include 
int main(){
    srand (clock());
    const double d = rand();
    return std::sqrt(d) > 2 ? 1 : 0;
}

(blahblahは最適化されていないので、そのプログラムを実行しないでください!)

$ g++ -S main.cc
$ cat main.s
    .file   "main.cc"
    .text
    .p2align 4,,15
.globl main
    .type   main, @function
main:
.LFB106:
    .cfi_startproc
    subq    $8, %rsp
    .cfi_def_cfa_offset 16
    call    clock
    movl    %eax, %edi
    call    srand
    call    rand
    cvtsi2sd    %eax, %xmm1
    sqrtsd  %xmm1, %xmm0
    ucomisd %xmm0, %xmm0
    jp  .L5
.L2:
    xorl    %eax, %eax
    ucomisd .LC0(%rip), %xmm0
    seta    %al
    addq    $8, %rsp
    .cfi_remember_state
    .cfi_def_cfa_offset 8
    ret
.L5:
    .cfi_restore_state
    movapd  %xmm1, %xmm0
    call    sqrt
    jmp .L2
    .cfi_endproc
.LFE106:
    .size   main, .-main
    .section    .rodata.cst8,"aM",@progbits,8
    .align 8
.LC0:
    .long   0
    .long   1073741824
    .ident  "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
    .section    .note.GNU-stack,"",@progbits

(ヒント:sqrt-cpu命令を使用しています)

2
追加された
途中で sqrtsd 命令を使用するだけではなく、結果自体が順序付けられていないかどうか(NaNなど)を確認してから、実際のライブラリ関数を呼び出しますこれはとても〜です。なぜそれが必要なのかわからない、それは命令自体によって提供されていない余分な情報を得ることかもしれません、おそらく例外処理?
追加された 著者 paxdiablo,
@ paxdiablo:今、あなたはそれを言う、私も、不思議です。 sqrtsd命令の仕様に関する十分な情報が見つかりませんでした。
追加された 著者 Sebastian Mach,

sqrt();機能舞台裏。

グラフの中点を常にチェックします。 例:sqrt(16)= 4;          sqrt(4)= 2;

あなたが16または4の中にsqrt(10)==のような入力を与えるなら、今?

それは、2と4の中間点、すなわち= xを見つけ、次にxと4の中間点を見つける(この入力では下限を除外する)。それは完璧な答え、すなわちsqrt(10)== 3.16227766017が得られるまで、このステップを何度も繰り返す。これはB/W 2および4.Allである。この組み込み関数は微積分、微分、および積分を使用して作成される。

1
追加された

標準では、特定の実装を指定していません。

1つのオプションは、典型的な実装を見ることですが、おそらく最適化されたアセンブラが多いでしょう。

0
追加された
@xcrypt:すべての平方根計算アルゴリズムは数値近似に基づいているため、より速く、より直接的には不正確です。私はあなたがそこで "最も速い"実装を見つけたいと思うのか疑問です。
追加された 著者 André Caron,
@xcrypt:正直なところ、どのアルゴリズムライブラリが使用する傾向があるか分かりません。アイデアを得るには、 en.wikipedia.org/wiki/Methods_of_computing_square_roots をご覧くださいそこにいくつかの技術があります。実際、彼らはすべて反復や近似に頼っています。
追加された 著者 Oliver Charlesworth,
さて、私はそれを知っていましたが、それを計算するには最速のC ++関数を使用すると仮定しましょう。どのように見えるでしょうか?
追加された 著者 xcrypt,