На каких правилах основана шестнадцатеричная нотация в printf для вещественных чисел?

17.0 - в десятеричной можно записать как 1.7e+01
При переводе в шестнадцатиричную систему исчисления данное число превратиться в 0x11
В printf есть параметр "aA" при его использовании для вывода в научной нотации он выведит данное число таким образом:
0x8,8p+1
Может кто знает на основании каких правил printf вывел так, а не по аналогии с десятеричной:
0x1,1p+1
В частности в справки по printf указано, что:

Note that there may be multiple valid ways to represent floating-
point numbers in this hexadecimal format. For example,
0x1.92p+1, 0x3.24p+0, 0x6.48p-1, and 0xc.9p-2 are all equivalent.

Где можно почитать почему так происходит, почему такие разные вариации записи одно числа в шестнадцатеричной системе исчисления?
  • Вопрос задан
  • 148 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Что собой представляет 17? Это 100012, или 1,00012·24, или 1000,10002·21. Теперь видите, откуда две восьмёрки и порядок 1? Правильно не 0x1.1p+1, а 0x1.1p+4.

На основании каких правил — не могу сказать, думаю, какая-то оптимизация. Подождите, скачаю Qt, выяснилось, что на домашнем компе не осталось ничего прогерского.

Моя первая догадка. Если исходное число было float, то первая цифра 8…F тупо проще: отрезаешь порядок и знак, добавляешь неявную единицу, и получаем 24 бита, шесть шестнадцатеричных цифр.

Действительно библиотека MinGW выводит первую цифру 8…F, что для float, что для double. Зачем, не знаю.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Где можно почитать почему так происходит, почему такие разные вариации записи одно числа в шестнадцатеричной системе исчисления?

Разве что в спецификации использованной библиотеки языка C. Потому что в стандарте явно сказано, что первая цифра в таком представлении -- unspecified:
A double argument representing a floating-point number is converted in the
style [−]0xh.hhhh p±d, where there is one hexadecimal digit (which is
nonzero if the argument is a normalized floating-point number and is
otherwise unspecified) before the decimal-point character...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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