Czy jest możliwe przypisanie a NaNdo a doublelub floatw C / C ++? Podobnie jak w JavaScript zrobić: a = NaN. Więc później możesz sprawdzić, czy zmienna jest liczbą, czy nie.
W C ++ std::numeric_limits<double>::quiet_NaN()jest zadeklarowana w <limits>.
Ale aby sprawdzić, czy wartość to NaN, nie możesz porównać jej z inną wartością NaN. Zamiast tego używaj isnan()from <math.h>w C lub std::isnan()from <cmath>w C ++.
Lub możesz porównać liczbę ze sobą - x == xzwraca falseiff xto NaN.
Archie
7
@Archie: Nie sądzę, że jest to gwarantowane w żadnym języku.
Mike Seymour
3
@MikeSeymour Nie według standardu języka, ale o ile wiem, powinno działać, jeśli kompilator twierdzi, że jest zgodny z IEEE.
Pixelchemist
37
@Pixelchemist: Rzeczywiście, jest to opcja, jeśli potrzebujesz zaciemnienia, ale nie przenośności. Osobiście wolę przenośność bez zaciemniania, więc nie będę tego sugerował.
Mike Seymour
9
drobna uwaga: NAN to liczba zmiennoprzecinkowa, a nie podwójna. link
orion elenzil
23
Jak zauważyli inni, szukasz, std::numeric_limits<double>::quiet_NaN()chociaż muszę powiedzieć, że wolę dokumenty cppreference.com . Zwłaszcza, że to stwierdzenie jest trochę niejasne:
Ma znaczenie tylko wtedy, gdy std :: numeric_limits :: has_quiet_NaN == true.
Ta stała ma znaczenie dla wszystkich typów zmiennoprzecinkowych i gwarantuje, że będzie prawdziwa, jeśli std :: numeric_limits :: is_iec559 == true.
co, jak wyjaśniono tutaj , trueoznacza, że Twoja platforma obsługuje IEEE 754standard. Ten poprzedni wątek wyjaśnia, że powinno to być prawdą w większości sytuacji.
Oto metody, którym prawdopodobnie chcesz się przyjrzeć:
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.
Odpowiedzi:
W C
NAN
jest zadeklarowana w<math.h>
.W C ++
std::numeric_limits<double>::quiet_NaN()
jest zadeklarowana w<limits>
.Ale aby sprawdzić, czy wartość to NaN, nie możesz porównać jej z inną wartością NaN. Zamiast tego używaj
isnan()
from<math.h>
w C lubstd::isnan()
from<cmath>
w C ++.źródło
x == x
zwracafalse
iffx
to NaN.Jak zauważyli inni, szukasz,
std::numeric_limits<double>::quiet_NaN()
chociaż muszę powiedzieć, że wolę dokumenty cppreference.com . Zwłaszcza, że to stwierdzenie jest trochę niejasne:i łatwo było dowiedzieć się, co to oznacza na tej stronie, jeśli sprawdzisz ich sekcję na
std::numeric_limits::has_quiet_NaN
jej temat:co, jak wyjaśniono tutaj ,
true
oznacza, że Twoja platforma obsługujeIEEE 754
standard. Ten poprzedni wątek wyjaśnia, że powinno to być prawdą w większości sytuacji.źródło
Można to zrobić za pomocą numeric_limits w C ++:
http://www.cplusplus.com/reference/limits/numeric_limits/
Oto metody, którym prawdopodobnie chcesz się przyjrzeć:
źródło
Tak, ponieważ C99, (C ++ 11)
<math.h>
oferuje następujące funkcje:które są jak ich
strtod("NAN(n-char-sequence)",0)
odpowiedniki iNAN
do zadań.Przykładowe dane wyjściowe: (zależne od implementacji)
źródło