小编Chr*_*pka的帖子

C++ gcc` floorf`不是`std`的成员?

我有以下代码:

#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().)

c++ gcc c++11

10
推荐指数
1
解决办法
750
查看次数

将boost :: thread与C++ 11 std :: mutex混合使用是否安全?

std::mutex在通过boost启动其线程的程序中使用它和它的亲属是否安全?

(使用std::thread对我来说不是一个选项(我认为),因为应用程序需要大量的堆栈空间,并且在某些平台上需要在创建时覆盖默认的堆栈大小.)

c++ multithreading boost c++11

8
推荐指数
1
解决办法
324
查看次数

在C++中将浮点数截断为最接近2的幂 - 性能

在C++中(假定至少是C++ 11),给定浮点值a,我需要找到满足以下约束的浮点值b:

  • b必须与a具有相同的符号.
  • b的大小必须小于或等于a的大小.
  • b的大小必须是2的幂.
  • 在这些约束条件下,b的大小必须尽可能大.

换句话说,我需要将a的幅度"截断"到最接近的2的幂,同时保持符号不变.

[*在我的情况下,"较少或相等"的约束是松散的,而"较少"也会起作用.]

给定一些IEEE 754二进制表示,实现此目的的一种方法是通过比特抨击简单地清除所有尾数位,同时保持符号和指数位不变.

一种更便携的方法是:

  1. 获得幅度的基数2对数,向下舍入,使用例如logb,ilogb甚至更便携,log2frexp.
  2. 使用例如整数比特移位(小心负功率和值范围的问题)提高2到n次幂,pow(2.0,n),exp2(n),或ldexp(1.0,n).
  3. 通过复制标志copysign.

这允许许多可能的组合来解决任务,当考虑单精度替代方案时更是如此.有没有人对现代硬件和使用现代编译器的性能有这些方法的经验?

c++ floating-point performance

1
推荐指数
1
解决办法
221
查看次数

C++ `using namespace` 指令使全局范围运算符消失?

由于我不明白的原因,以下 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类型。 …

c++ operator-overloading visual-c++

1
推荐指数
1
解决办法
118
查看次数