3

私は三日月の形を描くことを可能にするいくつかのコードを持っており、描画するために優れた値を抽出しました。ただし、いくつかの数字の代わりに、所定の位置にあり-1.#INDます。まず、Google が 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;

三日月を描くときに、2 つの円の始点を同じにすることができないという問題がありますか? これが理にかなっている場合は、円の 2 つの部分で三日月を描画して、開始点と終了点が同じになるようにしようとしています。私が作業しなければならない唯一のユーザー入力は、半径と選択した中心点です。

これを行う方法について誰か提案があれば、それは素晴らしいことです。現在、円が接続されていないため、「半分のドーナツ」の形になっています。

4

4 に答える 4

4

#IND不定形という意味です。

あなたが持っているものは、略して NaN として知られている'Not a number'ものです

ウィキペディアから引用すると、生成は次のように行われます。

  • 少なくとも 1 つのオペランドとして NaN を使用する演算。
  • 除算 0/0 および ±∞/±∞</li>
  • 乗算 0×±∞ および ±∞×0
  • 足し算 ∞ + (−∞)、(−∞) + ∞ および同等の引き算
  • 負の数の平方根。
  • 負の数の対数
  • −1 未満または +1 より大きい数値の逆サインまたは逆コサイン。

あなたはそれらのことの少なくとも1つをやっています。

編集:

コードを分析した後、次の 2 つの可能性があります。

  • n == 0最初の反復では、どこj == 0Xnew2-1.#IND
  • Xnew2が より大きい場合、X複雑にYnew2なります ->NaN
于 2013-03-28T02:59:08.267 に答える
2

負の数の平方根を取るなど、浮動小数点数に対して不正なことをしています。これはおそらくWindows上にあります。Linux では、NaN (数値ではない) または inf を取得します。詳細については、 -1 #IND の質問を参照してください。2番目の回答で提供されているリンクが役に立ちます。

于 2013-03-28T02:57:37.573 に答える
2

これは、IEEE 754 Nan のウィキペディアのエントリからのものです。

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.
于 2013-03-28T02:58:33.563 に答える
1

負の数を非逆数 (つまり、1/2、0.5、0.25、0.333333 など) で累乗すると、複素数になります。sqrt(-1) 別名 (-1)^(0.5) のように

さらに、コードの 2 行で 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 がゼロに等しくないことを確認するようになりました。それ以外の場合はゼロで割ることができますが、#IND ではなく #INF が生成されると思います...「-j (Y+R1)」もゼロでない限り、次のようになります。 0/0 になり、#IND になります

于 2013-03-28T03:00:07.733 に答える