std :: sqrt()函数如何工作?

时间:2011-12-19 01:55:38

标签: c++ math std

有谁知道std :: sqrt()函数是如何工作的? (或者至少有一个想法?)

我已经看到互联网上的方法似乎很慢,使用了大量的近似和迭代。

每个人都知道sqrt()函数很慢,但是我想知道std中的那个函数是如何工作的,所以我可以清楚地知道何时避免它是有益的。 (是的,如果我想确定我可以描述一下,但是有一个模糊的想法仍然很好)

编辑:没有真正提出这个问题......我感兴趣的是:

  • 计算平方根的最快C ++函数怎么样? (或多或少,我只想知道它背后的实际逻辑)

4 个答案:

答案 0 :(得分:3)

如今,在现代机器上,浮点函数被传递给硬件(浮点单元或数学协处理器)。

答案 1 :(得分:2)

有时,它使用CPU提供的内容:

$ cat main.cc
#include <cmath>
#include <ctime>
#include <cstdlib>
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-instruction)

答案 2 :(得分:1)

SQRT();功能在幕后。

它始终检查图表中的中点。 示例:sqrt(16)= 4;          SQRT(4)= 2;

现在,如果您在16或4之内提供任何输入,例如sqrt(10)==?

它找到2和4的中点,即= x,然后再次找到x和4的中点(它排除了此输入中的下限)。它一次又一次地重复这个步骤,直到它得到完美的答案,即sqrt(10)== 3.16227766017。它位于b / w 2和4.所有这个内置函数都是使用微积分,微分和积分创建的。

答案 3 :(得分:0)

标准没有指定特定的实现。

一种选择是查看典型的实现,但您可能会发现它是经过大量优化的汇编程序。