Этот синтаксис 0x1.fffffffffffffp-1
великолепен, но только в C99 или C ++ 17.
Но есть обходной путь, нет (указатель) преобразования, нет UB / IB, просто математика.
double x = (double)0x1fffffffffffff / (1LL << 53);
Если мне нужен Pi, а Pi (double) равен 0x1.921fb54442d18p1 в шестнадцатеричном виде, просто напишите
const double PI = (double)0x1921fb54442d18 / (1LL << 51);
Если у вашей константы большой или маленький показатель степени, вы можете использоватьфункция exp2
вместо сдвига, но exp2
- это C99 / C ++ 11 ... Используйте pow
для спасения!