Я хочу проверить, приводит ли операция над комплексным числом (std :: complex) к результату +/- INF или NAN. (Не сходящийся результат.)
Например, под отображением z -> z * z + c.
Я полагаю, что для типов данных с плавающей запятой или типа double можно использовать x! = X для проверки NAN. Я не уверен, что это работает для +/- INF.
использование std::isfinite
. Эта функция возвращает true, если ее вход не nan
ни inf
, Вы также можете использовать std::isnan
а также std::isinf
проверить эти конкретные свойства.
РЕДАКТИРОВАТЬ: Для std::complex
Вы можете применить те же проверки на real
а также imag
частей. Вы также можете просто применить его на abs
из std::complex
объект.
Не используйте этот тест:
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
и себя.