Frage

Ich habe doppelt (oder float) Variablen, die „leer“, wie es in Halte keinen gültigen Wert sein könnte. Wie kann ich vertrete diese Bedingung mit den Typen gebaut schweben und verdoppeln?

Eine Option ist ein Wrapper wäre, die einen Schwimmer und einen boolean, aber das KANN NICHT Arbeit, wie meine Bibliotheken Container haben, die Doppel speichern und nicht Objekte, die als verdoppelt verhalten. Eine andere wäre mit NaN (std :: numeric_limits). Aber ich sehe keine Möglichkeit für eine Variable, um zu überprüfen NaN.

Wie kann ich das Problem lösen, einen „besonderen“ float Wert um etwas anderes als die Zahl zu bedeuten?

War es hilfreich?

Lösung

In Visual C ++ gibt es eine Nicht-Standard- _isnan(double) Funktion dass Sie durch float.h importieren können.

In C gibt es eine isnan(double) Funktion, die Sie importieren durch math.h kann.

In C ++ gibt es eine isnan (double) Funktion, die Sie durch cmath importieren können.

Wie andere haben darauf hingewiesen, Nans mit viel Aufwand sein kann. Sie sind ein Sonderfall, mit wie NULL-Zeiger behandelt werden muss. Der Unterschied besteht darin, dass ein NaN wird in der Regel nicht Core-Dumps und Anwendungsfehler verursachen, aber sie sind extrem schwer aufzuspüren. Wenn Sie sich entscheiden Nans verwenden möchten, verwenden sie so wenig wie möglich. Übermäßiger Einsatz von Nans ist eine offensive Codierung Praxis.

Andere Tipps

Wir haben getan, dass durch NaN mit:

double d = std::numeric_limits<double>::signaling_NaN();
bool isNaN = (d != d);

NaN-Werte im Vergleich zur Gleichheit gegen sich selbst falsch nachgeben. Das ist so, wie Sie für NaN testen, aber das scheint nur dann gültig zu sein, wenn std::numeric_limits<double>::is_iec559 wahr ist (wenn ja, sie paßt auch IEEE754).

In C99 gibt es ein Makro namens isnan für diese in math.h, die auch eine Fließkommazahl für einen NaN-Wert überprüft.

Es ist kein integrierter Typ, aber ich verwende in der Regel boost::optional für diese Art der Sache. Wenn Sie absolut nicht verwenden können, vielleicht ein Zeiger würde den Trick tun -. Wenn der Zeiger NULL ist, dann wissen Sie das Ergebnis keinen gültigen Wert enthält

Eine Option wäre ein Wrapper, der einen Schwimmer Anzeige eine boolean hat, aber das KANN NICHT Arbeit, wie meine Bibliotheken Container haben, die Doppel speichern und nicht Objekte, die als verdoppelt verhalten.

Das ist eine Schande. In C ++ ist es trivial, eine Templat-Klasse, auto-wandelt das tatsächliche Doppel (Referenz) Attribut zu erzeugen. (Oder ein Verweis auf eine andere Art für diese Angelegenheit.) Sie benutzen Sie einfach den Cast-Operator in einer Templat-Klasse. Z.B .: Operator TYPE & () {return value; } Sie können dann ein HasValue verwenden überall würden Sie normalerweise eine doppelte verwenden.

Ein anderer wäre mit NaN (std :: numeric_limits). Aber ich sehe keine Möglichkeit für eine Variable, um zu überprüfen NaN.

Wie litb und James Schek auch bemerkt, C99 liefert uns isnan ().

Aber seien Sie vorsichtig mit dem! Nan Werte machen Mathematik und Logik echte interessant! Man könnte meinen, eine Zahl nicht beide nicht sein kann> = foo und NOT <= foo. Aber mit NaN, es kann.

Es gibt einen Grund Ich halte eine Warn-IF-NAN (X) Makro in meinem Werkzeugkasten. Ich habe einige interessante Probleme in der Vergangenheit ergeben hatte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top