双变量保持错误的值

与Math.Atan2类似的问题或C#中的类实例问题并添加两个给出错误结果的双重问题

这是简单的线条:

public static String DegreeToRadianStr(Double degree) { Double piBy180 = (Math.PI / 180); Double Val = (piBy180 * degree); // Here it is giving wrong value } 

piBy180 *度= -3.1415926535897931但是Val = -3.1415927410125732

替代文字http://www.imagechicken.com/uploads/1262936639009840000.jpg我真的不知道该怎么做..请问一些有关这方面的问题,以便我可以指出哪里出错了。

令人惊讶的是,piBy180保持了正确的价值。

同样的事情也发生在其他function上,但有些我操纵如何获得正确的值。

我正在使用MS Visual Studio的C#.net SP1。

如果你告诉我们degree的价值,那么我们可以尝试重现这个问题会有所帮助……

三件事:

  • 您应该期望浮点运算中存在一定量的错误。 我不会期望这么多,但不要指望看到确切的价值。
  • 字符串转换通常不会显示确切的值。 我有一个文件 – DoubleConverter.cs – 使用ToExactString方法可以帮助诊断这类事情。
  • 你的应用程序是否完全使用DirectX? 即使你的代码中有双打,这也可以改变处理器模式以有效地使用32位算术。 在我看来,这是问题的最可能原因,但它仍然只是猜测。

编辑:好的,所以听起来我猜对了,DirectX可能是原因。 您可以将CreateFlags.FpuPreserve传递给Device构造函数,以避免它执行此操作。 这无疑会降低DirectX的性能 – 但这是你需要自己考虑的权衡。

它可能只是一个字符串格式问题。 尝试添加该行:

 Debug.Assert(Val == (piBy180 * degree), "WTF?"); 

转让后。 它不应该失败,因为它们都是双精度的,对它们的算术运算应该产生相同的二进制值。

这似乎不可能。

piBy180 *度的值几乎正确计算,在第17位有效数字中小于2个单位。 CPU必须执行乘法才能执行此操作,即使有人试图通过滥用DirectX调用来破坏精度,它也会以双精度正确地执行此操作。

Val的值在第8位有效数字已错。 Val被声明为double,并且它被分配了一个微秒前计算的double值,没有进一步的计算。

这是一个发布版本吗? 我想知道C#是否可能省略了将最新值存储到Val中,这是C ++可以做到的。 调试版本中会发生什么?

它可能只是一个舍入误差,但我无法确定。

看看这篇关于浮点运算的文章。 它是为fortran编写的,但它仍然有用。 http://www.lahey.com/float.htm