有谁知道std :: sqrt()函数是如何工作的? (或者至少有一个想法?)
我已经看到互联网上的方法似乎很慢,使用了大量的近似和迭代。
每个人都知道sqrt()函数很慢,但是我想知道std中的那个函数是如何工作的,所以我可以清楚地知道何时避免它是有益的。 (是的,如果我想确定我可以描述一下,但是有一个模糊的想法仍然很好)
编辑:没有真正提出这个问题......我感兴趣的是:答案 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)
标准没有指定特定的实现。
一种选择是查看典型的实现,但您可能会发现它是经过大量优化的汇编程序。