在 Visual Studio 中以字节数组形式将 64 位双精度转换为 80 位双精度

Posted

技术标签:

【中文标题】在 Visual Studio 中以字节数组形式将 64 位双精度转换为 80 位双精度【英文标题】:Convert 64-bit double to 80-bit double in byte array form in visual studio 【发布时间】:2012-04-26 05:17:32 【问题描述】:

我正在寻找将在 Visual Studio 中采用 64 位双精度并将其转换为 80-bit extended (IEEE-754) 双精度的代码。结果应该存储在一个 10 字节的数组中(我想是小端格式)。原因是我需要将 80 位双精度发送到一个用 Borland c++ 编写的程序并要求这个双精度。但我不知道如何做到这一点,因为我尝试过(基本上分别采用 52 位和 11 位的尾数和指数,转换指数使其在 15 位中偏移 16383 并将尾数填充为 64 位)没有t 似乎工作。它是this question 的倒数。

inline void ConvertDblToLongDbl(double dbl, unsigned char aCh[10])

__int64 ull= *(__int64*)(&dbl);
    *(unsigned short*)&aCh[8]= (unsigned short)((ull>>52&0x7FF+15360)|  //     exponent, from 11 bits to 15 bits
        ((ull&(__int64)1<<63)?0x8000:0));   // sign, the 16th bit
    ull= ull&0xFFFFFFFFFFFFF;
    *(__int64*)&aCh[0]= ull|0x8000000000000000;

谢谢, M

【问题讨论】:

64 位 FP 和 80 位 FP 之间的一个细微差别是 80 位 FP 不会省略标准化数字的前导 1。这可能是破坏您当前尝试的原因。 我实际上试图弥补这一点,但不确定如何。我是否只是将最高尾数位设置为 1?请参阅我尝试的功能的编辑。 是的。如果 64 位 double 不是非正规的,则在尾数前面附加 1。 这不是异常的,因为它是一个相当大的数字(当前的 unix 时间)。问题是我无法验证我是否做对了,因为我没有任何东西可以与之比较。 我帮不上忙,我在 Windows 上,如果没有内联汇编,你不能在 Windows 上使用 80 位 FP。 【参考方案1】:

内联汇编将是最简单和最快的方法。像这样:

void ConvertDoubleToLongDouble(double value, unsigned char result[10]) 
    __asm 
        fld value;
        mov ebx, result;
        fstp tbyte ptr [ebx];
    

【讨论】:

既然这么简单,我就奇怪为什么Visual Studio没有80位双精度。【参考方案2】:
ul>>52&0x7FFF+15360

按位 & 的运算符优先级低于加法,这会给您带来意想不到的结果。

ull= ull&0xFFFFFFFFFFFFF;

你忘记向左移动 11 次了。

【讨论】:

以上是关于在 Visual Studio 中以字节数组形式将 64 位双精度转换为 80 位双精度的主要内容,如果未能解决你的问题,请参考以下文章