[英]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.