为什么这是双NaN(C#)
所以我试图编写一个非常具体的方法来获得定向2D碰撞,这个double一直给我一个NaN值。它使用的值中没有一个是NaN,所以它必须在这一行中调用这个值为什么这是双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) +
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