加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何将double换掉?

发布时间:2020-12-16 04:59:29 所属栏目:百科 来源:网络整理
导读:我正在尝试为在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 {
我正在尝试为在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位,这可以解释您所看到的小差异.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读