【发布时间】:2013-09-18 13:07:42
【问题描述】:
在 C++ 03 中,使用例如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));
}
这是 C++11 标准中的行为还是未来的 libstdc++ 实现会返回到更快的方法?
其次,如果出于标准或实施原因,更快的行为不再可能,那么再次实现它的最便携的方法是什么?我在 gcc stdlibc++ 中的“ext/numeric”下看到了一个 power(...) 函数,但这被标记为 非标准 SGI(rip) 扩展。
【问题讨论】:
-
Sounds right: "如果任何参数具有整数类型,则将其强制转换为
double"。奇怪的。而且我在标准中找不到参考... -
@KerrekSB:我想知道有效投射是什么意思。这是否会阻止实现提供其他重载?从数学的角度来看,
x^5和x^5.0是一回事……(尽管它们可能不在实现中)。如果两者的结果相同,我不确定标准是否规定不提供额外的重载。 -
@DavidRodríguez-dribeas:我什至不知道网站是从哪里得到的。找不到那个参考...
-
@KerrekSB 在 26.8 第 11 段 [c.math] 中有。我自己已经有了some problems。
标签: c++ gcc c++11 c++-standard-library