如何从32位浮点数中提取符号,尾数和指数

时间:2015-05-09 23:15:10

标签: c sign exponent mantissa

所以我得到了一个任务,我必须从uint32_t给出的浮点数中提取符号,指数和尾数。我必须在C中这样做,正如您所料,我该怎么做?

对于标志,我会搜索MSB(最高有效位,因为它告诉我我的数字是正数还是负数,取决于它是0还是1)

或者让我们直接了解我的想法,我可以将我的32位数字“拼接”成三部分吗?

获取msb / sign的1位 之后是1个字节,代表指数 最后23位为尾数

它可能不会那样,但你可以给我一个提示/解决方案吗? 我知道freexp,但我想要一个替代方案,在那里我学到更多的C. 谢谢。

1 个答案:

答案 0 :(得分:2)

如果您知道浮点类型的按位布局(例如,因为您的实现支持IEEE浮点表示),则将指针转换为浮点变量(类型为floatdoublelong 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时,得到原始值。

如果x0,则exponentsignificand都将为0

无论编译器支持哪种浮点表示(假设值为double),这都可以正常工作。