Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在VS8 C中查找两个双精度值的乘积时出错#_C# - Fatal编程技术网

C# 在VS8 C中查找两个双精度值的乘积时出错#

C# 在VS8 C中查找两个双精度值的乘积时出错#,c#,C#,我正在VS8 professional上使用C#。我有一段代码,我最初是用Pascal编写的,然后是C,然后是C,所以一直使用到现在都很顺利。代码片段如下所示:- *bool InverseTransverseMercator(coord enl) { double nu, rho, k0; double x, y, x2, x3, x4, x5, x6, x7; double phif, phi, cosphif, sin

我正在VS8 professional上使用C#。我有一段代码,我最初是用Pascal编写的,然后是C,然后是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位有效数字。我尝试过使用
Math.Pow(x,2)
重命名变量,使用“decimal”类型,但都存在
x2
的值不是它应该的值的问题。我试着重新排列线条,添加更多的虚拟线条,没有任何区别。在我的代码中搜索时,我没有全局属性名
x2
。有趣的是,这个值确实变为接近精确答案,就好像发生了巨大的舍入误差。我一定是在做一些愚蠢的事情,但我就是看不见。如果有人就此问题提供任何建议,我将不胜感激。

您的项目中很可能有一些非托管代码更改了FPU控制字,将其切换到单精度模式。调试器在它自己的线程上计算表达式,它没有被弄乱


非托管代码通常是DirectX。使用D3DCREATE_FPU_PRESERVE选项查看其CreateDevice()函数。如果您没有编写此代码,则必须与软件供应商联系。一个可能有效的技巧是故意抛出并捕获异常,但不是100%确定。

您的项目中很可能有一些非托管代码更改了FPU控制字,将其切换到单精度模式。调试器在它自己的线程上计算表达式,它没有被弄乱


非托管代码通常是DirectX。使用D3DCREATE_FPU_PRESERVE选项查看其CreateDevice()函数。如果您没有编写此代码,则必须与软件供应商联系。一个可能有效的技巧是故意抛出并捕获异常,但不是100%确定。

哇,汉斯,你解决了我的问题!我找到的解决方案是将CreateFlags.FpuPreserve添加到我的DirectX.Direct3D设备。设备=新设备(0,DeviceType.Hardware,this,CreateFlags.HardwareVertexProcessing | CreateFlags.FpuPreserve,pres);谢谢你,汉斯。发现这一点是一个真正的启示。好吧,一个有益的投票似乎不太可能。但这是一个答案,请这样标记。哇,汉斯,你解决了我的问题!我找到的解决方案是将CreateFlags.FpuPreserve添加到我的DirectX.Direct3D设备。设备=新设备(0,DeviceType.Hardware,this,CreateFlags.HardwareVertexProcessing | CreateFlags.FpuPreserve,pres);谢谢你,汉斯。发现这一点是一个真正的启示。好吧,一个有益的投票似乎不太可能。但这是一个答案,请这样标记。