我正在尝试找出算法,但我从谷歌得到的只是通过强制转换来完成。我需要知道细节。
所以如果我们有一个 float x 并且想要返回它的二进制表示,我们需要做什么?
我知道如果浮点数为 NaN 或无穷大,我们需要返回浮点数,否则步骤是什么?
编辑
该函数接受一个无符号整数,就像它是一个浮点数一样使用,然后返回该数字表示的整数。我不能使用强制转换,只能使用条件和按位运算符。
我正在尝试找出算法,但我从谷歌得到的只是通过强制转换来完成。我需要知道细节。
所以如果我们有一个 float x 并且想要返回它的二进制表示,我们需要做什么?
我知道如果浮点数为 NaN 或无穷大,我们需要返回浮点数,否则步骤是什么?
编辑
该函数接受一个无符号整数,就像它是一个浮点数一样使用,然后返回该数字表示的整数。我不能使用强制转换,只能使用条件和按位运算符。
或者,使用联合:
typedef union
{
float f_;
int i_;
} FloatBits;
FloatBits fb;
fb.f_ = 1.5;
然后fb.i_
包含映射到的浮点数int
以允许提取位。同样,关于类型大小的常见假设 - 您可以使用sizeof
.
使用这种方法,您可以fb.i_
直接设置位并查看它们映射回float
.
编程语言中的float
数字遵循IEEE 浮点算术标准 (IEEE 754)。c
您可以使用代码转换float
为int
int i = *(int *)&f; // f is the float variable you want to convert
然后int
根据 IEEE 754 标准解释自己。
要测试 32 位值是否表示 NaN(如果它是浮点数),您可以检查其无符号值是否大于无穷大的表示。
int n =
if((n & 0x7FFFFFFF) > 0x7f800000) // is NaN
需要删除符号,因为 NaN 可以将负号位设置为 1(尽管 NaN 不是正数或负数)
如果您想知道浮点数是否为 NAN,可以使用
float f = NAN
if (f != f) // is NAN
与无限比较
float f = INFINITY;
if (f == INFINITY)