NaN - разумный выбор для предложения «без значения» (например, язык программирования D использует их для неинициализированных значений), но поскольку любые сравнения с ними будут ложными, вы можете получить несколько сюрпризов:
if (result == DEFAULT_VALUE)
, не будет работать должным образом, если DEFAULT_VALUE
- NaN, как упоминал Джон.
Они также могут вызвать проблемы с проверкой диапазона, если вы не будете осторожны. Рассмотрим функцию:
bool isOutsideRange(double x, double minValue, double maxValue)
{
return x < minValue || x > maxValue;
}
Если x равен NaN, эта функция неправильно сообщит, что x находится между minValue и maxValue.
Если вы просто хотите, чтобы магическое значение для пользователей проверялось, я бы порекомендовал положительную или отрицательную бесконечность вместо NaN, поскольку она не имеет тех же ловушек. Используйте NaN, если вы хотите, чтобы в качестве его свойства все операции над NaN приводили к NaN: это удобно, когда вы не хотите полагаться на вызывающих, проверяющих значение, например.
[Edit: мне изначально удалось напечатать «любые сравнения с ними будут истинными» выше, что я не имел в виду, и это неправильно, все они ложные, кроме NaN! = NaN, что верно]