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

Microsoft Visual Studio 2010 没有将构建工具放入 PATH 中以获得干净的目标?

Visual Studio OneClick 发布者是不是更改 RSA 加密所需的字节数组?

为什么不能在Visual Studio 2010中以本地化模式添加组件?

我仍然可以在 Visual Studio 2010 中以 .NET Framework 1.1 为目标吗?

错误 MSB3073:命令“grunt dist”在 Visual Studio 2017 中以代码 3 退出

如何解决 Visual Studio C++ 问题,“算术溢出:在 4 字节值上使用运算符 '*',然后将结果转换为 8 字节值。”?