Что такое p-нотация в C-программировании? - PullRequest
3 голосов
/ 07 февраля 2010

Я изучаю C прямо сейчас, и есть спецификатор преобразования% a, который записывает число в p-нотации, в отличие от% e, который пишет что-то в e-нотации (экспоненциальная запись).

Что такое р-нотация?

Ответы [ 5 ]

7 голосов
/ 07 февраля 2010

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

Этот спецификатор формата, наряду со многими другими, был добавлен как часть стандарта C99. У Dinkumware есть отличная справочная библиотека C99 , бесплатная онлайн; это компания PJ Plauger, и он имел много общего со стандартными библиотеками C89 и C99. Ссылка выше на функции печати; общая ссылка на библиотеку http://www.dinkumware.com/manuals/default.aspx

5 голосов
/ 07 февраля 2010

Вот выдержка из стандарта c99, раздел 7.19.6.1 (7), в которой показаны детали для% a или% A (аналогично деталям mac, приведенным выше в dmckee):

Двойной аргумент, представляющий число с плавающей точкой преобразуется в стиль [-] 0xh.hhhhp ± d, где есть одна шестнадцатеричная цифра (которая ненулевой, если аргумент нормализованное число с плавающей точкой и в противном случае не указано) до знак десятичной точки и количество шестнадцатеричных цифр после него равен точности; если точность отсутствует, а FLT_RADIX степень 2, то точность достаточно для точного представления стоимости; если точность отсутствует и FLT_RADIX не является силой 2, то точность достаточна различать248) значения типа двойной, за исключением того, что завершающие нули могут быть опущенным; если точность равна нулю и флаг # не указан, нет появляется символ десятичной точки. буквы abcdef используются для преобразование и буквы ABCDEF для Конверсия А преобразование спецификатор производит число с X и Р вместо х и р. Экспонента всегда содержит хотя бы одну цифру, и только столько цифр, сколько необходимо представить десятичную показатель степени 2. Если значение равно нулю, показатель равен нулю.

3 голосов
/ 07 февраля 2010

Из справочной страницы printf(3) в моем Mac OS X box (следовательно, реализация стандартной библиотеки BSD c):

аА
Двойной аргумент округляется и преобразуется в шестнадцатеричный нота- в стиле [-] 0xh.hhhp [+ -] d, где количество цифр после того, как символ шестнадцатеричной точки равен точности Спецификация. Если точность отсутствует, она принимается за достаточно для точного представления числа с плавающей точкой, и нет происходит округление. Если точность равна нулю, шестнадцатеричная точка отсутствует персонаж появляется. Р - это буквальный символ p', and the exponent consists of a positive or negative sign followed by a decimal number representing an exponent of 2. The A conversion uses the prefix ``0X'' (rather than ``0x''), the letters ``ABCDEF'' (rather than ``abcdef'') to represent the hex digits, and the letter Р '(а не `р') для разделения мантиссы и показатель.

'p' (или 'P') служит для отделения (шестнадцатеричной) мантиссы от (шестнадцатеричной) степени.

Эти спецификаторы не в моем K & R, и на странице руководства не указано, какой стандарт (если есть) определяет их.

Я только что установил свой Debian 5.0 box (используя glibc 2.7), который также имеет ; на этой странице руководства написано, что она связана с c99 (опять же, нет ссылки на какой-либо конкретный стандарт).

2 голосов
/ 07 февраля 2010

Это может быть полезно: http://www.cppreference.com/wiki/c/io/printf

В частности, вот спецификаторы формата, которые можно использовать в printf (без модификаторов, таких как .02 и т. Д.):

Code    Format
%c  character
%d  signed integers
%i  signed integers
%I64d   long long (8B integer), MS-specific
%I64u   unsigned long long (8B integer), MS-specific
%e  scientific notation, with a lowercase “e”
%E  scientific notation, with a uppercase “E”
%f  floating point
%g  use %e or %f, whichever is shorter
%G  use %E or %f, whichever is shorter
%o  octal
%s  a string of characters
%u  unsigned integer
%x  unsigned hexadecimal, with lowercase letters
%X  unsigned hexadecimal, with uppercase letters
%p  a pointer
%n  the argument shall be a pointer to an integer into which is placed the number of characters written so far
2 голосов
/ 07 февраля 2010

Нет спецификатора формата %a (насколько я знаю, и, конечно, нет ни в одной из распространенных реализаций).

Существует спецификатор формата %p, который печатает адрес указателя.

Ref .

ОБНОВЛЕНИЕ: пожалуйста, смотрите другие сообщения.

...