c - 如何从 32 位 float 中提取符号、尾数和指数

标签 c sign exponent mantissa

<分区>

所以我接到了一个任务,我必须从给定为 uint32_t 的 float 中提取符号、指数和尾数。我必须在 C 中执行此操作,如您所料,我该怎么做?

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

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

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

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

最佳答案

如果您知道浮点类型的按位布局(例如,因为您的实现支持 IEEE 浮点表示),则将指针转换为您的浮点变量(类型为 floatdouble 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) 范围内,乘以 2exponent< 次方 给出原始值。

如果x0,则exponentsignificand 都将为0 .

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

关于c - 如何从 32 位 float 中提取符号、尾数和指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30146048/

相关文章:

java - Netbeans 类加载器在使用签名 jar 加载资源时速度缓慢

ruby - Ruby 中的大指数?

android - 在 Android 设备上重新签名应用程序(.apk、.air)。类命令行

c - 代码错误? [C]

c - "sorted"的确切含义

c - 出队功能不起作用

android - 如何为 Google App Signing 生成上传 key ?

matlab - 在 MATLAB GUI 弹出菜单中写入指数

python - 如何在 Python 中得到 10**20 + 10**-20 的精确结果?它给了我 1e+20

c - Sizeof 返回不正确的数组长度