【发布时间】:2019-07-04 12:10:18
【问题描述】:
我有以下代码:
#include <cmath>
float foo(float x, unsigned int m, float q = 0.0f)
{
return std::floorf(x * float(m) + q);
}
现在,当我尝试使用 g++ 5.4.0 和选项 -std=c++11 编译它时,我收到一条错误消息 ‘floorf’ is not a member of ‘std’。
现在我的理解是 C++11 标准的第 26.8 条要求标准 C++ 库头 <cmath> 声明与标准 C 库头 <math.h> 相同的函数集,尽管在命名空间 @987654328 @;并且第 1.2 条规定将“C”解释为 C99;并且 C99 标准的第 7.12.9.2 条要求标准 C 库头文件 <math.h> 声明一个函数 float floorf(float)。
因此,<cmath> 应该声明一个函数 float std::floorf(float),据我所知,它应该与我的代码匹配。
什么给了?我在这里遗漏了什么吗?
(我知道 C++11 也定义了 float std::floor(float);但是,我最近发现带有 f 后缀的浮点函数变体通常稍微快一些,所以我更愿意专门调用floorf()。)
【问题讨论】:
-
这很奇怪,使用 clang++ 编译时似乎可以正常工作,但实际上使用 g++ 时,即使在最新版本上也无法正常工作。
-
作为参考,我刚刚提交给Bugzilla
-
C++11 和 C++14 标准没有在表“标题
<cmath>概要”中列出floorf,它已在 C++17 中修复。对标准的迂腐解读可以得出结论,<cmath>只需提供::floorf而不是std::floorf -
相关链接en.cppreference.com/w/cpp/numeric/math/floor。另外,“我最近发现浮点函数的 f 后缀变体通常稍微快一些”,这对我来说听起来很奇怪。
-
对于速度差异,您是用
-O0测量的吗?std::pow是一个调用powf的函数,而powf直接是powf,所以如果你不内联会更慢,但我希望内联可以很容易地消除差异。