0

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

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

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

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

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

4

1 回答 1

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)2exponent

如果x0,两者都exponentsignificand0

无论您的编译器支持什么浮点表示(假设double值),这都将起作用。

于 2015-05-10T14:16:45.447 回答