[英]How to convert DEC 64bit double precision floating point to IEEE-754 (DEC is not decimal)
[英]Convert 64-bit double precision floating point data to Uint32 on a C compiler that doesn't support double precision
我需要解码一个编码为IEEE double
的时间戳(从iOS NSTimeInterval
)并存储在8字节数组中,以便可以使用ctime
以人类可读的格式打印该时间戳。 这在大多数系统上都是微不足道的,但在我的系统上却并非如此。
Example: on iOS side
uint8_t data[8];
double x = 3.14;
memcpy(data,&x,8);
我在MSP430F5438A上运行,我需要使用COFF ABI与第三部分库链接。 如果使用COFF ABI,则TI的Code Composer不支持64位浮点类型 (IEEE double)。 将float
视为double
(即单精度)。
这些不起作用。
uint8_t data[8];
double x;
memcpy(&x,data,8);
要么
x = *(double*)data;
要么
union {
uint8_t data[8];
double d;
} x;
memcpy(x.data,data,8);
我只是有点乱码,因为使用Code Composer, double
仅为4个字节。 我需要一种直接将uint8_t[8]
数据(这是合法的IEEE双精度值)转换为整数值的方法。
这将不可分割的转换double
为精确uint32_t
(只要没有溢出,达到2 ^ 32-1)。 如果双精度数是Nan或Inf,它将不起作用,但这不太可能。
static unsigned long ConvertDoubleToULong(void* d)
{
unsigned long long x;
unsigned long long sign ;
long exponent;
unsigned long long mantissa;
memcpy(&x,d,8);
// IEEE binary64 format (unsupported)
sign = (x >> 63) & 1; // 1 bit
exponent = ((x >> 52) & 0x7FF); // 11 bits
mantissa = (x >> 0) & 0x000FFFFFFFFFFFFFULL; // 52 bits
exponent -= 1023;
mantissa |= 0x0010000000000000ULL; // add implicit 1
int rshift = 52 - exponent;
if (rshift > 52) {
x = 0;
} else if (rshift >=0) {
x = mantissa >> rshift;
} else {
x = 0x7FFFFFFF;
}
if (sign == 0) {
return x;
} else {
return -x;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.