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
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++.
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.
+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). –
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.
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
NaN to doskonale dobra liczba (czasami nie potrzebujesz wyjątków) –
- 1. NaN Stała Magia w Javie
- 2. Stała końcowa stała się pusta
- 3. data filtra zwraca NaN-NaN-NaN w AngularJS
- 4. Jaka jest różnica między nan, NaN i NAN
- 5. Jakie są inne wartości NaN?
- 6. mailto z wieloma adresami cc
- 7. Czy istnieje literalna notacja dla tablicy symboli?
- 8. Common Lisp: Dlaczego nie literalna wartość argumentów?
- 9. pozycja CALayer zawiera NaN: [nan -0,5]
- 10. Różnica między CC, gcc i g ++?
- 11. Co oznacza CC? = W pliku Makefile?
- 12. Pokazuje NaN NaN w jQuery bootstrap elementu datatable
- 13. Jaka jest różnica między cichym NaN i sygnalizacyjnym NaN?
- 14. Canvas.GetTop() wracając NaN
- 15. Porównanie NaN w Kotlin
- 16. Pandy sortowane i NaN
- 17. Błąd kompilacji Nan
- 18. Python reindex Producing Nan
- 19. NaN! == parseInt (undefined);
- 20. wysyłanie NaN w jsonie
- 21. Pułapka na pułapkę NaN
- 22. Celowo zwracam NaN
- 23. C# stała binarna reprezentacja
- 24. Niezainicjowana stała AssetSync
- 25. niezainicjowana stała RAILS_DEFAULT_LOGGER
- 26. niezainicjowany stała Opóźnione :: Job
- 27. `const_missing ': niezainicjowany stała (NameError)
- 28. Python: Stała Klasa
- 29. fullcalendar stała wysokość rzędu
- 30. nie stała w Enum
Lub możesz porównać liczbę do siebie - 'x == x' zwraca' false' iff 'x' jest NaN. – Archie
@Archie: Nie sądzę, że jest to gwarantowane w obu językach. –
@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