2010-08-08 27 views
1

我在VS8专业版上使用C#。我有一段代码,我最初是在Pascal中编写的,然后是C编写的,因此C#直到现在才被使用。代码片段看起来是这样的: -在VS8中找到两个double值的错误C#

*bool InverseTransverseMercator(coord enl) 
{ 
      double nu, rho, k0; 
      double x, y, x2, x3, x4, x5, x6, x7; 
      double phif, phi, cosphif, sinphif, lam, n, n2, n3, n4; 
      double t, t2, t3, t4, t6, nu2, nu3, nu5, nu7, neta2; 
      double a0, a1, a2, a3, p7, p8, p9, p10, p11, p12, p12a; 
      coord cc; //has a structure public double x, y, z; 
      cc = enl; 
      x = cc.x; 
      y = cc.y; 
      x2 = x * x; 
      x3 = x * x2;//I stop the debugger at the start of this line and examine some values. 
...* 

下面是调试器的值是无我真的很困惑: -

x = 23500.0 - original value 
x * x = 552250000.0 (right hand side of x2=x * x correct) 
x2 = 552249984.0 (left hand side of x2 = x * x INCORRECT!) 

正如你可以看到x * x值是正确的但在价值它被分配的变量(X2)不是。事实上,答案相差16个。 这些都是双重变量,我期望在第16位有效数字四舍五入。我尝试使用'decimal'类型使用Math.Pow(x,2)重命名变量,并且都有问题,x2的值不是它应该是的。我尝试重新排列线条,并添加更多虚拟线条而没有区别。通过我的代码搜索我没有全球性的名称x2。有趣的是,这个值确实会变成接近确切的答案,就好像一个巨大的舍入误差正在完成一样。我必须在这里做一些愚蠢而愚蠢的事情,但我看不到它。我非常感谢有人就此问题提出的任何建议。

+0

请修复格式。 – Timwi 2010-08-08 14:40:11

回答

1

你很可能在你的项目中有一些非托管代码改变了FPU控制字,将它切换到单精度模式。调试器在它自己的线程上评估表达式,它不会被搞乱。

非托管代码通常是DirectX。使用D3DCREATE_FPU_PRESERVE选项查看其CreateDevice()函数。如果你没有写这个代码,那么你必须和你的软件供应商谈谈。可能有效的一个技巧是故意抛出异常,并非100%确定。

+0

Whoopee Hans你把我的问题整理出来了!我找到的解决方案是将CreateFlags.FpuPreserve添加到我的DirectX.Direct3D设备。 device = new Device(0,DeviceType.Hardware,this,CreateFlags.HardwareVertexProcessing | CreateFlags.FpuPreserve,pres); 谢谢Hans。这是一个真正的启示,发现这一点。 – user414396 2010-08-09 12:04:15

+0

那么,一个有用的投票似乎不太可能。但这是一个答案,请标记它。 – 2010-08-09 12:17:52