Спецификатор формата% a для printf () в C - PullRequest
19 голосов
/ 28 января 2011

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

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

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

Ответы [ 2 ]

35 голосов
/ 28 января 2011

Спецификатор форматирования %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 ».

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

6 голосов
/ 12 апреля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...