Вы говорите в комментарии, что вы используете только *
, +
, -
.
[Редактировать: с тех пор вы сказали, что вы также используете pow
и деление, которое вводитнесколько дополнительных способов получить NaN.Например, если параметр x
является большим отрицательным значением, тогда pow(e,-x)
- это бесконечность, так что вы можете легко вычислить бесконечность / бесконечность, что является другим NaN]
Итак, если у вас IEEE с плавающей запятой -затем предположим, что это резюме правильно, единственные способы, которыми вы можете генерировать NaN:
- Создание положительной или отрицательной бесконечности, выходя за пределы диапазона,
- Умножьте его на ноль.
или:
- Создайте положительную и отрицательную бесконечность,
- Сложите их (или, эквивалентно, вычтите две бесконечности изтот же знак).
Так что, если вы проверяете и ловите бесконечности, вам не нужно беспокоиться и о NaN.Тем не менее, обычный способ - позволить таким значениям распространяться как тихие NaN и проверять в конце.
Для реализаций C ++, использующих арифметику не-IEEE, я не уверен, каковы правила, когда NaN являетсяразрешенный.Я мог бы посмотреть их в стандарте, но опять же вы могли бы; -)