相关疑难解决方法(0)

17
推荐指数
3
解决办法
6521
查看次数

如何强制pow(float,int)返回float

float pow(float base, int iexp )在C++ 11中删除了重载的函数,现在pow返回一个double.在我的程序中,我计算了很多这些(单精度),我对如何做到最有效的方式感兴趣.

是否有一些特殊功能(在标准库或任何其他)具有上述签名?

如果没有,在任何其他操作(将其他所有内容都投入)或者转换为使用重载函数之前,是否更好(在单精度方面的性能方面)显式地pow转换结果?floatdoubleiexpfloatfloat pow(float base, float exp)

编辑:为什么我需要float和不使用double?

主要原因是RAM - 我需要数十或数百GB,因此这种减少是巨大的优势.所以我需要float得到float.现在我需要最有效的方法来实现这一目标(减少演员阵容,使用已经优化的算法等).

c++ pow c++11

10
推荐指数
1
解决办法
1204
查看次数

C++ 11是否强制执行pow(double,int)以使用较慢的pow(double,double)?

在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)扩展.

c++ gcc c++-standard-library c++11

9
推荐指数
1
解决办法
1436
查看次数

C++ 11与OpenMP结合使用会产生较慢的可执行文件

我正在尝试学习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)

c++ openmp c++11

3
推荐指数
2
解决办法
268
查看次数

标签 统计

c++ ×4

c++11 ×3

c++-standard-library ×1

exponentiation ×1

gcc ×1

math ×1

openmp ×1

pow ×1