我在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不同?
答案 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;
因此,如果您得到几乎相同的答案,那么这就是从双精度数字中获得的最佳效果。