Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 功率与手动功率性能的数学比较_C++_Performance_Algorithm_Time_Math.h - Fatal编程技术网

C++ 功率与手动功率性能的数学比较

C++ 功率与手动功率性能的数学比较,c++,performance,algorithm,time,math.h,C++,Performance,Algorithm,Time,Math.h,我只是想知道math.h库的pow函数是如何工作的,它是实现最简单的顺序算法还是使用其他算法 我只知道重复平方算法,它报告O(logn),也许这就是通过pow函数实现的算法 因此,我只是使用顺序算法vspow进行了一些测试,发现第一个版本的速度几乎是第二个版本的3倍。调用函数真的会对测试的性能造成这么大的影响吗?为什么? 欢迎任何其他解释正在发生什么或如何实现pow的评论 编辑:我错了,pow比顺序算法快3倍。根据ANSI C99标准,第7.12.7.4节: 说明 pow函数计算x提升到y的幂次

我只是想知道
math.h
库的
pow
函数是如何工作的,它是实现最简单的顺序算法还是使用其他算法

我只知道重复平方算法,它报告O(logn),也许这就是通过
pow
函数实现的算法

因此,我只是使用顺序算法vs
pow
进行了一些测试,发现第一个版本的速度几乎是第二个版本的3倍。调用函数真的会对测试的性能造成这么大的影响吗?为什么?

欢迎任何其他解释正在发生什么或如何实现
pow
的评论


编辑:我错了,
pow
比顺序算法快3倍。

根据ANSI C99标准,第7.12.7.4节:

说明

pow
函数计算
x
提升到
y
的幂次。如果
x
为有限且为负值,而
y
为有限且不是整数值,则会发生域错误。如果
x
为零且
y
小于或等于零,则可能发生域错误

返回

pow
函数返回
x^y

换句话说,它没有指定要使用的确切算法。您必须查看正在使用的C/C++标准库的源代码。我认为大多数库作者都使用了高度优化的算法


更新:在评论中,您说您正在使用MinGW32。这与微软的运行时msvcrt相联系。虽然它不是开源的,但我们知道它使用SSE2。它可能非常有效。

math.h
中实现
pow()
要复杂得多-看看这个免费提供的实现()

重复平方的一个问题是,它不足以处理分数次幂。来自
math.h
pow()
必须处理它,因此在某些测试用例中,它必然较慢。但是,由于重复平方函数不具有相同的功能,因此比较不是一一对应的


一般来说,如果您不需要处理一般情况,则更容易优化性能。例如,如果您从未将数字提高到分数次幂,那么您可能会在微基准测试中生成一个比库函数3:1更好的算法。这需要理解“更快”函数的适用性并没有那么广泛。

这完全取决于编写标准库的人。你用哪一种?另外,
pow()
也适用于浮点运算。只需打开math.f文件并检查它?它是源代码,而不是编译的库。它取决于参数。您的
pow
可能不太通用,也不太准确。据猜测,在x86上,典型的实现很可能是这样的。我讨厌添加链接,但这似乎是一个很好的资源,因为我也很好奇: