aboutsummaryrefslogtreecommitdiffstats
path: root/libprakpp/include/prakcommon.hpp
diff options
context:
space:
mode:
authorjustanothercatgirl <sotov2070@gmail.com>2025-02-24 21:26:32 +0300
committerjustanothercatgirl <sotov2070@gmail.com>2025-02-24 21:26:32 +0300
commite10c7380486e07b277001ab3aa653b74aa990f79 (patch)
tree56911e9760a43f9753fb0190952eaf4fd9ad6151 /libprakpp/include/prakcommon.hpp
parent8269ece153d9f8d1a8a5fb7238adce6aa4226f99 (diff)
Added 227
Diffstat (limited to 'libprakpp/include/prakcommon.hpp')
-rw-r--r--libprakpp/include/prakcommon.hpp41
1 files changed, 12 insertions, 29 deletions
diff --git a/libprakpp/include/prakcommon.hpp b/libprakpp/include/prakcommon.hpp
index c9bced3..47c793c 100644
--- a/libprakpp/include/prakcommon.hpp
+++ b/libprakpp/include/prakcommon.hpp
@@ -75,24 +75,6 @@ fequal(T x, T y, std::size_t ulps = 1)
return std::fabs(x - y) <= ulps * std::ldexp(std::numeric_limits<T>::epsilon(), exp);
}
-template<typename T>
-T sum(const std::vector<T> &args) {
- T res{};
- for (const T& x : args) res += x;
- return res;
-}
-
-template<typename T>
-T prod(const std::vector<T> &args) {
- T res = 1;
- for (const T& x : args) res *= x;
- return res;
-}
-
-template <std::floating_point T>
-T hypot(const std::vector<T> &args) {
- return std::sqrt(args[0]*args[0] + args[1]*args[1]);
-}
/// prints a vector
template <typename T>
@@ -124,16 +106,17 @@ using vector = std::vector<T, align_alloc<T>>;
/// prak value / pair value: a value with an error
template <typename T>
struct pvalue { T val, err; };
-
-template <typename T>
-struct pvalue<T> operator*(const struct pvalue<T> &v, T a) {
- return pvalue<T>{v.val * a, v.err * a};
-}
-
-template <typename T>
-std::ostream &operator<<(std::ostream &os, const struct pvalue<T> &p) {
- /* return os << "value {" << p.val << "±" << p.err << "}"; */
- return os << p.val << "±" << p.err;
-}
+template <typename T> struct pvalue<T> operator*(const struct pvalue<T> &v, const T &a) { return {v.val * a, v.err * a}; }
+template <typename T> struct pvalue<T> operator*(const T &a, const struct pvalue<T> &v) { return {v.val * a, v.err * a}; }
+template <typename T> struct pvalue<T> operator*(const struct pvalue<T> &a, const struct pvalue<T> &b) { return {a.val * b.val, a.val * b.val * std::hypot(a.err/a.val, b.err/b.val)}; }
+template <typename T> struct pvalue<T> operator/(const struct pvalue<T> &v, const T &a) { return {v.val / a, v.err / a}; }
+template <typename T> struct pvalue<T> operator/(const struct pvalue<T> &a, const struct pvalue<T> &b) { return {a.val / b.val, a.val / b.val * std::hypot(a.err/a.val, b.err/b.val)}; }
+template <typename T> struct pvalue<T> operator+(const struct pvalue<T> &a, const struct pvalue<T> &b) { return {a.val + b.val, std::hypot(a.err, b.err)}; }
+template <typename T> struct pvalue<T> operator-(const struct pvalue<T> &a, const struct pvalue<T> &b) { return {a.val - b.val, std::hypot(a.err, b.err)}; }
+template <typename T> struct pvalue<T> operator+(const struct pvalue<T> &a, const T &b) { return {a.val + b, a.err}; }
+template <typename T> struct pvalue<T> operator-(const struct pvalue<T> &a, const T &b) { return {a.val - b, a.err}; }
+template <typename T> struct pvalue<T> operator+(const T &a, const struct pvalue<T> &b) { return {a + b.val, b.err}; }
+template <typename T> struct pvalue<T> operator-(const T &a, const struct pvalue<T> &b) { return {a - b.val, b.err}; }
+template <typename T> std::ostream &operator<<(std::ostream &os, const struct pvalue<T> &p) { return os << p.val << "±" << p.err; }
} // namespace prak