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

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

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

2 ответов


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

float val = 0xDE.488641p0;

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

float val = 0x0.DE488631p8;

что в регулярных математических обозначениях означает 0.DE488631×28, или эквивалентно с шестнадцатеричной базой для экспоненты, 0.DE488631×162.

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


стандарт 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 в качестве "no-op".