在 C++ 03 中,使用 egstd::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));
}
这是 C++11 标准中的行为还是未来的 libstdc++ 实现会返回到更快的方法?
其次,如果出于标准或实施原因,更快的行为不再可能,那么再次实现它的最便携的方法是什么?我power(...)
在“ext/numeric”下的 gcc stdlibc++ 中看到了一个函数,但这被标记为非标准SGI(rip) 扩展。