我只是想知道pow
库的math.h
函数是如何工作的,是实现最简单的顺序算法还是使用其他算法呢?
我只知道重复的平方算法,报告 O(log n),也许这是pow
函数实现的算法?
所以我只是使用顺序算法vs pow
进行了一些测试,发现第一个版本几乎比第二个版本慢3倍。调用函数真的会惩罚这个测试的性能吗?为什么呢?
欢迎任何其他评论解释正在发生的事情,或pow
如何实施。
编辑:我错了,pow
比顺序算法快3倍 。
答案 0 :(得分:10)
pow()
中math.h
的实施要比这复杂得多 - 请看一下这个免费提供的实现(link)。
重复平方的一个问题是它不足以处理分数幂。来自pow()
的{{1}}必须处理它,因此在某些测试用例中它必然会变慢。但是,由于重复的平方功能不具有相同的功能,因此比较不是一对一的。
一般来说,如果您不需要处理一般情况,则更容易优化性能。例如,如果您从未将数字提升到分数幂,那么您可能会在微基准测试中创建一个击败库函数3:1的算法。这应该理解“更快”功能的适用性并不宽。
答案 1 :(得分:2)
根据ANSI C99标准,第7.12.7.4节:
<强>描述强>
pow
函数计算x
提升到幂y
。如果x
为有限且为负且y
为有限且不是整数值,则会发生域错误。如果x
为零且y
小于或等于零,则可能会出现域错误。<强>返回强>
pow
个函数返回x^y
。
换句话说,它没有指定要使用的确切算法。您必须查看您正在使用的C / C ++标准库的源代码。我认为大多数图书馆作者都使用了高度优化的算法。
更新:在评论中,您说您使用的是MinGW32。这与微软的运行时msvcrt有关。虽然它不是开源的,但是看Microsoft’s documentation我们所知道的是它使用的是SSE2。这可能非常有效。