c – 如何将double换掉?

前端之家收集整理的这篇文章主要介绍了c – 如何将double换掉?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试为在Win XP上运行的C程序编写一个byteswap例程.我正在使用Visual Studio 2008编译.这就是我想出的:
int byteswap(int v) // This is good
{
    return _byteswap_ulong(v);
}

double byteswap(double v) // This doesn't work for some values
{
    union { // This trick is first used in Quake2 source I believe :D
        __int64 i;
        double  d;
    } conv;
    conv.d = v;
    conv.i = _byteswap_uint64(conv.i);
    return conv.d;
}

还有一个测试功能

void testit() {
    double  a,b,c;
    CString str;

    for (a = -100; a < 100; a += 0.01) {
        b = byteswap(a);
        c = byteswap(b);
        if (a != c) {
            str.Format("%15.15f %15.15f %15.15f",a,c,a - c);
        }
    }
}

获取这些数字不匹配:

-76.789999999988126 -76.790000000017230 0.000000000029104  
-30.499999999987718 -30.499999999994994 0.000000000007276  
41.790000000014508 41.790000000029060 -0.000000000014552  
90.330000000023560 90.330000000052664 -0.000000000029104

这是在阅读完之后:
How do I convert between big-endian and little-endian values in C++?
Little Endian – Big Endian Problem
你不能使用<<和>>顺便说一下(除非我弄错了?)

解决方法

虽然主存储器中的两倍是64位,但在x86 cpu上,双精度寄存器的宽度为80位.因此,如果您的一个值全部存储在寄存器中,但另一个值通过主存储器往返并被截断为64位,这可以解释您所看到的小差异.

也许你可以通过获取地址(并打印它,以防止编译器优化它)来强制变量存在于主存储器中,但我不确定这是否可以保证工作.

原文链接:https://www.f2er.com/c/115094.html

猜你在找的C&C++相关文章