diff --git a/libs/geom/include/psemek/geom/vector.hpp b/libs/geom/include/psemek/geom/vector.hpp index 154521f7..8608e4e7 100644 --- a/libs/geom/include/psemek/geom/vector.hpp +++ b/libs/geom/include/psemek/geom/vector.hpp @@ -201,10 +201,21 @@ namespace psemek::geom return dot(v, v); } + template + T linf_norm(vector const & v) + { + T r = std::abs(v[0]); + for (std::size_t i = 1; i < N; ++i) + r = std::max(r, std::abs(v[i])); + return r; + } + template T length(vector const & v) { - return std::sqrt(length_sqr(v)); + T const m = linf_norm(v); + if (m == 0) return m; + return m * std::sqrt(length_sqr(v / m)); } template