c как проверить -1.#IND в массиве

#c #floating-point

#c #с плавающей запятой #c

Вопрос:

Я получил массив с плавающей запятой, в котором хранится некоторое значение, вычисленное некоторыми функциями. Однако, когда я извлекаю значение из массива, некоторые из значений равны -1.#IND, что является ошибкой с плавающей запятой или какой-то другой, я думаю.

Итак, вот мой маленький вопрос: как мне использовать оператор if, чтобы проверить, содержит ли массив с плавающей запятой значение -1.#IND, чтобы я мог что-то с ним сделать??

Спасибо

Комментарии:

1. Интересное решение. Знает ли оптимизация, что никогда не следует исключать сравнение, если значение является плавающим?

2. @mah это был бы хорошо написанный оптимизатор, то есть тот, который не делает ложных предположений.

Ответ №1:

if(a != a); Это верно только в том случае, если a является NaN . О, а также в cmath есть функция isnan() . Подробнее об isnan() …

Комментарии:

1. Вау, я никогда не знал a != a, когда a не является числом!

Ответ №2:

-1.#IND — это NaN-код (не число), в котором значение не определено / непредставимо. Таким образом, у вашего численного алгоритма может возникнуть проблема, если он выдает значения NaN. Убедитесь, что исключения с плавающей запятой включены, поскольку ошибки NaN могут возникать в результате ошибок деления на 0, и убедитесь, что вы запускаете его в режиме отладки, выполните пошаговое выполнение и посмотрите, когда, как и почему это происходит.

Не уверен, можете ли вы выполнить прямое сравнение на равенство, поскольку представление может измениться,

проверьте IEEE 754, также убедитесь, что ваш компилятор использует значения с плавающей запятой IEEE 754.

Надеюсь, это поможет.

Комментарии:

1. NAN никогда не равны ничему, даже самому себе.

Ответ №3:

-1.#IND похоже на «неопределенное» значение, которое появится, если вы сделаете что-то вроде попытки вычислить 0/0.

Другие значения, с которыми вы можете столкнуться, — это положительная и отрицательная бесконечность.

Чтобы отфильтровать эти специальные значения, используйте такие функции, как _finite , finitef или _fpclass .

Комментарии:

1. Для C 11 или C99 вы бы использовали fpclassify . Другие методы являются стандартными.

Ответ №4:

Хороший способ проверить, является ли значение с плавающей запятой допустимым числом, — использовать: std::isnormal() Если число не является нормальным, вы можете использовать std::fpclassify(), чтобы выяснить, какая это ошибка.