#pragma once #include #include #include /// To be sure, that this function is zero-cost for non-floating point types. template inline std::enable_if_t, bool> isNaN(T x) { return std::isnan(x); } template inline std::enable_if_t, bool> isNaN(T) { return false; } template inline std::enable_if_t, bool> isFinite(T x) { return std::isfinite(x); } template inline std::enable_if_t, bool> isFinite(T) { return true; } template std::enable_if_t, T> NaNOrZero() { return std::numeric_limits::quiet_NaN(); } template std::enable_if_t::is_integer, T> NaNOrZero() { return 0; } template std::enable_if_t, T> NaNOrZero() { return T{}; } #if 1 /// __int128 template std::enable_if_t && !std::numeric_limits::is_integer, __int128> NaNOrZero() { return __int128(0); } #endif