小编ein*_*ica的帖子

我应该如何获得浮点值的小数部分?

我有一个xtype变量float,我需要它的小数部分。我知道我可以得到它

  • x - floorf(x), 或者
  • fmodf(x, 1.0f)

我的问题:其中一个总是比另一个更可取吗?它们实际上是一样的吗?我可以考虑第三种选择吗?

笔记:

  • 如果答案取决于我正在使用的处理器,那就让它成为 x86_64,如果你能详细说明其他处理器,那会很好。
  • 请确保并参考 的负值行为x。我不介意这种行为或那种行为,但我需要知道这种行为是什么。

c floating-point c99 floor libm

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

为什么 Boost 中有两种变体类实现?

Boost 似乎有两种变体类模板的实现:

Boost 两个包含同一概念的两个版本的情况很少见(尽管并非闻所未闻)。为什么变体会发生这种情况?这些变体有何不同?

c++ boost boost-variant boost-variant2

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

如何使用“if constexpr”正确实现“operator()”,以便它与 std::generate 一起使用?

我试图编写一个类,该类将用容器具有的类型的随机数填充容器:

template<typename random_type>
class rand_helper {
private:
    std::mt19937 random_engine;
    std::uniform_int_distribution<int> int_dist;
    std::uniform_real_distribution<double> real_dist;

public:
    rand_helper() = delete;
    rand_helper(random_type left_b, random_type right_b);
    random_type operator()();

};

template<typename random_type>
rand_helper<random_type>::rand_helper(const random_type left_b, const random_type right_b) :random_engine{ std::random_device{}()} {
    if constexpr (std::is_same_v<random_type, double>)
        real_dist(left_b, right_b );
    else
        int_dist( left_b, right_b );
}

template<typename random_type>
random_type rand_helper<random_type>::operator()() {
    if constexpr (std::is_same_v<random_type, double>)
        return real_dist(random_engine);
    else
        return int_dist(random_engine);
}

Run Code Online (Sandbox Code Playgroud)

但是这里某处发生错误,因为当我调用 std::generate 时,我会收到很多错误:

template<typename T,typename vec_type = typename T::value_type>
void fill_contain(T& container,vec_type left_b=vec_type(0), vec_type right_b= vec_type(100)) { …
Run Code Online (Sandbox Code Playgroud)

c++ random template-instantiation

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

为什么 fmt 库不是仅标头?

我知道可以fmt在仅标头模式下使用格式化库:

如何在仅标头模式下使用 fmt 库?

但是 - 为什么不只是标题,句号?也就是说,在 non-header-only 模式下使用它有什么好处?

c++ design-rationale rationale header-only fmt

3
推荐指数
3
解决办法
529
查看次数

是否有与 memmove 等效的标准库?

标准库提供了std::copy,它可以被视为 C 的泛化/泛化memcpy()。它还保持 , 的要求memcpy(),使范围 [ first, ) 与范围 [ , )last不相交;否则我们会有未定义的行为。d_firstd_first + std::distance(first, last)

我的问题:是否有一个通用版本std::memmove(即不提出该要求并且通常使用临时缓冲区来实现)?如果不是,怎么会呢?

c++ idioms memcpy memmove stdcopy

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

当我启用 LTO/IPO 时,为什么 CMake 设置 -no-fat-lto-objects?

我正在使用 CMake 为我的 C 编译启用 IPO(过程间优化):

set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这会导致-flto添加编译器标志。然而,它还补充说-fno-fat-lto-objects:这意味着生成的目标文件将只有中间代码,而不是同时包含正确编译的代码和中间代码;这意味着链接器必须支持我的系统编译器的中间表示并且能够感知 IPO/LT​​O。

我没有要求-fno-fat-lto-objects,也不想。我可以让 CMake 不添加此选项吗?

c compilation cmake intermediate-language lto

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

imul 然后 mov 与 mov 然后 imul - 有什么区别吗?

如果我编译以下 C++ 程序:

int baz(int x) { return x * x; }
Run Code Online (Sandbox Code Playgroud)

在 clang 15 中,我得到:

baz(int):
        mov     eax, edi
        imul    eax, edi
        ret
Run Code Online (Sandbox Code Playgroud)

而 gcc 12.2 给了我:

baz(int):
        imul    edi, edi
        mov     eax, edi
        ret
Run Code Online (Sandbox Code Playgroud)

(请参阅GodBolt

这两种实现是否完全等同,而只是任意选择的问题?如果它们不等价,它们的差异如何体现或影响我的程序?我的意思是,就 CPU 状态副作用、其他指令的延迟、内联期间的行为等而言。

c++ assembly x86-64 cpu-architecture micro-optimization

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

关于cuda的问题

我正在研究GPU编程,并希望了解有关CUDA的更多信息.我已经阅读了很多关于它的内容(来自维基百科,Nvidia和其他参考文献),但我仍然有一些问题:

  1. 以下对架构的描述是否准确?:GPU具有多处理器,每个多处理器都有流处理器,每个流处理器可以同时运行线程块.

  2. 所有引用都声明在一个块内创建的最小线程数是32 ...为什么?

  3. 我有一张ATI Radeon显卡.我能够在没有仿真模式的情况下编译一个简单的CUDA程序!! 我以为我只能在支持的Nvidia VGA上编译和运行CUDA程序.有人可以解释一下吗?

architecture cuda gpu

2
推荐指数
2
解决办法
1928
查看次数

Mingw32 std :: isnan with -ffast-math

我正在使用以下-ffast-math选项编译以下代码:

#include <limits>
#include <cmath>
#include <iostream>

int main() {
    std::cout << std::isnan(std::numeric_limits<double>::quiet_NaN() ) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我输出0.在编译时,我的代码如何判断浮点数是否为NaN -ffast-math

注意:在linux上,std :: isnan甚至可以使用-ffast-math.

g++ mingw32 fast-math

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

如何打印ArrayLists的ArrayList,以便每个内部列表打印在一行?

我有一个ArrayList的ArrayList - 类似于ArrayList<ArrayList<Node>>.由于我将此作为函数的返回值,因此在每次调用后都会调用不同的大小.我想知道如何显示它的元素是这样的方式,内部ArrayList构成一行,因此对于每一行.

for循环的所需参数是什么?提前致谢.

java arraylist pretty-print tostring

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