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

本文关键字:输出 获取 Sqrt 中的 Math | 更新日期: 2023-09-27 17:56:37

我在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 不同?

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

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

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

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

在获得值 2.0 之前,您似乎正在进行大量计算(它可能≃ 2.0)。双精度不能精确地表示所有数字,如果您需要精度,则必须使用十进制。

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

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

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