Шестнадцатеричная плавающая константа в C

0x0.3p10 представляет какое значение?

А какой смысл p в приведенном выше выражении?

Ответ 1

0x0.3p10 - пример шестнадцатеричного литерала с плавающей запятой, введенного в C99. p отделяет базовое число от экспоненты.

Бит 0x0.3 называется значимой частью (целым с необязательной долей), а экспонентой является степень двух, по которой она масштабируется.

Это конкретное значение вычисляется как 0.3 в шестнадцатеричном выражении или 3 * 16-1 (3/16), умноженное на 210 (1024), которое дает 3 * 1024 / 16 или 192.

Следующая программа подтверждает это:

#include <stdio.h>
int main (void) {
    double d = 0x0.3p10;
    printf ("%.f\n", d);
    return 0;
}

Раздел 6.4.4.2 для C99 содержит все детали:

Плавающая константа имеет значительную часть, за которой может следовать экспоненциальная часть и суффикс, который указывает его тип. Компоненты значимой части могут включать в себя цифровую последовательность, представляющую часть целого числа, за которой следует период (.), За которым следует представляющая часть дроби.

Компоненты экспоненциальной части представляют собой e, E, p или P, за которыми следует показатель, состоящий из необязательно подписанной цифровой последовательности. Должна присутствовать либо часть целого числа, либо часть фракции; для десятичных плавающих констант должен присутствовать либо период, либо экспоненциальная часть.

Значимая часть интерпретируется как (десятичное или шестнадцатеричное) рациональное число; последовательность цифр в экспоненциальной части интерпретируется как десятичное целое число. Для десятичных плавающих констант показатель показывает мощность 10, по которой значительная часть должна масштабироваться. Для шестнадцатеричных плавающих констант показатель показывает мощность 2, по которой значительная часть должна быть масштабирована.

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