@@ -29,7 +29,7 @@ namespace detail
2929 is_convertible (T_in value)
3030 {
3131 int64_t signed_value = static_cast <int64_t >(value);
32- return signed_value <= static_cast <int64_t >(std::numeric_limits<T_out>::max ()) && signed_value >= static_cast <int64_t >(std::numeric_limits<T_out>::lowest ());
32+ return signed_value < static_cast <int64_t >(std::numeric_limits<T_out>::max ()) && signed_value >= static_cast <int64_t >(std::numeric_limits<T_out>::lowest ());
3333 }
3434
3535 template <class T_out , class T_in >
@@ -43,7 +43,7 @@ namespace detail
4343 inline typename std::enable_if<std::is_floating_point<T_in>::value && std::is_integral<T_out>::value, bool >::type
4444 is_convertible (T_in value)
4545 {
46- return value <= static_cast <T_in>(std::numeric_limits<T_out>::max ()) && value >= static_cast <T_in>(std::numeric_limits<T_out>::lowest ());
46+ return value < static_cast <T_in>(std::numeric_limits<T_out>::max ()) && value >= static_cast <T_in>(std::numeric_limits<T_out>::lowest ());
4747 }
4848
4949 template <class T_out , class T_in >
@@ -328,12 +328,19 @@ struct batch_cast_test
328328 using B_common_in = xsimd::batch<T_in>;
329329 using B_common_out = xsimd::batch<T_out>;
330330
331- T_in in_test_value = static_cast <T_in>(test_value);
331+ auto clamp = [](T v)
332+ {
333+ return static_cast <T_in>(xsimd::min (v, static_cast <T>(std::numeric_limits<T_in>::max () - 1 )));
334+ };
335+
336+ T_in in_test_value = clamp (test_value);
332337 if (detail::is_convertible<T_out>(in_test_value))
333338 {
334339 B_common_out res = xsimd::batch_cast<T_out>(B_common_in (in_test_value));
335340 INFO (name);
336- CHECK_SCALAR_EQ (res.get (0 ), static_cast <T_out>(in_test_value));
341+ T_out scalar_ref = static_cast <T_out>(in_test_value);
342+ T_out scalar_res = res.get (0 );
343+ CHECK_SCALAR_EQ (scalar_ref, scalar_res);
337344 }
338345 }
339346
0 commit comments