Можно ли назначить NaN
для double
или float
в C/С++? Как и в JavaScript, вы делаете: a = NaN
. Поэтому позже вы можете проверить, является ли переменная числом или нет.
Константа C/С++ NaN (буквальная)?
Ответ 1
В C, NAN
объявляется в <math.h>
.
В С++ std::numeric_limits<double>::quiet_NaN()
объявлен в <limits>
.
Но для проверки того, является ли значение NaN, вы не можете сравнить его с другим значением NaN. Вместо этого используйте isnan()
из <math.h>
в C или std::isnan()
из <cmath>
в С++.
Ответ 2
Как указывали другие, вы ищете std::numeric_limits<double>::quiet_NaN()
, хотя я должен сказать, что предпочитаю cppreference.com документы. Тем более, что это утверждение немного расплывчато:
Только значение, если std:: numeric_limits:: has_quiet_NaN == true.
и было легко понять, что это означает на этом сайте, если вы проверите их раздел на std::numeric_limits::has_quiet_NaN
, он говорит:
Эта константа имеет смысл для всех типов с плавающей точкой и гарантируется, что она истинна, если std:: numeric_limits:: is_iec559 == true.
который, как описано здесь, если true
означает, что ваша платформа поддерживает стандарт IEEE 754
. Этот предыдущий поток объясняет, что это должно быть правдой для большинства ситуаций.
Ответ 3
Это можно сделать с помощью numeric_limits в С++:
http://www.cplusplus.com/reference/limits/numeric_limits/
Вот те методы, которые вы, вероятно, хотите посмотреть:
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
Как правило, неплохо иметь недопустимые числа в вашей программе. Это может быть очень сложно избавиться от них позже, и они могут привести к сбою вашей программы.
Вот хороший список способов уловить такие числа, не назначая их им: https://studiofreya.com/cpp/1-inf-1-ind-and-qnan-floating-point-numbers-and-errors/#Capturing-errors
Короче говоря, их три:
- Сравнение
- с использованием стандарта С++ 11
- с использованием управляющих слов _controlfp и _control87