Спецификатор формата% a для printf() в C
Я читаю книгу на языке C, он сказал, что %f, %e, %g, %a
были символами printf, используемыми для типов данных float
и double
. В настоящее время я полностью понимаю %f, %e, %g
.
Когда мне нужно использовать %a
для печати данных float
и double
?
Не могли бы вы показать мне пример.
Ответы
Ответ 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) назад к модели установки, чтобы закрыть цикл.