我怎样才能提取双尾数的尾数

时间:2011-04-15 06:04:45

标签: c++ double

我想在变量中存储双重的mantisssa

我发布了一个代码来获取double的二进制表示:click here

我应该更改什么来隔离尾数

4 个答案:

答案 0 :(得分:18)

<math.h>

double frexp (double value, int *exp)

在指数和尾数中分解VALUE。

double ldexp (double value, int exp)

反过来。

要获得整数值,必须将frexp的结果乘以FLT_RADIX指数DBL_MANT_DIG(<float.h>中可用的那些。要将其存储在整数变量中,您还需要找到一个足够的类型(通常64位类型)

如果你想处理一些实现提供的128位长双精度,你需要C99 frexpl来进行拆分,然后你可能没有足够的整数类型来存储完整的结果。

答案 1 :(得分:3)

许多Linux系统都有/usr/include/ieee754.h,它定义了IEEE格式浮点数,双倍和长双倍的位域:如果需要,你可以简单地“移植”它。

答案 2 :(得分:2)

这里的代码在可移植性方面有点危险,但这里是......

#include <cstdint>

float myFloat = 100;
int32_t mantissa1 =
    reinterpret_cast<int32_t&>(myFloat) & (((int32_t)1 << 24) - 1);

double myDouble = 100;
int64_t mantissa2 =
    reinterpret_cast<int64_t&>(myDouble) & (((int64_t)1 << 53) - 1);

答案 3 :(得分:-1)

字符串化标记化方法:



    #include <string.h>
    #include <stdio.h>

    long double example=(-10000.0/7.0);

    long long ldoubtollmant(long double num)
    { char stackdump1[101]={'\0'};
      char *dump1=&stackdump1[0];
      char stackdump2[101]={'\0'};
      char *dump2=&stackdump2[0];
      snprintf(dump1,100,"%.15Le",num);
      char *next1=dump1;
      next1=strtok(dump1,"e");
      char *next2=NULL;
      strtok_r(next1,".",&next2);
      snprintf(dump2,100,"%s%s",dump1,next2);
      return atoll(dump2);}

    short int ldoubtoshexp(long double num)
    { char stackdump1[101]={'\0'};
      char *dump1=&stackdump1[0];
      snprintf(dump1,100,"%.15Le",num);
      char *next1=NULL;
      strtok_r(dump1,"e",&next1);
      return (short int)atoi(next1);}

    int main(int argc,char *argv[])
    { printf("\n%lld",ldoubtollmant(example));
      printf("\n%hd",ldoubtoshexp(example));}