From 78ea54ac2dc72aa5b44041bd7c567461490cec65 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 31 Aug 2025 14:46:20 +0300 Subject: [PATCH] Add math::dual weak comparison operators & some transcendental functions --- libs/math/include/psemek/math/dual.hpp | 45 ++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/libs/math/include/psemek/math/dual.hpp b/libs/math/include/psemek/math/dual.hpp index cca32a95..dc198927 100644 --- a/libs/math/include/psemek/math/dual.hpp +++ b/libs/math/include/psemek/math/dual.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace psemek::math { @@ -148,6 +149,50 @@ namespace psemek::math return v * inverse(d); } + // Exists mostly to make max/min/clamp/etc work + template + std::partial_ordering operator <=> (dual const & d1, dual const & d2) + { + return d1.scalar <=> d2.scalar; + } + + template + dual abs(dual const & d) + { + return d.scalar > T{0} ? d : -d; + } + + template + dual exp(dual const & d) + { + auto e = std::exp(d.scalar); + return {e, e * d.delta}; + } + + template + dual log(dual const & d) + { + return {std::log(d.scalar), d.delta / d.scalar}; + } + + template + dual sin(dual const & d) + { + return {std::sin(d.scalar), std::cos(d.scalar) * d.delta}; + } + + template + dual cos(dual const & d) + { + return {std::cos(d.scalar), - std::sin(d.scalar) * d.delta}; + } + + template + dual pow(dual const & d1, dual const & d2) + { + return exp(log(d1) * d2); + } + template std::ostream & operator << (std::ostream & os, dual const & d) {