如何从 32 位浮点数中提取符号、尾数和指数
How to extract the sign, mantissa and exponent from a 32-Bit float
所以我接到了一个任务,我必须从给定的浮点数 uint32_t 中提取符号、指数和尾数。我必须在 C 中执行此操作,如您所料,我该怎么做?
对于符号,我会搜索 MSB(最高有效位,因为它告诉我我的数字是正数还是负数,具体取决于它是 0 还是 1)
或者让我们直接进入我的想法,我可以 "splice" 我的 32 位数分成三部分吗?
获得 msb/sign 的第 1 位
然后是1个字节代表指数
尾数的最后 23 位
它可能不会那样工作,但你能给我一个 hint/solution 吗?
我知道 freexp,但我想要一个替代方案,在那里我可以学到更多的 C。
谢谢。
如果您知道浮点类型的按位布局(例如,因为您的实现支持 IEEE 浮点表示),则将指针转换为您的浮点变量(float
、double
类型) , 或 long double
) 转换为指向 unsigned char
的指针。从那里,将变量视为 unsigned char
的数组,并使用按位运算提取所需的部分。
否则,执行此操作;
#include <math.h>
int main()
{
double x = 4.25E12; /* value picked at random */
double significand;
int exponent;
int sign;
sign = (x >= 0) ? 1 : -1; /* deem 0 to be positive sign */
significand = frexp(x, &exponent);
}
上面sign
的计算应该很明显了
significand
可能是正数也可能是负数,对于非零x
。 significand
的绝对值在 [0.5,1)
范围内,乘以 2
的 exponent
次方得到原始值。
如果 x
是 0
,exponent
和 significand
都将是 0
。
无论您的编译器支持何种浮点表示(假设 double
值),这都将起作用。
所以我接到了一个任务,我必须从给定的浮点数 uint32_t 中提取符号、指数和尾数。我必须在 C 中执行此操作,如您所料,我该怎么做?
对于符号,我会搜索 MSB(最高有效位,因为它告诉我我的数字是正数还是负数,具体取决于它是 0 还是 1)
或者让我们直接进入我的想法,我可以 "splice" 我的 32 位数分成三部分吗?
获得 msb/sign 的第 1 位 然后是1个字节代表指数 尾数的最后 23 位
它可能不会那样工作,但你能给我一个 hint/solution 吗? 我知道 freexp,但我想要一个替代方案,在那里我可以学到更多的 C。 谢谢。
如果您知道浮点类型的按位布局(例如,因为您的实现支持 IEEE 浮点表示),则将指针转换为您的浮点变量(float
、double
类型) , 或 long double
) 转换为指向 unsigned char
的指针。从那里,将变量视为 unsigned char
的数组,并使用按位运算提取所需的部分。
否则,执行此操作;
#include <math.h>
int main()
{
double x = 4.25E12; /* value picked at random */
double significand;
int exponent;
int sign;
sign = (x >= 0) ? 1 : -1; /* deem 0 to be positive sign */
significand = frexp(x, &exponent);
}
上面sign
的计算应该很明显了
significand
可能是正数也可能是负数,对于非零x
。 significand
的绝对值在 [0.5,1)
范围内,乘以 2
的 exponent
次方得到原始值。
如果 x
是 0
,exponent
和 significand
都将是 0
。
无论您的编译器支持何种浮点表示(假设 double
值),这都将起作用。