【问题标题】:How to extract the sign, mantissa and exponent from a 32-Bit float [duplicate]如何从 32 位浮点数中提取符号、尾数和指数 [重复]
【发布时间】:2015-07-20 16:20:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 应用位运算

标签: c sign exponent mantissa


【解决方案1】:

如果您知道浮点类型的按位布局(例如,因为您的实现支持 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 可以是正数或负数,对于非零 xsignificand 的绝对值在[0.5,1) 的范围内,当乘以2exponent 的幂时,得到原始值。

如果x0,则exponentsignificand 都将是0

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

【讨论】:

  • 对于第一部分,你的意思是如果你有float xfloat* p_x = (float*) &amp;x..你如何将它转换为指向unsigned char的指针?像这样:unsigned char* ucp_x = (unsigned char*) p_x?
  • 那么你将如何“像数组一样”访问它?
  • 如果你需要问这个,你不了解数组和指针之间的关系。任何基本的 C 教科书都描述了这一点。
  • 我知道如何为数组/指针建立索引,但我想问的是如何将其转换为 `unsigned char' 为您提供这种形式的表示,以及哪些索引代表什么。
  • 转换为unsigned char * 允许将浮点变量占用的内存视为数组(在您的示例中为sizeof float 字符)。至于各个字符的含义,请注意我的回答“如果您知道浮点类型的按位布局......”的开头词。
猜你喜欢
  • 2013-03-19
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2019-03-16
相关资源
最近更新 更多