我在C中有一个作业,我给了一个浮点数,并且必须使用IEEE-754格式打印它:
__(sign)mantissa * 2^(exponent)__
符号可以是' - '或'',指数是int值,尾数是浮点值。我也不能使用struct
或除stdio.h中的任何库中的任何函数(对于printf函数)。这应该使用按位运算完成。
我有两个职能:
将浮点表示作为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
但是,这种方法看起来非常糟糕,速度慢,可能会给我错误的结果。
说到这里,我完全没有想法。我如何将浮点数的尾数表示为自己的东西?
答案 0 :(得分:-1)
float
转换为unsigned int
。&
)。&
和OR |
)。unsigned int
转换为float
。printf
打印新值。这是有效的,因为清除符号位并将指数设置为偏差会使您(positive)mantissa * 2^0 = mantissa
,因此printf
将为您打印尾数。