Как уже указал Мариус, isfinite
из amp_math.h
должен использоваться в C++ AMP, который является расширением MS для параллельных вычислений на многоядерных архитектурах, подобных CUDA или OpenCL. И поскольку эта функция может использоваться только в реальных функциях с ограниченным доступом AMP (обычно в ядрах графического процессора), она не будет вам особенно полезна.
К сожалению, VS 2012 не поддерживает математические функции C++11 и функции управления с плавающей запятой. Но как только вы узнаете, что находитесь в VC, и реализуете для него специальный код, вы можете просто использовать _finite
(или, скорее, !_finite
) из <float.h>
, которая является MS-специфичной функцией, поддерживаемой по крайней мере, начиная с VS 2003. Но имейте в виду, что _finite
принимает только double
и, таким образом, преобразует любые аргументы, отличные от double
(хотя VC все равно не имеет правильного long double
), со всеми вытекающими последствиями (в то время как INF
и тихие NaN
должны быть преобразованы без проблем, я не уверен, что ловушка на сигнальном NaN
в преобразовании также произошла бы в результате прямого вызова std::finite
).
В стандартной библиотеке VC есть другие подобные функции, которые можно использовать для своих целей. отсутствие поддержки C++11/C99 (например, _isnan
и т.п.). (Почему они отказываются просто удалить это подчеркивание перед этими функциями и поместить простую оболочку <cfenv>
вокруг _controlfp
и, таким образом, немного приблизиться к полной поддержке C++11, это совершенно другой вопрос.)
РЕДАКТИРОВАТЬ: Помимо этого, прямой подход к проверке INF
s и NaN
s также может работать:
template<typename T> bool isfinite(T arg)
{
return arg == arg &&
arg != std::numeric_limits<T>::infinity() &&
arg != -std::numeric_limits<T>::infinity();
}
Но, конечно, с теми же последствиями, что и, возможно, перехват для сигнализации NaN
s (хотя я должен признать, что я не очень хорошо разбираюсь в тонкостях сигнализации NaN
s и исключений с плавающей запятой в целом).
person
Christian Rau
schedule
29.01.2013