我有以下代码:
#include <cmath>
float foo(float x, unsigned int m, float q = 0.0f)
{
return std::floorf(x * float(m) + q);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试用g ++ 5.4.0和选项编译它时,-std=c++11我得到一个错误说‘floorf’ is not a member of ‘std’.
现在我的理解是,C++ 11标准的第26.8节要求标准C++库头<cmath>声明与标准C库头相同的一组函数<math.h>,尽管在命名空间中std; 第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浮点函数的-suffixed变体通常稍快一点,所以我更喜欢专门调用floorf().)
std::mutex在通过boost启动其线程的程序中使用它和它的亲属是否安全?
(使用std::thread对我来说不是一个选项(我认为),因为应用程序需要大量的堆栈空间,并且在某些平台上需要在创建时覆盖默认的堆栈大小.)
在C++中(假定至少是C++ 11),给定浮点值a,我需要找到满足以下约束的浮点值b:
换句话说,我需要将a的幅度"截断"到最接近的2的幂,同时保持符号不变.
[*在我的情况下,"较少或相等"的约束是松散的,而"较少"也会起作用.]
给定一些IEEE 754二进制表示,实现此目的的一种方法是通过比特抨击简单地清除所有尾数位,同时保持符号和指数位不变.
一种更便携的方法是:
logb,ilogb甚至更便携,log2或frexp.pow(2.0,n),exp2(n),或ldexp(1.0,n).copysign.这允许许多可能的组合来解决任务,当考虑单精度替代方案时更是如此.有没有人对现代硬件和使用现代编译器的性能有这些方法的经验?
由于我不明白的原因,以下 C++ 代码无法在 VS 2022 上编译(方言设置为 C++20):
#include <compare>
namespace N1
{}
namespace N1::N2
{
class A {};
A operator-(A&);
}
std::strong_ordering operator-(std::strong_ordering o);
namespace N1
{
using namespace N2; // (1) !!!
std::strong_ordering foo();
inline std::strong_ordering bar()
{
return -foo(); // (2) !!!
}
}
Run Code Online (Sandbox Code Playgroud)
在 (2) 处,编译器提出投诉:error C2678: binary '-': no operator found which takes a left-hand operand of type 'std::strong_ordering' (or there is no acceptable conversion)。
当using namespace(1) 处的指令被删除时,编译器很高兴地找到operator-在全局范围内定义的std::strong_ordering类型。 …