diff --git a/headers/vmath.hpp/vmath_fun.hpp b/headers/vmath.hpp/vmath_fun.hpp index 3018e8c..e1059d9 100644 --- a/headers/vmath.hpp/vmath_fun.hpp +++ b/headers/vmath.hpp/vmath_fun.hpp @@ -123,8 +123,9 @@ namespace vmath_hpp using ::std::isnan; using ::std::isinf; - using ::std::fma; + using ::std::isfinite; + using ::std::fma; using ::std::frexp; using ::std::ldexp; } diff --git a/headers/vmath.hpp/vmath_vec_fun.hpp b/headers/vmath.hpp/vmath_vec_fun.hpp index 0dbd7ae..c79cc1e 100644 --- a/headers/vmath.hpp/vmath_vec_fun.hpp +++ b/headers/vmath.hpp/vmath_vec_fun.hpp @@ -511,6 +511,11 @@ namespace vmath_hpp return map([](T x) { return isinf(x); }, xs); } + template < typename T, std::size_t Size > + vec isfinite(const vec& xs) { + return map([](T x) { return isfinite(x); }, xs); + } + template < typename T, std::size_t Size > vec fma(const vec& as, const vec& bs, const vec& cs) { return zip([](T a, T b, T c) { return fma(a, b, c); }, as, bs, cs); diff --git a/untests/vmath_fun_tests.cpp b/untests/vmath_fun_tests.cpp index a935a00..2db00a1 100644 --- a/untests/vmath_fun_tests.cpp +++ b/untests/vmath_fun_tests.cpp @@ -99,6 +99,7 @@ TEST_CASE("vmath/fun") { REQUIRE_FALSE(isnan(1.f)); REQUIRE_FALSE(isinf(1.f)); + REQUIRE(isfinite(1.f)); REQUIRE(fma(2.f, 3.f, 4.f) == approx(10.f)); diff --git a/untests/vmath_vec_fun_tests.cpp b/untests/vmath_vec_fun_tests.cpp index d84e6b9..247716d 100644 --- a/untests/vmath_vec_fun_tests.cpp +++ b/untests/vmath_vec_fun_tests.cpp @@ -147,6 +147,7 @@ TEST_CASE("vmath/vec_fun") { REQUIRE_FALSE(isnan(vec2f(1.f)).x); REQUIRE_FALSE(isinf(vec2f(1.f)).x); + REQUIRE(isfinite(vec2f(1.f)).x); REQUIRE_FALSE(fma(vec2f(2.f), vec2f(3.f), vec2f(4.f)).x == Approx(12.f));