Twój kod nie działa dobrze w zakresie (-2, 2). Przykładowe testy:
1.21961
40 1c 1c 50 - bad
3f 9c 1c 50 - good
1.81885
40 68 d0 20 - bad
3f e8 d0 20 - good
1.99846
40 7f cd 80 - bad
3f ff cd 80 - good
1.13665
40 11 7d d0 - bad
3f 91 7d d0 - good
1.52955
40 43 c8 70 - bad
3f c3 c8 70 - good
-1.07406
c0 9 7a e0 - bad
bf 89 7a e0 - good
1.09125
40 b ae 20 - bad
3f 8b ae 20 - good
Warto zauważyć, że kod jest nieoptymalny dla dużych liczb typu float.
rzutowanie reinterpret_cast
unsigned char* hip = reinterpret_cast<unsigned char*>(&num);