我必须用浮点数表示二进制数。我有一个十六进制数作为 FFFF,当我将此十六进制数转换为二进制时,我得到相应的二进制数为 1111111111111111。我的英特尔处理器使用的存储格式是 32 位,意味着 1 位用于符号,8 位用于指数, 尾数为 23 位。我有一些想法,但很困惑。谁能帮我看看这个二进制数对应的浮点值是多少?
2 回答
32 个
简单地尝试一下:
#include <stdio.h>
int main() {
union {
unsigned i;
float f;
} u;
u.i = 0xffffffff;
printf("%f\n", u.f);
return 0;
}
打印-nan
。该实验假设您实际上0xffffffff
不想要0xffff
您的问题所述。
查看http://en.wikipedia.org/wiki/Single_precision,您会发现指数0xFF
与非零有效数一起被视为 NaN。
16 个
如果您真的只是在追求0xFFFF
,正如您的问题所写,那么代码将打印0.000000
,但将更%f
改为%g
您得到9.18341e-41
。这是因为整数和浮点数都使用相同的字节序,即您正在谈论对应于位模式的浮点数0x0000ffff
。
在那里你看到你现在将有零符号(即正数)、零指数和一个非零有效数。根据同一篇维基百科文章,这代表了一个低于正常的数字。所以这实际上是 0xffff ∙ 2 −149 = 65535 ∙ 2 −149。
假设 IEEE-754 32 位浮点数,0xFFFFFFFF
(所以 32 个):
第一个是符号,所以它是一个负浮点数。然后是指数,因为它是最大值,所以它是一个“特殊”指数。
因为有效数不为零,所以结果是NaN
。
资料来源:维基百科。
如果你只想要 16 个,那么:
显然,MvG 所证明的情况并非如此。
假设剩余位为零,则输入为0x0000FFFF
。第一位是符号,它是零。所以我们有一个正浮动。
然后我们有 8 位的指数。由于它们都为零,我们将(取决于分数)为零或次正规数。
因为分数不是全零,所以这个浮点数是次正规数。
此时,我们已经检查了 9 位,所以还有 7 个额外的零。
分数由 7 个零组成,后跟 16 个 1,因此有效位是 (in binary) 0.00000001111111111111111
。乘以,2e-126
你就会得到答案。
结果显然是9.18341e-41
.