Возможно ли это , чтобы назначить NaNк doubleили floatв C / C ++? Как и в JavaScript вы: a = NaN. Так что позже вы можете проверить, является ли переменная числом или нет.
В C ++ std::numeric_limits<double>::quiet_NaN()объявлен в <limits>.
Но для проверки того, является ли значение NaN, вы не можете сравнить его с другим значением NaN. Вместо этого используйте isnan()from <math.h>в C или std::isnan()from <cmath>в C ++.
Или вы можете сравнить это число с самим собой - x == xвозвращает, falseесли и только если xэто NaN.
Арчи
7
@Archie: Я не думаю, что это гарантировано ни на одном из языков.
Майк Сеймур
3
@MikeSeymour Не по стандарту языка, но, насколько я знаю, он должен работать, если компилятор утверждает, что он соответствует требованиям IEEE.
Pixelchemist
39
@Pixelchemist: Действительно, это вариант, если вам нужна обфускация, но не переносимость. Лично я предпочитаю переносимость без обфускации, поэтому сам предлагать ее не буду.
Майк Сеймур
9
второстепенное примечание: NAN - это число с плавающей запятой, а не двойное. ссылка
orion elenzil
23
Как отмечали другие, вы ищете, std::numeric_limits<double>::quiet_NaN()хотя я должен сказать, что предпочитаю документы cppreference.com . Тем более, что это утверждение немного расплывчато:
Имеет смысл, только если std :: numeric_limits :: has_quiet_NaN == true.
Эта константа имеет смысл для всех типов с плавающей запятой и гарантированно верна, если std :: numeric_limits :: is_iec559 == true.
что, как объясняется здесь , trueозначает, что ваша платформа поддерживает IEEE 754стандарт. Этот предыдущий поток объясняет, что это должно быть верно для большинства ситуаций.
Вот методы, на которые вы, вероятно, захотите обратить внимание:
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.
Ответы:
В C
NAN
объявлен в<math.h>
.В C ++
std::numeric_limits<double>::quiet_NaN()
объявлен в<limits>
.Но для проверки того, является ли значение NaN, вы не можете сравнить его с другим значением NaN. Вместо этого используйте
isnan()
from<math.h>
в C илиstd::isnan()
from<cmath>
в C ++.источник
x == x
возвращает,false
если и только еслиx
это NaN.Как отмечали другие, вы ищете,
std::numeric_limits<double>::quiet_NaN()
хотя я должен сказать, что предпочитаю документы cppreference.com . Тем более, что это утверждение немного расплывчато:и было несложно понять, что это означает на этом сайте, если вы посмотрите их раздел на
std::numeric_limits::has_quiet_NaN
нем:что, как объясняется здесь ,
true
означает, что ваша платформа поддерживаетIEEE 754
стандарт. Этот предыдущий поток объясняет, что это должно быть верно для большинства ситуаций.источник
Это можно сделать с помощью numeric_limits в C ++:
http://www.cplusplus.com/reference/limits/numeric_limits/
Вот методы, на которые вы, вероятно, захотите обратить внимание:
источник
Да, поскольку C99 (C ++ 11)
<math.h>
предлагает следующие функции:которые похожи на своих
strtod("NAN(n-char-sequence)",0)
собратьев иNAN
для заданий.Пример вывода: (зависит от реализации)
источник