如何在 C++11 constexpr 中检查双精度位模式是否为 0x0?

2023-11-23

我想检查给定的双精度/浮点变量是否具有实际的位模式 0x0。别问为什么,Qt 中的一个函数中使用了它(qIsNull())我想成为constexpr.

原始代码使用了联合:

union { double d; int64_t i; } u;
u.d = d;
return u.i == 0;

这不能作为constexpr当然。

下一次尝试是reinterpret_cast:

return *reinterpret_cast<int64_t*>(&d) == 0;

但是,虽然这可以作为constexpr在 GCC 4.7 中,它在 Clang 3.1 中失败(正确地,b/c 指针操作)。

最终的想法是采用 Alexandrescuesque 的方式,这样做:

template <typename T1, typename T2>
union Converter {
    T1 t1;
    T2 t2;
    explicit constexpr Converter( T1 t1 ) : t1(t1) {}
    constexpr operator T2() const { return t2; }
};

// in qIsNull():
return Converter<double,int64_t>(d);

但这对于 Clang 来说也不够聪明:

note: read of member 't2' of union with active member 't1' is not allowed in a constant expression
constexpr operator T2() const { return t2; }
                                       ^

还有其他人有好主意吗?


我想检查给定的双精度/浮点变量是否具有实际的位模式 0x0

但如果是constexpr那么它不会检查任何variable,它正在检查value该变量被静态确定为保持。这就是为什么你不应该使用指针和联合技巧,“正式”没有任何内存可以指向。

如果您可以说服您的实现执行非陷阱 IEEE 除零运算,那么您可以执行以下操作:

return (d == 0) && (1 / d > 0)

Only +/-0等于 0。1/-0 is -Inf,不大于 0。1/+0 is +Inf,即。但我不知道如何使非陷阱算术发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C++11 constexpr 中检查双精度位模式是否为 0x0? 的相关文章

随机推荐