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

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

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

Можете ли вы показать мне пример.

3 ответа

Решение

%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 ".

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

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

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

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

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

Предостережение: ввод-вывод может занять даже больше времени, чем форматирование символов, что может свести на нет эти преимущества; и вместо этого вы можете просто распечатать необработанные байты без форматирования.

Другие вопросы по тегам