繁体   English   中英

在C#中从Math.Sqrt获得不同的输出

[英]Getting different output from Math.Sqrt in C#

我在C#中有Math.Sqrt的有趣问题。 我在Math.Sqrt的一个应用程序(应用程序中的不同位置)中得到了不同的输出。

我有很大的项目,应用程序中有很多数学计算。

故事

动画Irrlich dll在应用程序代码中使用:

private void Win_Load(object sender, EventArgs e)
  {
 double myOutput = Math.Sqrt(2.0); //1.4142135623730951
 IrrlichtCreationParameters creationParameter = new IrrlichtCreationParameters();
 creationParameter.DriverType = IrrlichtLime.Video.DriverType.Direct3D9;
 IrrlichtDevice.CreateDevice(creationParameter);
 myOutput = Math.Sqrt(2.0);//1.4142135381698608
}

我想每次输出1.4142135623730951。

任何人都有任何想法,为什么在使用IrrlichtLime.Video.DriverType.Direct3D9后得到不同的输出?

在哪些情况下,我们得到的输出与Math.sqrt不同?

您使用的类型不一致(尽管我看不到您的代码),但这是证明:

double v1 = Math.Sqrt(2.0); // 1.4142135623730951
double v2 = (float)Math.Sqrt(2.0);  // 1.4142135381698608

您需要在各处使用相同的类型,并且不要进行任何强制转换,否则可能会失去一些精度。

似乎在进行值2.0(可能为2.0)之前,您已经进行了大量计算。 Double不能精确表示所有数字,如果需要精度,则必须使用Decimal。

您没有说“错误”的结果是什么,但是要知道,像SQRT这样的数学运算将始终有一些舍入误差。 这意味着您不应该直接比较双打,而要确保它们在一定的公差范围内。

const double delta = 0.00000001d;
bool same = Math.Abs(d1 - d2) < delta;

因此,如果您得到几乎相同的答案,那么这是从双精度数字中可以获得的最佳结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM