gpt4 book ai didi

在不支持 double 的 C 编译器上将 64 位 double float 据转换为 Uint32

转载 作者:行者123 更新时间:2023-11-30 15:43:58 25 4
gpt4 key购买 nike

我需要解码编码为 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 )。它对待doublefloat相同(即单精度)。

这些不起作用。

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 值)转换为整数值。

最佳答案

这会将整数 double 转换为精确的 uint32_t(只要没有溢出,最多 2^32-1)。如果 double 是 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;
}
}

关于在不支持 double 的 C 编译器上将 64 位 double float 据转换为 Uint32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19669484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com