Спецификатор формата%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 и обработка округления требуют немалых усилий.
Предостережение: ввод-вывод может занять даже больше времени, чем форматирование символов, что может свести на нет эти преимущества; и вместо этого вы можете просто распечатать необработанные байты без форматирования.