在 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 位双精度的主要内容,如果未能解决你的问题,请参考以下文章