From 19a00885d69dba87d9745edec1722513909e282a Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Mon, 21 Feb 2022 21:16:38 +0100 Subject: Use a threshold for utils::inv and simd_inv --- src/utils.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/utils.rs b/src/utils.rs index 9aa4bf2..07f0626 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -19,16 +19,19 @@ pub trait WReal: SimdRealField + Copy {} impl WReal for Real {} impl WReal for SimdReal {} +const INV_EPSILON: Real = 1.0e-20; + pub(crate) fn inv(val: Real) -> Real { - if val == 0.0 { + if val >= -INV_EPSILON && val <= INV_EPSILON { 0.0 } else { 1.0 / val } } -pub(crate) fn simd_inv(val: N) -> N { - N::zero().select(val.simd_eq(N::zero()), N::one() / val) +pub(crate) fn simd_inv(val: N) -> N { + let eps = N::splat(INV_EPSILON); + N::zero().select(val.simd_gt(-eps) & val.simd_lt(eps), N::one() / val) } /// Trait to copy the sign of each component of one scalar/vector/matrix to another. -- cgit