-1

我必须用浮点数表示二进制数。我有一个十六进制数作为 FFFF,当我将此十六进制数转换为二进制时,我得到相应的二进制数为 1111111111111111。我的英特尔处理器使用的存储格式是 32 位,意味着 1 位用于符号,8 位用于指数, 尾数为 23 位。我有一些想法,但很困惑。谁能帮我看看这个二进制数对应的浮点值是多少?

4

2 回答 2

4

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

于 2012-12-02T19:47:58.780 回答
3

假设 IEEE-754 32 位浮点数,0xFFFFFFFF(所以 32 个):

第一个是符号,所以它是一个负浮点数。然后是指数,因为它是最大值,所以它是一个“特殊”指数。

因为有效数不为零,所以结果是NaN

资料来源:维基百科

如果你只想要 16 个,那么:

假设剩余位为零并且我们使用的是小端序,我们将有 `0xFFFF0000`。这仍然不足以使有效数字为零,因此结果仍然是 `NaN`。事实上,无论您为最后 16 位选择哪个值,结果都将始终为“NaN”。

显然,MvG 所证明的情况并非如此。

假设剩余位为零,则输入为0x0000FFFF。第一位是符号,它是零。所以我们有一个正浮动。
然后我们有 8 位的指数。由于它们都为零,我们将(取决于分数)为零或次正规数。
因为分数不是全零,所以这个浮点数是次正规数。
此时,我们已经检查了 9 位,所以还有 7 个额外的零。
分数由 7 个零组成,后跟 16 个 1,因此有效位是 (in binary) 0.00000001111111111111111。乘以,2e-126你就会得到答案。
结果显然是9.18341e-41.

于 2012-12-02T19:48:53.707 回答