@WTFAYD

Почему игнорируются младшие биты при преобразовании из числа с фиксированной точкой в число с плавающей точкой?

Есть 64битное число с фиксированной точкой, которое нужно преобразовать в число с плавающей точкой:

unsigned long fixed = 0x8000000000000001; // Q4.60
double floating = fixed/pow(2,60);
printf("%.100e\n",floating);
/* Вывод: 8.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00 */


По расчетам должно получится число 8 + 2^(-60), однако, почему-то, здесь получается целое число. Дробь пропадает после определенного значения (крайнее число 0x8000000000000401; при нем floating равно 8.00000000000000177635683940025046467781066894531250e+00).

Подскажите пожалуйста, в чем проблема?
  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
@MiiNiPaa
У double точность - 53 значимых двоичных знака. Чтобы записать ваше число нужно 64 бита мантиссы. В x86 extended precision это в принципе влезет, но придётся повозится, чтобы вытащить из регистров и показать это число.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы