Как я могу извлечь мантиссу двойной
Я бы хотел хранить в переменной мантиссу двойного
У меня есть код, чтобы получить двоичное представление двойного: нажмите здесь
Что я должен изменить, чтобы изолировать мантиссу
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));}