我有一个十六进制浮点常量,我想在我的C程序中直接声明,并避免转换。我相信它必须首先正常化,对吗?我如何规范化并声明它?
// hex constant 0xDE.488631
double val = 0xDE.488631; // Error must have exponent.
double val = 0x0.DE488631p-2; // Pretty sure this is wrong.
答案 0 :(得分:17)
您可以使用0
的指数:
float val = 0xDE.488641p0;
其中更正常的符号表示DE.488641×2 0 (当然,在16中)。你的猜测很接近 - 指数是二进制指数,而不是十六进制指数。当你想要一个正指数时,你也使用负指数。更正您的第二个示例,您可以使用:
float val = 0x0.DE488631p8;
在常规数学符号中表示0.DE488631×2 8 ,或等效于指数的十六进制基数,0.DE488631×16 2 。
我认为使用0
的指数更容易理解,除非您有理由使用第二个示例中的表单。
答案 1 :(得分:1)
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
可以附加到浮动常量以强制特定浮动类型)。正如Carl Norum已经建议的那样,使用0的指数作为“无操作”。