ビジュアルスタジオで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
64ビットFPと80ビットFPの微妙な違いの1つは、80ビットFPが正規化された数値の先頭に1を省略しないことです。それはあなたの現在の試みを破るものになる可能性があります。 – Mysticial
私は実際にそれを補償しようとしましたが、どうしたらよいか分かりませんでした。最高の仮数ビットを1に設定するだけですか?私が試した機能の編集を参照してください。 – Matt
うん。 64ビットの「double」がデノーマルでない場合は、仮数の先頭に1を追加します。 – Mysticial