在Visual Studio中将字节数组中的64位双精度型转换为80位双精度型

问题描述:

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

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; 
} 

感谢,
中号

+2

64位FP和80位FP之间的一个细微区别是,80位FP不会忽略标准化数字的前导1。这可能是打破目前的尝试。 – Mysticial 2012-04-26 05:21:36

+0

我其实试图弥补,但不知道如何。我只是将最高尾数位设置为1?请参阅我尝试过的功能的编辑。 – Matt 2012-04-26 05:35:12

+0

是的。如果64位'double'不是一个反常规,则在尾数的前面加上1。 – Mysticial 2012-04-26 05:36:41

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

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

因为它非常简单,所以我很想知道为什么视觉工作室没有80位双。 – Matt 2012-04-26 18:03:10

ul>>52&0x7FFF+15360 

按位&具有比另​​外这是给你一个意想不到的结果较低的运算符优先级。

ull= ull&0xFFFFFFFFFFFFF; 

你忘记了这个左边11次。