3

我有一些代码可以让我绘制新月形状,并提取了要绘制的 excel 值。然而,代替一些数字,有一些数字-1.#IND。首先,如果有人能解释这意味着什么,因为谷歌返回了 0 个链接。其次,如果有办法阻止它发生。

我的代码有一个简短的类比。除此之外,我还有更多代码,但这只是计算角度。

for(int j=0; j<=n; j++)//calculation for angles and output displayed to user
{
    Xnew2 = -j*(Y+R1)/n; //calculate x coordinate
    Ynew2 = Y*(pow(1-(pow((Xnew2/X),2)),0.5));
    if(abs(Ynew2) <= R1)
        cout<<"\n("<<Xnew2<<", "<<Ynew2<<")"<<endl;
}

更多信息

我现在遇到此代码的问题。

for(int i=0; i<=n; i++) //calculation for angles and output displayed to user
{                                          
    Xnew = -i*(Y+R1)/n; //calculate x coordinate
    Ynew = pow((((Y+R1)*(Y+R1)) - (Xnew*Xnew)), 0.5); //calculate y coordinate

for(int j=0; j<=n; j++)//calculation for angles and output displayed to user
{
    Xnew2 = -j*(Y+R1)/((n)+((0.00001)*(n==0))); //calculate x coordinate
    Ynew2 = Y*(pow(abs(1-(pow((Xnew2/X),2))),0.5));
    if(abs(Ynew2) <= R1)
        cout<<"\n("<<Xnew2<<", "<<Ynew2<<")"<<endl;

我在绘制新月时遇到问题,我无法让两个圆圈具有相同的起点?如果这是有道理的,我试图让两个部分的圆圈来绘制一个新月,这样它们就具有相同的起点和终点。我必须使用的唯一用户输入是半径和选择的中心点。

如果有人对如何做到这一点有任何建议,那就太好了,由于圆圈没有连接,目前我正在获得更多的“半甜甜圈”形状。

4

4 回答 4

4

#IND表示不确定的形式。

你所拥有的是被称为'Not a number'或简称为NaN的东西。

引用维基百科,生成由以下人员完成:

  • 以 NaN 作为至少一个操作数的操作。
  • 分割 0/0 和 ±∞/±∞</li>
  • 乘法 0×±∞ 和 ±∞×0
  • 加法 ∞ + (−∞)、(−∞) + ∞ 和等效减法
  • 负数的平方根。
  • 负数的对数
  • 小于 -1 或大于 +1 的数的反正弦或余弦。

你至少在做这些事情中的一件。

编辑:

分析您的代码后,有两种可能性:

  • n == 0在第一次迭代中时j == 0Xnew2将是-1.#IND
  • Xnew2大于时XYnew2将是复杂的 ->NaN
于 2013-03-28T02:59:08.267 回答
2

您正在对浮点数执行非法操作,例如取负数的平方根。这大概是在 Windows 上。在 Linux 上,您会得到 NaN(不是数字)或 inf。有关详细信息,请参阅-1 #IND 问题;第二个答案中提供的链接很有帮助。

于 2013-03-28T02:57:37.573 回答
2

这来自 IEEE 754 Nan 的维基百科条目:

可以返回 NaN 的操作有以下三种:

Operations with a NaN as at least one operand.
Indeterminate forms
    The divisions 0/0 and ±∞/±∞
    The multiplications 0×±∞ and ±∞×0
    The additions ∞ + (−∞), (−∞) + ∞ and equivalent subtractions
    The standard has alternative functions for powers:
        The standard pow function and the integer exponent pown function define 00, 1∞, and ∞0 as 1.
        The powr function defines all three indeterminate forms as invalid operations and so returns NaN.

Real operations with complex results, for example:
    The square root of a negative number.
    The logarithm of a negative number
    The inverse sine or cosine of a number that is less than −1 or greater than +1.
于 2013-03-28T02:58:33.563 回答
1

您将负数提高到非倒数的幂(即 1/2、0.5、0.25、0.333333 等),结果为复数。就像 sqrt(-1) 又名 (-1)^(0.5)

此外,您还可以在两行代码中将 0/0 等同起来。

请改用此代码:(它采用您的幂基数的绝对值(防止负值,从而防止虚构答案(复数 = NaN = -1.#IND))如果 n == 0,它还可以防止您除以 0 ...在这种情况下,它会将 0.00001 添加到分母

for(int j=0; j<=n; j++)//calculation for angles and output displayed to user
{
Xnew2 = -j*(Y+R1)/((n)+((0.00001)*(n==0)); //calculate x coordinate
Ynew2 = Y*(pow(abs(1-(pow((Xnew2/X),2))),0.5));
if(abs(Ynew2) <= R1)
cout<<"\n("<<Xnew2<<", "<<Ynew2<<")"<<endl;
}
{
Xnew3 = -j*(Y+R1)/((n)+((0.00001)*(n==0));  //calculate x coordinate
Ynew3 = Y*(pow(abs(1-(pow((Xnew3/X),2))),0.5)); //calculate y coordinate
if(abs(Ynew3) <= R1)
cout<<"\n("<<Xnew3<<", "<<Ynew3<<")"<<endl; //show x,y coordinates
}

*将来避免对负数求根(这与将负数提高到非反分数幂相同),避免对负数取对数,避免除以 0 这些都产生 NaN (- 1.#IND)



这段代码可能会更好(它使用条件值来使你的幂的基数为零,如果它小于零以防止虚构的答案):

for(int j=0; j<=n; j++)//calculation for angles and output displayed to user
{
Xnew2 = -j*(Y+R1)/((n)+((0.00001)*(n==0)); //calculate x coordinate
Ynew2 = Y*(pow(((1-(pow((Xnew2/X),2)))*((1-(pow((Xnew2/X),2)))>(0))),0.5));
if(abs(Ynew2) <= R1)
cout<<"\n("<<Xnew2<<", "<<Ynew2<<")"<<endl;
}
{
Xnew3 = -j*(Y+R1)/((n)+((0.00001)*(n==0));  //calculate x coordinate
Ynew3 = Y*(pow(((1-(pow((Xnew3/X),2))))*((1-(pow((Xnew3/X),2))))>(0))),0.5)); //calculate y coordinate
if(abs(Ynew3) <= R1)
cout<<"\n("<<Xnew3<<", "<<Ynew3<<")"<<endl; //show x,y coordinates
}



*我还想指出他的回答中提到的“Magtheridon96”。现在的代码确保 n 不等于零,否则您可能会被零除,尽管我认为这会产生 #INF 而不是 #IND... 除非“-j (Y+R1)”也为零,否则它将为 0/0,这将是 #IND

于 2013-03-28T03:00:07.733 回答