使用 IEEE-754 格式化浮点数
Format a float using IEEE-754
我在 C 中有一个作业,其中我得到了一个浮点数,并且必须使用 IEEE-754 格式打印它:
__(sign)mantissa * 2^(exponent)__
符号可以是“-”或“”,指数是 int 值,尾数是 float 值。除了 stdio.h 中的函数(用于 printf 函数),我也不能使用 struct
s 或任何库中存在的函数。这应该使用按位运算来完成。
我被赋予了两个功能:
- unsignedToFloat:给定一个unsigned int,returns一个具有相同位的float;
- floatToUnsigned:给定一个浮点数,returns一个具有相同位的无符号整数;
在将浮点数表示为无符号整数后,我设法确定了任何浮点数的符号和指数。我还设法确定了位中的尾数。例如,给定浮点数 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,速度慢,可能会给我错误的结果。
说到这里,我完全没思路了。我如何将浮点数的尾数表示为它自己的东西?
- 将
float
转换为 unsigned int
。
- 清除符号位(使用按位与
&
)。
- 设置指数,使其等于偏差(使用按位与
&
和或 |
)。
- 将修改后的值从
unsigned int
转换为float
。
- 使用
printf
打印新值。
这是可行的,因为清除符号位并将指数设置为偏差会使您得到 (positive)mantissa * 2^0 = mantissa
,因此 printf
将为您打印尾数。
我在 C 中有一个作业,其中我得到了一个浮点数,并且必须使用 IEEE-754 格式打印它:
__(sign)mantissa * 2^(exponent)__
符号可以是“-”或“”,指数是 int 值,尾数是 float 值。除了 stdio.h 中的函数(用于 printf 函数),我也不能使用 struct
s 或任何库中存在的函数。这应该使用按位运算来完成。
我被赋予了两个功能:
- unsignedToFloat:给定一个unsigned int,returns一个具有相同位的float;
- floatToUnsigned:给定一个浮点数,returns一个具有相同位的无符号整数;
在将浮点数表示为无符号整数后,我设法确定了任何浮点数的符号和指数。我还设法确定了位中的尾数。例如,给定浮点数 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,速度慢,可能会给我错误的结果。
说到这里,我完全没思路了。我如何将浮点数的尾数表示为它自己的东西?
- 将
float
转换为unsigned int
。 - 清除符号位(使用按位与
&
)。 - 设置指数,使其等于偏差(使用按位与
&
和或|
)。 - 将修改后的值从
unsigned int
转换为float
。 - 使用
printf
打印新值。
这是可行的,因为清除符号位并将指数设置为偏差会使您得到 (positive)mantissa * 2^0 = mantissa
,因此 printf
将为您打印尾数。