Подтвердить что ты не робот

Спецификатор формата% a для printf() в C

Я читаю книгу на языке C, он сказал, что %f, %e, %g, %a были символами printf, используемыми для типов данных float и double. В настоящее время я полностью понимаю %f, %e, %g.

Когда мне нужно использовать %a для печати данных float и double?

Не могли бы вы показать мне пример.

4b9b3361

Ответ 1

Спецификатор форматирования %a является новым в C99. Он печатает число с плавающей запятой в шестнадцатеричной форме. Это не то, что вы хотели бы использовать для представления чисел пользователям, но это очень удобно для случаев с недостаточным капотом/техническим использованием.

В качестве примера, этот код:

printf("pi=%a\n", 3.14);

печатает:

pi=0x1.91eb86p+1

Отличная статья, связанная в комментариях, объясняет, что это должно быть прочитано "1.91EB86 16 * 2 1" (т.е. p для power-of-two число с плавающей запятой увеличивается до). В этом случае "1.91EB86 16" означает "1.5700000524520874 10". Умножьте это на "2 1", и вы получите "3.140000104904175 10".

Обратите внимание, что это также имеет полезное свойство сохранения всех битов точности и представления их надежным способом.

Ответ 2

В качестве примера того, почему вы хотите использовать шестнадцатеричное представление, вы можете использовать% a для точного представления значения с плавающей запятой, отправляемого на другую машину для обработки.

Мы используем это в настоящее время для модульного тестирования встроенного контроллера, отправляя данные с моделируемой модели завода, которая имитирует датчики и исполнительные механизмы для встроенного процессора через UART, где встроенный процессор контролирует обработку и возвращает обратную связь (опять же, float, представленный как% a) назад к модели установки, чтобы закрыть цикл.