sqrt(x)和pow(x,0.5)之间的区别

16

我在想为什么C / C ++中有sqrt()函数,因为我们可以使用

pow(x,0.5);

sqrt(x)和pow(x,0.5)有什么不同?为什么会有sqrt函数?


我认为这并没有特别的原因。由于平方根操作非常常见,相比于pow()sqrt(x)可以提高可读性。 - GeekFactory
7
为什么有自行车时还需要脚踏车? - Raghu Srikanth Reddy
2
为什么我们需要乘法,当你可以在循环中只使用加法呢? - It'sPete
8
为什么会被踩?这是一个合理的问题!!很想知道为什么我的电脑上sqrt运行得更快。 - Millemila
"sqrt"是一个特殊情况,因此它可以使用更好的近似和优化。 - Trass3r
3个回答

19

我为你运行了一个测试以检查sqrt(x)pow(x,0.5)的性能。

1.

我为你运行了一个测试以检查sqrt(x)pow(x,0.5)的性能。
for(int i=0;i<100000000;i++) 
    pow(double(i),0.5);

2.

for(int i=0;i<100000000;i++)
    sqrt(double(i));  

在我的电脑上,第一次大约需要20秒,而第二次只需要约2秒。因此性能更好。正如其他人已经提到的,易读性是另一个原因。


1
我得到了相反的结果... - Steve P.
1
在此处测试 - Steve P.
@steve P 他们在使用什么处理器?在我的电脑上运行超过20秒的代码在那里只需0.6秒。也许对于更大的值,我们可以找到差异。 - banarun
1
使用-O3和更高级的优化,像你这样的基准测试将被忽略,因为实际上没有计算任何值... 使用int main() { double tot; clock_t t1; tot = 0.0; t1 = clock(); for( int i = 0; i < MAX; i++ ) tot += pow(double(i),-0.5); cout << "tot = " << tot << " time: " << clock()-t1 << "\n"; tot = 0.0; t1 = clock(); for( int i = 0; i < MAX; i++ ) tot += 1.0 / sqrt((double)i); cout << "tot = " << tot << " time: " << clock()-t1 << "\n"; return 0; } - user719662
1
@banarun,另一方面,我的结果与您的一致;sqrt在我的计算机上快了大约10倍到20倍,即使除以sqrt也要如此... - user719662
显示剩余8条评论

6

我记得在某个地方看到过,sqrt()是一个特殊情况,根据IEEE规范保证四舍五入正确。我会查找源头来确认一下。它应该会更快,因为它只需要处理一个情况。

即使它们是相同的,也很好有一个内置的别名用于常用函数!

编辑:根据IEEE-754,pow()函数和sqrt()函数都应该被实现为将四舍五入值作为最接近真实值的浮点表示。然而,sqrt()仍然应该更快。


请参见 https://dev59.com/0n3aa4cB1Zd3GeqPcFok。 - Charles L Wilcox

5

当然,如果你只考虑数学上的等价性...

但是从计算结果的算法角度来看,sqrt 是特定于一件事情的,而 pow 是通用的。

因此,你可以(正确地)假设编写 sqrt 函数比编写通用的 pow 函数更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接