2013-05-22 17 views
75

Czy jest możliwe przypisanie NaN do double lub float w języku C/C++? Podobnie jak w JavaScript: a = NaN. Więc później możesz sprawdzić, czy zmienna jest liczbą czy nie.C/C++ NaN stała (literalna)?

Odpowiedz

95

W C NAN jest zadeklarowana w <math.h>.

W C++, std::numeric_limits<double>::quiet_NaN() jest zadeklarowany w <limits>.

Jednak dla sprawdzenia, czy wartość jest NaN, nie można jej porównać z inną wartością NaN. Zamiast tego użyj isnan() z <math.h> w C lub std::isnan() z <cmath> w C++.

+16

Lub możesz porównać liczbę do siebie - 'x == x' zwraca' false' iff 'x' jest NaN. – Archie

+6

@Archie: Nie sądzę, że jest to gwarantowane w obu językach. –

+3

@MikeSeymour Nie według standardu językowego, ale o ile mi wiadomo, powinien on działać, jeśli kompilator twierdzi, że jest zgodny z IEEE. – Pixelchemist

7

Można to zrobić za pomocą numeric_limits w C++:

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

Są to metody prawdopodobnie chcesz spojrzeć na:

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. 
+4

+1. Wikipedia ma pewne informacje na temat [quiet NaN] (http://en.wikipedia.org/wiki/NaN#Quiet_NaN) i [signaling NaN] (http://en.wikipedia.org/wiki/NaN#Signaling_NaN). –

18

Jak inni zwrócili uwagę, szukasz std::numeric_limits<double>::quiet_NaN(), chociaż muszę powiedzieć, że wolę dokumenty cppreference.com. Zwłaszcza, że ​​to stwierdzenie jest trochę niejasne:

Ma sens tylko, jeśli std :: numeric_limits :: has_quiet_NaN == true.

i było proste, aby dowiedzieć się, co to znaczy na tej stronie, sprawdzając ich rozdział na std::numeric_limits::has_quiet_NaN mówi:

Stała ta ma znaczenie dla wszystkich typów zmiennoprzecinkowych i gwarantuje być prawdziwe, jeśli std :: numeric_limits :: is_iec559 == true.

który jak wyjaśniono here jeśli true oznacza, że ​​platforma obsługuje standardu IEEE 754. To previous thread wyjaśnia, że ​​powinno to być prawdą w większości sytuacji.

-11

Generalnie nie jest dobrym pomysłem, aby mieć nieprawidłowe numery w swoim programie. Może być bardzo trudno pozbyć się ich później i mogą one spowodować awarię programu.

Oto dobra lista sposobów, aby złapać takich numerów bez przypisywania go do nich: https://studiofreya.com/cpp/1-inf-1-ind-and-qnan-floating-point-numbers-and-errors/#Capturing-errors

w skrócie, istnieją trzy z nich:

  • porównanie
  • użyciu C++ standardu 11
  • za pomocą słów kontrolnych _controlfp i _control87
+1

NaN to doskonale dobra liczba (czasami nie potrzebujesz wyjątków) –