Chcę sprawdzić, czy dana zmienna double/float ma rzeczywisty wzorzec bitowy 0x0. Nie pytaj dlaczego, jest on używany w funkcji w Qt (qIsNull()
), którą chciałbym być constexpr
.Jak sprawdzić wzorzec bitów podwójnych to 0x0 w constexpr C++ 11?
Oryginalny kod używany do unii:
union { double d; int64_t i; } u;
u.d = d;
return u.i == 0;
to nie działa jako constexpr
oczywiście.
Kolejna próba była z reinterpret_cast
:
return *reinterpret_cast<int64_t*>(&d) == 0;
Ale jednocześnie, że pracuje jako constexpr
w GCC 4.7, nie powiedzie się (słusznie, b/c manipulacji wskaźnik) w Clang 3.1.
Ostatnim pomysłem było iść i zrobić to 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);
Ale to nie jest wystarczająco mądry dla Clang, albo:
note: read of member 't2' of union with active member 't1' is not allowed in a constant expression
constexpr operator T2() const { return t2; }
^
Czy ktoś ma dobry pomysł?
Chyba są inne wzory bitowe, które również reprezentują zmiennoprzecinkowych 0, że don Chcesz znaleźć? –
Istnieją dokładnie dwa wzory bitowe, które reprezentują 0. Są to 000 ... 000 i 100 ... 000. Pierwszy bit to bit znaku. Drugi wzór bitowy jest czasami określany jako "zero ujemne". – user763305
Być może 'return d == 0 && 1/d> 0;'? (http://en.wikipedia.org/wiki/Signed_zero#Comparisons) –