Шестнадцатеричные константы с плавающей точкой в ​​C - PullRequest
9 голосов
/ 30 марта 2011

У меня есть шестнадцатеричная константа с плавающей точкой, которую я хотел бы объявить непосредственно в моей C-программе и избежать преобразования.Я считаю, что это должно быть сначала нормализовано, верно?Как мне его нормализовать и объявить?

// hex constant 0xDE.488631  
double val = 0xDE.488631; // Error must have exponent.
double val = 0x0.DE488631p-2;  // Pretty sure this is wrong.

Ответы [ 2 ]

17 голосов
/ 30 марта 2011

Вы можете использовать показатель степени 0:

float val = 0xDE.488641p0;

Что в более нормальном виде означает DE.488641 × 2 0 (в базе 16, конечно). Ваше предположение было близко - показатель степени равен двоичному , а не показателю шестнадцатеричного значения. Вы также используете отрицательный показатель, когда хотите получить положительный показатель. Исправляя свой второй пример, вы можете использовать:

float val = 0x0.DE488631p8;

Что в обычной математической записи означает 0.DE488631 × 2 8 , или эквивалентно с шестнадцатеричным основанием для показателя степени, 0.DE488631 × 16 2 .

Я думаю, что использовать показатель степени 0 гораздо проще для понимания, если у вас нет причин использовать форму из второго примера.

1 голос
/ 30 марта 2011

Стандарт C99 указывает, что шестнадцатеричная константа с плавающей точкой должна иметь показатель степени:

§6.4.4.2 Плавающие константы

    hexadecimal-floating-constant:  
        hexadecimal-prefix hexadecimal-fractional-constant  
            binary-exponent-part floating-suffix[opt]  
        hexadecimal-prefix hexadecimal-digit-sequence  
            binary-exponent-part floating-suffix[opt]

Из этого определения вы можете видеть, что только плавающий суффикс является необязательным (то есть f или l, который может быть добавлен к плавающей константе для принудительного использования определенного плавающего типа). Как уже предположил Карл Норум, используйте показатель степени 0 в качестве & ldquo; no-op & rdquo;.

...