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

时间:2016-07-13 06:42:17

标签: 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不同?

2 个答案:

答案 0 :(得分:7)

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

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

你需要在任何地方使用相同的类型,不要进行任何转换,否则你可能会失去一些精确度。

在你获得2.0值之前,你似乎正在做很多计算(它可能是2.0)。 Double不能精确地表示所有数字,如果你需要精度,那么你必须使用Decimal。

答案 1 :(得分:0)

你没有说'错误'结果是什么,但要注意像SQRT这样的数学运算总会有一些舍入错误。这意味着你不应该直接比较双打,但要确保它们接近于一些容差;

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

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