From 08e3dfa3a38306d2430d0e04caa1d5c6324486ad Mon Sep 17 00:00:00 2001 From: Jonah Miller Date: Thu, 5 Dec 2024 20:55:51 -0700 Subject: [PATCH] Brendan's comments --- doc/sphinx/src/using.rst | 14 ++++++++------ ports-of-call/robust_utils.hpp | 2 ++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/sphinx/src/using.rst b/doc/sphinx/src/using.rst index 648efd6b..729830c3 100644 --- a/doc/sphinx/src/using.rst +++ b/doc/sphinx/src/using.rst @@ -137,8 +137,8 @@ functionality is contained in the namespace ``PortsOfCall::Robust`` and includes * ``constexpr auto SMALL()`` returns a small number of type ``T``. * ``constexpr auto EPS()`` returns a value of type ``T`` close to machine epsilon. -* ``constexpr auto min_exp_arg()`` returns the smallest of type ``T`` safe value to pass into an exponent. -* ``constexpr auto max_exp_exp_arg()`` returns the max value of type ``T`` to pass into an exponent. +* ``constexpr auto min_exp_arg()`` returns the smallest safe value of type ``T`` to pass into an exponent. +* ``constexpr auto max_exp_exp_arg()`` returns the max safe value of type ``T`` to pass into an exponent. * ``auto make_positive(const T val)`` makes the argument of type ``T`` positive. where here all functionality is templated on type ``T`` and marked @@ -153,7 +153,8 @@ The function PORTABLE_FORCEINLINE_FUNCTION Real make_bounded(const T val, const T vmin, const T vmax); -bounds ``val`` between ``vmin`` and ``vmax``. +bounds ``val`` between ``vmin`` and ``vmax``, exclusive. Note this is +slightly different than ``std::clamp``, which uses inclusive bounds. The function @@ -176,9 +177,10 @@ The function template PORTABLE_FORCEINLINE_FUNCTION auto ratio(const A &a, const B &b) -computes the ratio :math:`A/B` but in a way robust to divide by zero -errors. If both :math:`A` and :math:`B` are zero, this function will -return 0. +computes the ratio :math:`A/B` but in a way robust to 0/0 errors. If +both :math:`A` and :math:`B` are zero, this function will return 0. If +:math:`|A| > 0` and :math:`B=0`, then it will return a very large, +possibly (but not guaranteed to be) infinite number. The function diff --git a/ports-of-call/robust_utils.hpp b/ports-of-call/robust_utils.hpp index d5cd0272..d95bc105 100644 --- a/ports-of-call/robust_utils.hpp +++ b/ports-of-call/robust_utils.hpp @@ -59,6 +59,8 @@ PORTABLE_FORCEINLINE_FUNCTION int sgn(const T &val) { template PORTABLE_FORCEINLINE_FUNCTION auto ratio(const A &a, const B &b) { + B mask = static_cast(std::abs(b) < SMALL()); + B denom = mask * sgn(b) * SMALL() + (1 - mask) * b; return a / (b + sgn(b) * SMALL()); }