2012-04-26 26 views
2

ビジュアルスタジオで64ビットの倍精度を使用するコードを探していて、それを80-bit extended (IEEE-754)倍に変換します。結果は10バイトの配列(私が想像するリトルエンディアン形式)で格納する必要があります。その理由は、Borland C++で書かれたプログラムに80ビットのdoubleを送る必要があり、このdoubleを要求するからです。しかし、私は何を試したのか分からず(基本的に仮数と指数をそれぞれ52ビットと11ビットとし、指数を15ビットで16383オフセット、64ビットにパディングするように変換する)うまくいくようです。それはthis questionの逆です。ビジュアルスタジオで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; 
} 

おかげで、
M

+2

64ビットFPと80ビットFPの微妙な違いの1つは、80ビットFPが正規化された数値の先頭に1を省略しないことです。それはあなたの現在の試みを破るものになる可能性があります。 – Mysticial

+0

私は実際にそれを補償しようとしましたが、どうしたらよいか分かりませんでした。最高の仮数ビットを1に設定するだけですか?私が試した機能の編集を参照してください。 – Matt

+0

うん。 64ビットの「double」がデノーマルでない場合は、仮数の先頭に1を追加します。 – Mysticial

答えて

3

インラインアセンブリは、最も簡単かつ最速の方法でしょう。このように:

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

それはとてもシンプルなので、なぜVisual Studioに80ビットの倍精度がないのか不思議です。 – Matt

0
ul>>52&0x7FFF+15360 

ビット単位&はあなたに予期しない結果を与えているほかより低い演算子の優先順位を持っています。

ull= ull&0xFFFFFFFFFFFFF; 

この左に11回シフトするのを忘れています。

関連する問題