【发布时间】:2020-09-25 22:21:51
【问题描述】:
试图创建一个能够重新解释 IEEE 双精度位的 constexpr 类。示例:
constexpr double pi = 3.14159265358979323846;
constexpr fixedpoint a(pi);
但是遇到了 reinterpret_cast 不是常量子表达式的问题。
我在 constexpr fixedpoint& operator=(double rhs) 中使用它:
uint64_t fraction = *reinterpret_cast<const uint64_t*>(&rhs) & 0x000F'FFFF'FFFF'FFFFull;
但编译器将该语句标记为非常量子表达式。
尝试过类型双关语,但遇到了限制,即在 C++ 中只能激活单个字段。
任何人都有一个解决方案,可以让我重新解释作为有效 constexpr 代码的双精度位吗?
【问题讨论】:
-
reinterpret_cast几乎总是是一个错误。 非常确保它做你想做的,并且在达到它之前它具有明确定义的行为。 -
@JesperJuhl 提取双精度位的“正确”方法是什么?
-
double布局是well documented:您可以编写一个函数来计算位。如果你发现你需要一些constexpr数学支持,有一些选项,例如here。 (如果您只有几个特定的值,您可以编写一次性代码来进行非constexpr转换,然后将输出剪切粘贴到您的源代码中。) -
@JesperJuhl 这不是真的,OP 显然知道他们在做什么。他们在
pi = (-1)^s * 1.xxxxxx * 2^yyyyyy(尾数,或fraction)中提取xxxxxx。但是,请注意 C++ 实际上并不要求double是 IEEE 浮点binary64。这可能就是为什么在 C++20 之前的constexpr中不允许这样做的原因,因为编译时计算通常是“抽象的”,而对double进行比特处理则相反。
标签: c++ constexpr reinterpret-cast