12#include "detray/algebra/concepts.hpp"
13#include "detray/definitions/detail/qualifiers.hpp"
17#pragma warning(push, 0)
28namespace detray::algebra {
43template <
typename simd1_t,
typename simd2_t>
44 requires((Vc::is_simd_vector<simd1_t>::value &&
45 std::convertible_to<simd2_t, simd1_t>) ||
46 (Vc::is_simd_vector<simd2_t>::value &&
47 std::convertible_to<simd1_t, simd2_t>))
48DETRAY_HOST_DEVICE
constexpr auto approx_equal(
49 const simd1_t a,
const simd2_t b,
50 const typename simd1_t::value_type rel_error =
51 16.f * std::numeric_limits<typename simd1_t::value_type>::epsilon(),
52 const typename simd1_t::value_type max_error =
53 std::numeric_limits<typename simd1_t::value_type>::epsilon()) {
55 std::same_as<typename simd1_t::value_type, typename simd2_t::value_type>);
57 if constexpr (std::integral<typename simd1_t::value_type>) {
58 return (a == b).isFull();
61 const simd1_t diff{Vc::abs(a - b)};
64 if ((diff <= simd1_t(max_error)).isFull()) {
69 const simd1_t largest = Vc::max(Vc::abs(a), Vc::abs(b));
71 return (diff <= (largest * rel_error)).isFull();