微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/c/115094.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐