与えられたdouble/float変数が実際のビットパターン0x0を持っていることを確認したいと思います。理由を聞かないでください.Qt(qIsNull()
)の関数で、constexpr
になりたいと考えています。doubleのビットパターンをチェックする方法はC++ 11のconstexprでは0x0ですか?
元のコードは、労働組合を使用:
union { double d; int64_t i; } u;
u.d = d;
return u.i == 0;
これは当然のconstexpr
として動作しません。
次のtryはreinterpret_cast
していました:
return *reinterpret_cast<int64_t*>(&d) == 0;
しかし、それはGCC 4.7でconstexpr
として働いている間、それは(、当然Bポインタ操作のC /)失敗したクラン3.1インチ
最終アイデアは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);
をしかし、それはどちらか、クランのための十分な賢いではありません。
note: read of member 't2' of union with active member 't1' is not allowed in a constant expression
constexpr operator T2() const { return t2; }
^
誰が良いアイデアを持っていますか?
私はまた、浮動小数点0を表す他のビットパターンがあると思い、あなたのドンこと見つけたくないのですか? –
0を表す正確に2つのビットパターンがあります。それらは000 ... 000と100 ... 000です。最初のビットは符号ビットです。第2のビットパターンは、「負のゼロ」と呼ばれることもある。 – user763305
おそらく 'return d == 0 && 1/d> 0;'? (http://en.wikipedia.org/wiki/Signed_zero#Comparisons) –