答案 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));}