【问题标题】:What is '-1.#IND'?什么是'-1.#IND'?
【发布时间】:2013-03-28 02:47:08
【问题描述】:

我有一些代码可以让我绘制一个新月形状,并提取了要绘制的 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;

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

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

【问题讨论】:

  • @Mysticial 它是否代表 -1 乘以不确定的数字?因为它可以做多种事情,而不仅仅是 -∞... 就像 -1/0
  • 你是用平方根来画你的新月形吗?我们能看到公式吗?也许您正在取负数的 sqrt?
  • @AlbertRenshaw 这肯定是 IEEE 浮点数。 -1/0 将评估为负无穷大。 0/0 将评估为 NaN。
  • 我不知道这是什么意思。我以为它是类似的东西,但我在网上找不到任何关于它的东西。所以你建议检查我的代码是否有可能被 0 除的任何地方?
  • -1.#IND 表示值为indeterminate。查看链接的几种类型的不确定值,然后确保您的代码未对其中一种进行评估。

标签: c++ floating-point


【解决方案1】:

#IND 表示不确定的形式。

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

引自维基百科,生成由:

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

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

编辑:

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

  • n == 0 在第一次迭代中j == 0 也是,Xnew2 将是-1.#IND
  • Xnew2大于X时,Ynew2将是复数->NaN

【讨论】:

  • 我认为如果 n==0 会返回 #INF 而不是 #IND
  • *UNLESS -j*(Y+R1) 也是 0,因为那样它将是 0/0,这是不确定的。
  • 它会首先返回#IND,然后是#INF,因为在第一次迭代中,j == 0。感谢您指出这一点,我的帖子中含糊不清
  • +1,如果分母 (n) 为零,我还使用方程中的条件语句将分母从 0 更改为 0.00001,我还编辑了下面的方程来解释这一点。 --...Xnew2 = -j*(Y+R1)/((n)+((0.00001)*(n==0));
  • ^我从来没有用 C++ 编程过我假设你可以在方程中使用条件语句来返回二进制布尔值。如果我对那个代码不满意,对不起!哈哈。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    来自 IEEE 754 Nan 的 Wikipedia 条目:

    可以返回NaN的操作有3种:

    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.
    

    【讨论】:

      【解决方案4】:

      您将负数提高到非倒数的幂(即 1/2、0.5、0.25、0.333333 等),从而得到复数。比如 sqrt(-1) 又名 (-1)^(0.5)

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

      改用此代码:(它采用您的幂基数的绝对值(防止负值,从而防止虚构答案(复数 = NaN = -1.#IND))它还可以防止您除以 0 如果 n == 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

      【讨论】:

      • 它说 j 是一个未声明的标识符。有什么想法吗?
      • 这只是意味着您从未将 j 定义为变量。
      • 另外我刚刚意识到你可能会在某些地方得到#INF,为什么我的代码如果你除以 X 和 X 是 0...即在 Ynew2 中它说(Xnew2/X) 你可以改变将它发送到(Xnew2/((n)+((0.00001)*(X==0))),并对代码中出现的其他 3 次执行此操作。
      • 看来你定义了 j 所以这没有多大意义......我从来没有用 C++ 编程,但从一些快速谷歌搜索显然你的错误在某个地方叫做 namespace std? google.com/…
      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多