float pow(float base, int iexp )在C++ 11中删除了重载的函数,现在pow返回一个double.在我的程序中,我计算了很多这些(单精度),我对如何做到最有效的方式感兴趣.
是否有一些特殊功能(在标准库或任何其他)具有上述签名?
如果没有,在任何其他操作(将其他所有内容都投入)或者转换为使用重载函数之前,是否更好(在单精度方面的性能方面)显式地pow转换结果?floatdoubleiexpfloatfloat pow(float base, float exp)
编辑:为什么我需要float和不使用double?
主要原因是RAM - 我需要数十或数百GB,因此这种减少是巨大的优势.所以我需要float得到float.现在我需要最有效的方法来实现这一目标(减少演员阵容,使用已经优化的算法等).
在C++ 03中,使用eg std::pow(double_val, 6)比使用快得多std::pow(double_val, 6.0).
在使用C++ 11进行编译时不再是这种情况.从gcc的libstdc ++ - 4.8查看cmath头文件,可以看到显式的pow(double,int)不再存在,这种情况由以下模板处理,该模板将int提升为double:
template<typename _Tp, typename _Up>
inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
pow(_Tp __x, _Up __y) {
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
return std::pow(__type(__x), __type(__y));
}
Run Code Online (Sandbox Code Playgroud)
这种行为是在C++ 11标准中还是未来的libstdc ++实现可以返回到更快的方法?
其次,如果出于标准或实施原因,更快的行为不再可能,那么再次实现它的最便携方式是什么?我power(...)在"ext/numeric"下的gcc stdlibc ++中看到了一个函数,但这被标记为非标准的 SGI(rip)扩展.
我正在尝试学习OpenMP,并希望使用OpenMP学习加速.为此,我写了以下小程序:
#include <vector>
#include <cmath>
int main() {
static const unsigned int testDataSize = 1 << 28;
std::vector<double> a (testDataSize), b (testDataSize);
for (int i = 0; i < testDataSize; ++i) {
a [i] = static_cast<double> (23 ^ i) / 1000.0;
}
b.resize(testDataSize);
#pragma omp parallel for
for (int i = 0; i < testDataSize; ++i) {
b [i] = std::pow(a[i], 3) * std::exp(-a[i] * a[i]);
b [i] += std::pow(a[i], 5) * std::exp(-a[i] * a[i]);
b [i] += std::pow(a[i], 7) …Run Code Online (Sandbox Code Playgroud)