2012-04-26 53 views
2

我正在尋找將在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

回答

3

內聯彙編將是最簡單和最快的方式。就像這樣:

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

0
ul>>52&0x7FFF+15360 

按位&具有比另​​外這是給你一個意想不到的結果較低的運算符優先級。

ull= ull&0xFFFFFFFFFFFFF; 

你忘記了這個左邊11次。

相關問題