在 const / static 初始值设定项中输入双关语(从位构建浮点常量)

Type punning in a const / static initializer (building a float constant from bits)

一些语言(如 Rust、Zig、GLSL、HLSL)具有内置方法,可以从作为无符号整数提供的位构建浮点类型。但是 C 和 C++ 没有标准函数。

在 C99 中,我们可以使用带有成员初始化的匿名联合来实现类型双关宏,达到相同的效果:

#define FLOAT_FROM_BITS(U,F,b) (((union{U u; F f;}){.u=(b)}).f)
#define FLOAT32_FROM_BITS(i) FLOAT_FROM_BITS(uint32_t, float,  i)
#define FLOAT64_FROM_BITS(i) FLOAT_FROM_BITS(uint64_t, double, i)

随后可用于初始化 const / static。在 C++ 中执行此操作的最优雅方法是什么,以便它也可以用于静态初始化?

一种优雅的方法是使用 std::bit_cast:

std::uint64_t i = example_value();
auto d = std::bit_cast<double>(i);

如果你能用C++20或以上,那就用std::bit_cast like

auto myvar = std::bit_cast<type_to_cast_to>(value_to_cast);

如果你想支持旧版本,你可以使用 std::memcpy 将字节从一种类型复制到另一种类型来做同样的事情。那会给你一个像

这样的函数
template <class To, class From>
To bit_cast(const From& src)
{
    To dst;
    std::memcpy(&dst, &src, sizeof(To));
    return dst;
}