使用IEEE-754格式化浮点数

时间:2018-04-10 20:55:37

标签: c floating-point ieee-754

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

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

符号可以是' - '或'',指数是int值,尾数是浮点值。我也不能使用struct或除stdio.h中的任何库中的任何函数(对于printf函数)。这应该使用按位运算完成。

我有两个职能:

  • unsignedToFloat :给定unsigned int,返回一个具有相同位的浮点数;
  • floatToUnsigned :给定一个float,返回一个带有相同位的unsigned int;

将浮点表示作为unsigned int后,我设法确定任何浮点数的符号和指数。我还设法以位为单位确定尾数。例如,给定浮点数3.75:

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

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

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

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

但是,这种方法看起来非常糟糕,速度慢,可能会给我错误的结果。

说到这里,我完全没有想法。我如何将浮点数的尾数表示为自己的东西?

1 个答案:

答案 0 :(得分:-1)

  1. float转换为unsigned int
  2. 清除符号位(使用按位AND &)。
  3. 设置指数,使其等于偏差(使用按位AND &和OR |)。
  4. 将修改后的值从unsigned int转换为float
  5. 使用printf打印新值。
  6. 这是有效的,因为清除符号位并将指数设置为偏差会使您(positive)mantissa * 2^0 = mantissa,因此printf将为您打印尾数。