标志,尾数和双重的指数

时间:2016-10-25 20:54:02

标签: c floating-point

我从How to get the sign, mantissa and exponent of a floating point number

找到了以下代码
#include <stdio.h>
typedef union {
  float f;
  struct {
    unsigned int mantisa : 23;
    unsigned int exponent : 8;
    unsigned int sign : 1;
  } parts;
} double_cast;

int main() {
  double_cast d1;
  d1.f = 0.15625;
  printf("sign = %x\n",d1.parts.sign);
  printf("exponent = %x\n",d1.parts.exponent);
  printf("mantisa = %x\n",d1.parts.mantisa);
  return 0;
}

但是如何将它转换为双尾,尾数值为52,指数为11,符号为1?

2 个答案:

答案 0 :(得分:1)

只需扩展逻辑并像这样定义你的联合,使用标准的int 64来实现可移植性:

#include <stdint.h>

typedef union {
  double f;
  struct {
    uint64_t mantisa : 52;
    uint64_t exponent : 11;
    uint64_t sign : 1;
  } parts;
} double_cast;

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

BTW:浮点映射也应该使用标准类型而不是int

typedef union {
  float f;
  struct {
    uint32_t mantisa : 23;
    uint32_t exponent : 8;
    uint32_t sign : 1;
  } parts;
} float_cast;

答案 1 :(得分:-1)

我认为你应该使用bit和shift运算符从double / float中提取字段。你可以为此制作宏/功能。