Как я могу извлечь мантиссу двойной

Я бы хотел хранить в переменной мантиссу двойного

У меня есть код, чтобы получить двоичное представление двойного: нажмите здесь

Что я должен изменить, чтобы изолировать мантиссу

3 ответа

Решение

В <math.h>

double frexp (double value, int *exp)

разложить ЗНАЧЕНИЕ на экспоненту и мантиссу.

double ldexp (double value, int exp)

делает обратное.

Чтобы получить целочисленное значение, вы должны умножить результат frexp на показатель FLT_RADIX DBL_MANT_DIG (они доступны в <float.h>, Чтобы сохранить это в целочисленной переменной, вам также нужно найти подходящий тип (часто 64-битный тип)

Если вы хотите обработать 128-битную длину, удваивающуюся в некоторых реализациях, вам потребуется C99 frexpl, чтобы выполнить расщепление, и тогда у вас, вероятно, нет достаточного целочисленного типа для хранения полного результата.

Во многих системах Linux есть /usr/include/ieee754.h, который определяет битовые поля для float, double и long double в формате IEEE: вы можете тривиально "перенести" его в случае необходимости.

Код здесь немного опасен с точки зрения переносимости, но вот он...

#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);

Строковый подход к токенизации:



    #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));}
Другие вопросы по тегам