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

C# 从C中的Math.Sqrt获得不同的输出#,c#,C#,我对C#中的数学有一个有趣的问题。 我从Math.Sqrt在一个应用程序(应用程序中的不同位置)中获得不同的输出 我有一个大项目和应用程序,有很多数学计算 故事 应用程序中使用了动画Irrlich dll 代码: 我想每次输出1.4142135623730951 有人知道,为什么在使用IrrlichtLime.Video.DriverType.Direct3D9后会得到不同的输出吗 在哪些情况下,我们得到的输出与Math.sqrt不同?您的类型用法不一致(尽管我没有看到您的代码),但以下是证据:

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

我有一个大项目和应用程序,有很多数学计算

故事

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

我想每次输出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。

您的类型用法不一致(尽管我看不到您的代码),但以下是证据:

double v1 = Math.Sqrt(2.0); // 1.4142135623730951
double v2 = (float)Math.Sqrt(2.0);  // 1.4142135381698608
您需要在任何地方使用相同的类型,并且不要进行任何铸造,否则可能会失去一些精度


在得到值2.0之前,您似乎已经进行了大量计算(可能是这样)≃ 2.0) . Double不能精确地表示所有数字,如果需要精度,则必须使用十进制。

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

const double delta = 0.00000001d;
bool same = Math.Abs(d1 - d2) < delta;
常数双增量=0.00000001d;
bool same=Math.Abs(d1-d2)

所以如果你得到几乎相同的答案,这是你能从双精度数字中得到的最好答案

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

const double delta = 0.00000001d;
bool same = Math.Abs(d1 - d2) < delta;
常数双增量=0.00000001d;
bool same=Math.Abs(d1-d2)


所以如果你得到几乎相同的答案,这是你能从双精度数字中得到的最好答案

是的,如果我使用like-double v1=(float)Math.Sqrt(2.0),得到相同的输出;在登录页面上,double v2=(float)Math.Sqrt(2.0);登录后页面输出:1.4142135381698608,但我想每次输出1.4142135623730951。因为我在pinv(MATHLAB)函数(将MATHLAB转换为C#)上使用了这个值。如果我使用这个值1.4142135623730951,那么我可以得到正确的mathlab算法输出。@user2960398请显示代码中使用Math.Sqrt的部分,以及如何将其传递给mathlab。编辑您的问题并显示这些信息//应用页面上的1.4142135623730951 double myOutput=Math.Sqrt(2.0)//1.4142135381698608实际上我使用了alglib库,但得到了不同的输出。因为我给出了错误的输入。在我的例子中,正确的输入是1.4142135623730951,但在应用程序登录后,我没有从math.sqrt获得此输出。在我的应用程序登录后,每次math.sqrt都以浮点类型给出输出。我没有申请任何关于浮动的对话。如果我尝试像double myOutput=(double)Math.Sqrt(2.0)这样的代码;然后还得到了浮点型的输出。它应该是双精度的,比如1.4142135623730951是的,如果我使用双精度v1=(float)Math.Sqrt(2.0),则得到相同的输出;在登录页面上,double v2=(float)Math.Sqrt(2.0);登录后页面输出:1.4142135381698608,但我想每次输出1.4142135623730951。因为我在pinv(MATHLAB)函数(将MATHLAB转换为C#)上使用了这个值。如果我使用这个值1.4142135623730951,那么我可以得到正确的mathlab算法输出。@user2960398请显示代码中使用Math.Sqrt的部分,以及如何将其传递给mathlab。编辑您的问题并显示这些信息//应用页面上的1.4142135623730951 double myOutput=Math.Sqrt(2.0)//1.4142135381698608实际上我使用了alglib库,但得到了不同的输出。因为我给出了错误的输入。在我的例子中,正确的输入是1.4142135623730951,但在应用程序登录后,我没有从math.sqrt获得此输出。在我的应用程序登录后,每次math.sqrt都以浮点类型给出输出。我没有申请任何关于浮动的对话。如果我尝试像double myOutput=(double)Math.Sqrt(2.0)这样的代码;然后还得到了浮点型的输出。它应该是双精度的,比如1.4142135623730951,你能显示你的精确代码吗?双精度代码myOutput=Math.Sqrt(2.0);这两个地方你是否通过了2.0硬编码?或者基于一些计算?为了测试,我通过了硬编码的2.0。问题更新了……。你能显示你的准确代码吗?代码double myOutput=Math.Sqrt(2.0);这两个地方你是否通过了2.0硬编码?或者基于一些计算?为了测试,我通过了硬编码的2.0。问题更新了……。两个结果都是正确的。但是我希望在IrrlichtDevice.CreateDevice(creationParameter)之后,在我的例子中,这个结果是1.4142135623730951(不是1.4142135381698608);两个结果都是正确的。但是我希望在IrrlichtDevice.CreateDevice(creationParameter)之后,在我的例子中,这个结果是1.4142135623730951(不是1.4142135381698608);