C / C ++ NaN-Konstante (Literal)?


Antworten:


153

In C NANwird in deklariert <math.h>.

In C ++ std::numeric_limits<double>::quiet_NaN()wird in deklariert <limits>.

Um zu überprüfen, ob ein Wert NaN ist, können Sie ihn nicht mit einem anderen NaN-Wert vergleichen. Verwenden Sie stattdessen isnan()von <math.h>in C oder std::isnan()von <cmath>in C ++.


20
Oder Sie können die Zahl mit sich selbst vergleichen - x == xgibt falseiff zurück, wenn xNaN ist.
Archie

7
@Archie: Ich denke nicht, dass das in beiden Sprachen garantiert ist.
Mike Seymour

3
@ MikeSeymour Nicht nach dem Sprachstandard, aber soweit ich weiß, sollte es funktionieren, wenn der Compiler behauptet, IEEE-konform zu sein.
Pixelchemist

37
@ Pixelchemist: In der Tat ist es eine Option, wenn Sie eine Verschleierung benötigen, aber keine Portabilität. Persönlich bevorzuge ich Portabilität ohne Verschleierung, daher werde ich es selbst nicht vorschlagen.
Mike Seymour

9
kleine Anmerkung: NAN ist ein Float, kein Double. Link
Orion Elenzil

23

Wie andere darauf hingewiesen haben, suchen Sie, std::numeric_limits<double>::quiet_NaN()obwohl ich sagen muss, dass ich die Dokumente von cppreference.com bevorzuge . Vor allem, weil diese Aussage etwas vage ist:

Nur sinnvoll, wenn std :: numeric_limits :: has_quiet_NaN == true ist.

und es war einfach herauszufinden, was dies auf dieser Site bedeutet, wenn Sie den Abschnitt lesen, in dem std::numeric_limits::has_quiet_NaNes heißt:

Diese Konstante ist für alle Gleitkommatypen von Bedeutung und ist garantiert wahr, wenn std :: numeric_limits :: is_iec559 == true ist.

Dies bedeutet, wie hier erläutert , dass trueIhre Plattform IEEE 754Standard unterstützt . Dieser vorherige Thread erklärt, dass dies für die meisten Situationen zutreffen sollte.


9

Dies kann mit den numeric_limits in C ++ erfolgen:

http://www.cplusplus.com/reference/limits/numeric_limits/

Dies sind die Methoden, die Sie wahrscheinlich betrachten möchten:

infinity()  T   Representation of positive infinity, if available.
quiet_NaN() T   Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN() T   Representation of signaling "Not-a-Number", if available.

6
+1. Wikipedia hat einige Informationen zu leisem NaN und zur Signalisierung von NaN .
Drew Noakes

1

Ist es möglich, einem Double ein NaN zuzuweisen oder in C ... zu schweben?

Ja, seit C99 bietet (C ++ 11) <math.h>die folgenden Funktionen:

#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);

die wie ihre strtod("NAN(n-char-sequence)",0)Gegenstücke und NANfür Aufgaben sind.

// Sample C code
uint64_t u64;
double x;
x = nan("0x12345");
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = -strtod("NAN(6789A)",0);
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = NAN;
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);

Beispielausgabe: (Implementierungsabhängig)

(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)

Was sind die Unterschiede zwischen den Ausgaben für verschiedene Zeichenfolgen? Welches sollten wir im typischen numerischen Code verwenden?
quant_dev
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.