2017-06-22 5 views
0

Ich weiß in der Regel, dass dieser Fehler tritt auf, wenn einige Wert von 0. Aber in meinem Fall unterteilt: manchmal Dieses Stück CodeMein Code erzeugt einen Ausgang "NaN". Warum?

c[0]=((a[1]*b[2])-(a[2]*b[1])); 
c[1]=((a[2]*b[0])-(a[0]*b[2])); 
c[2]=((a[0]*b[1])-(a[1]*b[0])); 
cout<<c[0]<<c[1]<<c[2]; 

NaN als Ausgang dieses

erzeugen
+4

Was sind die Typen und die Eingabewerte, wenn dies passiert? Fügen Sie Code hinzu, um "nan" zu erkennen und zu brechen. Verwenden Sie einen Debugger, um die eingehenden Werte zu überprüfen. Manchmal ist es nur "Müll rein, Müll raus". – unwind

+0

Debugging ist das erste, was Sie tun. Also, mit dem getan –

+0

@TusharChandra: Bitte nicht downvotes persönlich. Für was es wert ist, sehe ich nichts falsch mit dieser Frage; vielleicht, obwohl Sie es zu zwei Aussagen abkürzen könnten, und den Titel ein bisschen aufräumen. Es ist schwierig, ein funktionierendes Beispiel für solche Dinge zu formulieren, und die Antwort ist konkret, unter der Annahme von IEEE754. – Bathsheba

Antwort

2

(Beschränken Antwort auf IEEE754).

Dies ist nur möglich, wenn eine der Bedingungen NaN ist, oder eine Manifestation von undefiniertem Verhalten in Ihrem zugreifenden außerhalb der Grenzen des Arrays a oder b oder uninitialised Daten zu lesen.

Unter IEEE754 können Sie NaN nicht durch Multiplikation großer Werte erreichen.

Von C++ 11, Sie std::isnan verwenden können eine NaN vor, dass in oder C zu erfassen, verwenden Sie das Idiom

if (f != f){ 
    // `f` is NaN 
} 

Also, beiseite die undefinierte Verhalten Einstellung, die Ursache des Problems ist, höher auf den Call-Stack. Ausdrücke wie 0,0/0,0 erzeugen ein NaN.


In Bezug auf Ihre Aussage

einige Wert von 0

die nur geteilt Wert "einen Wert", wenn sie von 0,0 geteilt gibt Ihnen NaN 0: 0.0/0.0 ist NaN und a/0.0 ist + Inf wenn a ist positiv, und -Inf wenn a ist negativ.

+0

@Bathseba, LOL jetzt bekomme ich Nan für Werte, die klare Ausgabe früher geben –

+0

Sie müssen einige Code an Ort und Stelle setzen, die alle Eingaben überprüft. Die tatsächliche Ursache wird höher auf dem Call-Stack sein. (Etwas wie 0.0/0.0 erzeugt ein NaN). – Bathsheba

+0

@Bathseba, Danke Mann! Es war ein kleiner logischer Fehler –