Может ли целое число быть NaN в С++?

Могу ли я установить int на NaN? Если да, то как я могу проверить, является ли int NaN или нет?


person MBZ    schedule 16.10.2010    source источник


Ответы (5)


Нет, NaN — это значение с плавающей запятой.

Каждое возможное значение int является числом.

Редактировать

Стандарт говорит:

6.2.6.2 40) Некоторые комбинации битов заполнения могут генерировать представления прерываний, например, если один бит заполнения является битом четности. Несмотря на это, никакая арифметическая операция над допустимыми значениями не может генерировать представление прерывания, кроме как в рамках исключительного условия, такого как переполнение, и это не может произойти с беззнаковыми типами.

Таким образом, могут существовать недопустимые целочисленные значения, специфичные для конкретной реализации, но не существует определенного способа их создания.

person DerKuchen    schedule 16.10.2010
comment
Каждое возможное значение int является числом. Это часть стандарта или просто то, что всегда верно на практике? Например, в стандарте C99 целочисленные типы могут иметь представление ловушек. Только у unsigned char гарантированно их нет. - person Pascal Cuoq; 16.10.2010
comment
Представления ловушек @Pascal не считаются значениями. Некоторые представления объектов не обязательно должны представлять значение типа объекта. [...] Такое представление называется представлением-ловушкой. - person Johannes Schaub - litb; 16.10.2010
comment
@Johannes: я уверен, что DerKuchen имеет в виду битовые шаблоны, а не значения типа объекта. - person Cheers and hth. - Alf; 16.10.2010
comment
numeric_limits<int>::quiet_NaN(), конечно ;v) . — А если серьезно, NaN — это не значение с плавающей запятой, это отсутствие какого-либо значения, FP или чего-то еще. Просто добавление к формату FP оказывается дешевле, чем к формату с фиксированной точкой. - person Potatoswatter; 20.10.2010
comment
@Potatoswatter Согласно ссылке quiet_NaN() вернет 0 для int. - person dominikschnitzer; 13.06.2013
comment
@dominikschnitzer Это вики; они ничего не решают. Для анализа того, что стандарт ISO говорит о целочисленных значениях NaN, см. stackoverflow.com/a/3972350/153285 . - person Potatoswatter; 15.06.2013
comment
Начиная с C++20, ловушки не разрешены. (Биты заполнения имеют неопределенное значение, но не могут вызывать ловушки. Напротив, см. ISO C 6.2.6.2 - базовый.фундаментальный) - person Lack; 28.08.2020

В целом (и, насколько мне известно, конкретно в случае C++): нет .

Целое число NaN

Большинство целочисленных форматов фиксированного размера не имеют возможности явно указывать недопустимые данные.

person Mark Rushakoff    schedule 16.10.2010

Я думаю, что наиболее правильный API для обработки сбоев - это вернуть второй целочисленный код ошибки в ваш API, например:

int myfunc(args, int* realReturn);

Возвращаемый int является кодом ошибки.

Предыдущий вывод передается как указатель в вызывающем коде:

int myInt;
if (myFunc(args, &myInt) != 0) {
//handle error
}
person gturbo    schedule 22.06.2019

У вас нет какого-либо определенного значения int как Nan. Обычно люди используют некоторое большое целое число для представления этого значения. ЕСЛИ это беззнаковое целое, то обычно используется -1.

person Manoj R    schedule 16.10.2010

Нет, вы не можете установить int в NaN.

person codaddict    schedule 16.10.2010