#include <iostream>
#include <limits>
#define WRITE_F2U(x) std::cout<<(#x)<<" == "<<convertFloatToBinary(x)<<"\n" ;
#define OUT_S(x) std::cout<<(#x)<<" == "<<(x)<<"\n" ;
unsigned convertFloatToBinary(float f)
{
return *reinterpret_cast<unsigned*>(&f) ;
}
int main(int argc, char **argv)
{
float f1 = std::numeric_limits<float>::quiet_NaN() ;
bool b1 = f1==std::numeric_limits<float>::quiet_NaN() ; //zawsze false
bool b2 = !(f1==f1) ; //zawsze true
OUT_S(b1) ;
OUT_S(b2) ;
OUT_S(f1) ;
WRITE_F2U(f1);
WRITE_F2U(f1);
WRITE_F2U(std::numeric_limits<float>::quiet_NaN());
return 0;
}
wynik:
b1 == 0
b2 == 1
f1 == nan
f1 == 2143289344
f1 == 2143289344
std::numeric_limits<float>::quiet_NaN() == 2143289344
Znam wystarczająco standard IEEE754, wiem, że sprawdza się, czy liczba jest nanem właśnie w drugi sposób. Ale właściwie dlaczego tak? Dlaczego ta liczba "nie jest równa sobie"?