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 这是在阅读完之后: 解决方法
虽然主存储器中的两倍是64位,但在x86 CPU上,双精度寄存器的宽度为80位.因此,如果您的一个值全部存储在寄存器中,但另一个值通过主存储器往返并被截断为64位,这可以解释您所看到的小差异.
也许你可以通过获取地址(并打印它,以防止编译器优化它)来强制变量存在于主存储器中,但我不确定这是否可以保证工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |