Шестнадцатеричные константы с плавающей запятой в 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".