我想检查给定的双精度/浮点变量是否具有实际的位模式 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(使用前将#替换为@)