Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这是双NaN(C#)_C# - Fatal编程技术网

为什么这是双NaN(C#)

为什么这是双NaN(C#),c#,C#,所以我试图编写一个非常具体的方法来获得定向2D碰撞,这个double一直给我一个NaN值。它使用的值中没有一个是NaN,所以它必须在这一行中调用这个值 double dX = Math.Sqrt(Math.Pow(collisionCorner.X - playerCorner.X, 2) + Math.Pow((collisionCorner.X - (2 * playerCorner.Y) +

所以我试图编写一个非常具体的方法来获得定向2D碰撞,这个double一直给我一个NaN值。它使用的值中没有一个是NaN,所以它必须在这一行中调用这个值

double dX = Math.Sqrt(Math.Pow(collisionCorner.X - playerCorner.X, 2) + 
                      Math.Pow((collisionCorner.X - (2 * playerCorner.Y) + 
                               (thatOnePart * playerCorner.X)) / thatOnePart, 2));
thatOnePart值对我来说只是一个快捷方式,这是我需要在这里大量使用的东西,所以这就是我制作它的原因,如果它很重要,我将在这里添加它:

double thatOnePart = ((newPlayerCorner.Y - playerCorner.Y) /
                      (newPlayerCorner.X - playerCorner.X));
更新:

我将其分解为单独的操作,以查看哪里出了问题:

double dx1 = collisionCorner.X - playerCorner.X;
        Console.WriteLine("dx1 operation 1: " + dx1);
        dx1 = Math.Pow(dx1, 2);
        Console.WriteLine("dx1 operation 2: " + dx1);

        double dx2 = thatOnePart / playerCorner.X;
        Console.WriteLine("dx2 operation 1: " + dx2);
        dx2 -= playerCorner.Y * 2;
        Console.WriteLine("dx2 operation 2: " + dx2);
        dx2 += collisionCorner.X;
        Console.WriteLine("dx2 operation 3: " + dx2);
        dx2 = dx2 / thatOnePart;
        Console.WriteLine("dx2 operation 4: " + dx2);
        dx2 = Math.Pow(dx2, 2);
        Console.WriteLine("dx2 operation 5: " + dx2);

        double dX = dx1 + dx2;
        Console.WriteLine("dX operation 1: " + dX);
        dX = Math.Sqrt(dX);
        Console.WriteLine("dX operation 2: " + dX);
控制台给了我这个:

dx1操作1:271995391845703 dx1操作2:739814931852976 dx2操作1:8 dx2操作2:8 dx2操作3:8 dx2操作4:NaN dx2操作5:NaN dX操作1:NaN dX操作2:NaN

所以当它除以那一部分时会出错,但在这个例子中,那一部分的值是8,所以我仍然不知道这里出了什么问题

更新:

因此,我为所有这些操作之前使用的所有值添加了一个writeline,以便您可以看到这些值是什么,代码是:

Console.WriteLine("collisionCornerX = " + collisionCorner.X + " thatOnePart = " + thatOnePart + " playerCornerX = " + playerCorner.X + " playerCornerY = " + playerCorner.Y);

        double dx1 = collisionCorner.X - playerCorner.X;
        Console.WriteLine("dx1 operation 1: " + dx1);
        dx1 = Math.Pow(dx1, 2);
        Console.WriteLine("dx1 operation 2: " + dx1);

        double dx2 = thatOnePart / playerCorner.X;
        Console.WriteLine("dx2 operation 1: " + dx2);
        dx2 -= playerCorner.Y * 2;
        Console.WriteLine("dx2 operation 2: " + dx2);
        dx2 += collisionCorner.X;
        Console.WriteLine("dx2 operation 3: " + dx2);
        dx2 = dx2 / thatOnePart;
        Console.WriteLine("dx2 operation 4: " + dx2);
        Console.WriteLine("thatOnePart: " + thatOnePart);
        dx2 = Math.Pow(dx2, 2);
        Console.WriteLine("dx2 operation 5: " + dx2);

        double dX = dx1 + dx2;
        Console.WriteLine("dX operation 1: " + dX);
        dX = Math.Sqrt(dX);
        Console.WriteLine("dX operation 2: " + dX);
控制台给了我:

collisionCornerX = 224 
thatOnePart      = 8 
playerCornerX    = 193,6004 
playerCornerY    = 246,0005

dx1 operation 1: 30,3995513916016
dx1 operation 2: 924,132724810625
dx2 operation 1: 8
dx2 operation 2: 8
dx2 operation 3: 8
dx2 operation 4: NaN
    thatOnePart: 8
dx2 operation 5: NaN
 dX operation 1: NaN
 dX operation 2: NaN
更新:

我检查了每个参数的值,这是控制台给我的,它们始终保持不变

collisionCornerX = 224 thatOnePart = -8 playerCornerX = 194,4005 
playerCornerY = 227,6004
dx1 operation 1: 29,5995483398438
collisionCornerX = 224 thatOnePart = -8 playerCornerX = 194,4005                     playerCornerY = 227,6004
dx1 operation 2: 876,133261922747
collisionCornerX = 224 thatOnePart = -8 playerCornerX = 194,4005 playerCornerY = 227,6004
dx2 operation 1: -8
collisionCornerX = 224 thatOnePart = -8 playerCornerX = 194,4005 playerCornerY = 227,6004
dx2 operation 2: -8
collisionCornerX = 224 thatOnePart = -8 playerCornerX = 194,4005 playerCornerY = 227,6004
dx2 operation 3: -8
collisionCornerX = 224 thatOnePart = -8 playerCornerX = 194,4005 playerCornerY = 227,6004
dx2 operation 4: NaN
collisionCornerX = 224 thatOnePart = -8 playerCornerX = 194,4005 playerCornerY = 227,6004
thatOnePart: -8
dx2 operation 5: NaN
collisionCornerX = 224 thatOnePart = -8 playerCornerX = 194,4005 playerCornerY = 227,6004
dX operation 1: NaN
collisionCornerX = 224 thatOnePart = -8 playerCornerX = 194,4005 playerCornerY = 227,6004
dX operation 2: NaN
collisionCornerX = 224 thatOnePart = -8 playerCornerX = 194,4005 playerCornerY = 227,6004
如果您咨询,您可以发现:

方法中有一个负输入或一个NaN输入作为参数 除以0将产生如下正无穷大:

Console.WriteLine(Math.Pow((2.3 - (2 * 2.3) + (2.3 * 2.3)) / 0, 2));
如果输入
(x,y)
为:

x<0,但不具有负不确定性;y不是整数、负整数或正整数

x=-1;y=负不确定性或正不确定性

x或y=NaN


因此,其中一种情况就是它。

我看到其中存在一些分歧。如果一个部件的计算结果为零,则如果
newPlayerCorner.X
等于
playerCorner.X
,则通过相互相减得到0。在本例中,您用0除法。我认为这个问题没有实际的答案,但我会提供@TomSemeijn的一般调试技巧:将赋值分解为多个语句,并在每个语句上放置一个断点,以确定
Nan
简介。尽管您将最终结果问题视为Nan,在那之前的价值观显然有问题。dx1操作1与
8
值系列完全不一致。事情发生之前有点不对劲。是否有其他异常发生,但您的IDE设置为忽略/跳过它们?编译器选项是否设置为忽略任何数值异常?@TomSemeijn实际输入值是多少。根据你评论中的值,我得到了不同的结果。仍然没有NaN这些是dX等于NaN时使用的值:碰撞角x=224 playerCornerX=200005 playerCornerY=2516005 thatOnePart=8所以这里没有0或负值这是一个毕达哥拉斯公式。传递到
Sqrt
方法中的值是两个平方的和-不能为负。使用这些值,我无法重现您的结果。我得到:
166839383161667