使用 IEEE-754 格式化浮点数

Format a float using IEEE-754

我在 C 中有一个作业,其中我得到了一个浮点数,并且必须使用 IEEE-754 格式打印它:

__(sign)mantissa * 2^(exponent)__

符号可以是“-”或“”,指数是 int 值,尾数是 float 值。除了 stdio.h 中的函数(用于 printf 函数),我也不能使用 structs 或任何库中存在的函数。这应该使用按位运算来完成。

我被赋予了两个功能:

在将浮点数表示为无符号整数后,我设法确定了任何浮点数的符号和指数。我还设法确定了位中的尾数。例如,给定浮点数 3.75:

> bit representation: 01000000011100000000000000000000;
> sign: 0 (' ');
> exponent = 10000000 (128 - bias = 1)
> mantissa = 11100000000000000000000

现在,在这个例子中,我应该将尾数表示为“1.875”。但是,我无法进行此转换。到目前为止,我已经尝试创建另一个浮点数 000000000[mantissa],但它给了我错误的结果(我现在明白为什么了)。我被告知尾数在开头有一个 1,这意味着在这个例子中,尾数将变成 1.111,但我没有被告知具体如何做到这一点。我尝试在网上搜索,但找不到在尾数开头加 1 的任何方法。

我还想通过遍历尾数的每一位并获取其十进制表示,然后加 1 来完成这部分。在这个例子中,我将执行以下操作:

> 11100000000000000000000
> as_float = 2^-1 + 2^-2 + 2^-3
> as_float += 1

但是,这种方法似乎很 hack-y,速度慢,可能会给我错误的结果。

说到这里,我完全没思路了。我如何将浮点数的尾数表示为它自己的东西?

  1. float 转换为 unsigned int
  2. 清除符号位(使用按位与&)。
  3. 设置指数,使其等于偏差(使用按位与 & 和或 |)。
  4. 将修改后的值从unsigned int转换为float
  5. 使用printf打印新值。

这是可行的,因为清除符号位并将指数设置为偏差会使您得到 (positive)mantissa * 2^0 = mantissa,因此 printf 将为您打印尾数。