【问题标题】:Convert 64-bit double precision floating point data to Uint32 on a C compiler that doesn't support double precision在不支持双精度的 C 编译器上将 64 位双精度浮点数据转换为 Uint32
【发布时间】:2013-10-29 21:26:55
【问题描述】:

我需要解码编码为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 与第 3 部分库链接。如果您使用 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);

我只是胡言乱语,因为double 使用 Code Composer 时只有 4 个字节。我需要一种方法将uint8_t[8] 数据(这是一个合法的 IEEE 双精度值)直接转换为整数值。

【问题讨论】:

    标签: c time floating-point ieee-754


    【解决方案1】:

    这会将整数 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;
     }
    }
    

    【讨论】:

    • 一个 NSTimeInterval 不可能有一个精确的整数值。它以秒为单位,精度为亚毫秒。并且未指定确切的精度,因此您无法将其乘以已知值以将其缩放为精确的整数值。看起来这段代码将向零舍入。
    • @EricPostpischil - 是的,我知道。但是time_t 是整数,所以我可以扔掉小数部分。我不需要 1 秒的准确度。
    猜你喜欢
    • 2011-02-27
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多