математика — C ++ std :: complex & lt; & gt; проверка типа данных для NAN, INF (не сходимость)

Я хочу проверить, приводит ли операция над комплексным числом (std :: complex) к результату +/- INF или NAN. (Не сходящийся результат.)

Например, под отображением z -> z * z + c.

Я полагаю, что для типов данных с плавающей запятой или типа double можно использовать x! = X для проверки NAN. Я не уверен, что это работает для +/- INF.

1

Решение

использование std::isfinite. Эта функция возвращает true, если ее вход не nan ни inf, Вы также можете использовать std::isnan а также std::isinf проверить эти конкретные свойства.

РЕДАКТИРОВАТЬ: Для std::complexВы можете применить те же проверки на real а также imag частей. Вы также можете просто применить его на abs из std::complex объект.

2

Другие решения

Не используйте этот тест:

std::abs(z) > std::numeric_limits<double>::max()

Это не сможет обнаружить определенные конечные комплексные числа, такие как complex<double>(DBL_MAX, DBL_MAX), Сравнение также не удастся для случая, когда z имеет компонент NaN.

std::isfinite не имеет сложной перегрузки, поэтому вы не можете использовать этот тест:

isfinite(z)

Вы можете использовать этот тест:

z - z != complex<double>(0)

Если z имеет две конечные компоненты, то z - z имеет два нулевых компонента и будет сравниваться равным 0, Если z имеет по крайней мере один бесконечный или NaN компонент, этот компонент z - z будет NaN. NaN сравнивает != ко всему, в том числе 0 и себя.

0

По вопросам рекламы [email protected]