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

tot*_*ing 9 c++ gcc c++-standard-library c++11

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

Chr*_*ica 4

首先,是的,这种行为与 C++11 标准一致(尽管与 C++03 不一致),该标准在第 26.8 节第 11 段中表示:

此外,应有足够的额外过载以确保:

  1. 如果与 double 形参对应的任何实参的类型为 long double,则与 double 形参对应的所有实参都将有效地转换为 long double。

  2. 否则,如果与 double 形参对应的任何实参具有 double 类型或整数类型,则与 double 形参对应的所有实参都将有效地转换为 double。

  3. 否则,与双参数相对应的所有参数都将有效地转换为浮点型。

(除了float-only、double-only 和long double-only 的重载之外。)

因此,实现实际上必须将该整数参数转换为 adouble并且我不认为合格的库有可能为std::pow整数幂提供更快的速度,除了可能检查double参数的完整性(这是一个词吗?)和在这种情况下使用特殊路径。

为了提供一种独立于平台的更快的方法,我想到的唯一一件事就是编写一个自定义包装器,将其委托给这个非标准(power如果存在)。除此之外,我不知道如何std::pow在不编写自己的实现的情况下再次注入该行为。

编辑:然而,当查看这个答案时,实现确实有可能仍然为整数幂提供优化的重载,只要它的行为与std::pow(double(x), double(y)). 因此,实现有可能提供更快的版本,但我不会像您在 C++03 中所做的那样太依赖这一点(恕我直言,它甚至是标准的一部分,但我可能是错的) 。