sigma  1.0.0
Loading...
Searching...
No Matches
basic.ipp
1#pragma once
3#include <cmath>
4
5namespace sigma {
6
7template<typename T>
9 T mean = std::abs(a.mean());
10 T dcda = (a.mean() >= 0) ? 1.0 : -1.0;
11 return detail_::unary_result(a, mean, dcda);
12}
13
14template<typename T>
16 return abs(a);
17}
18
19template<typename T>
21 return pow(abs(a), 2.0);
22}
23
24template<typename T>
26 return Uncertain<T>(std::ceil(a.mean()), T{0.0}, a.threshold());
27}
28
29template<typename T>
31 return Uncertain<T>(std::floor(a.mean()), T{0.0}, a.threshold());
32}
33
34template<typename T>
36 Uncertain<T> c(a);
37 T mean = std::fmod(a.mean(), b.mean());
38 T dcda = 1.0;
39 T dcdb = -std::floor(a.mean() / b.mean());
40 detail_::inplace_binary(c, b, mean, dcda, dcdb);
41 return c;
42}
43
44template<typename T>
45Uncertain<T> fmod(const Uncertain<T>& a, double b) {
46 T mean = std::fmod(a.mean(), b);
47 T dcda = 1.0;
48 return detail_::unary_result(a, mean, dcda);
49}
50
51template<typename T>
52Uncertain<T> fmod(double a, const Uncertain<T>& b) {
53 T mean = std::fmod(a, b.mean());
54 T dcda = -std::floor(a / b.mean());
55 return detail_::unary_result(b, mean, dcda);
56}
57
58template<typename T>
60 return copysign(a, b.mean());
61}
62
63template<typename T, typename U>
64Uncertain<T> copysign(const Uncertain<T>& a, const U& b) {
65 auto b_sign = std::copysign(1.0, b);
66 T mean = std::copysign(a.mean(), b);
67 T dcda = (a.mean() >= 0) ? b_sign : -b_sign;
68 return detail_::unary_result(a, mean, dcda);
69}
70
71template<typename T, typename U>
72U copysign(const U& a, const Uncertain<T>& b) {
73 return std::copysign(a, b.mean());
74}
75
76template<typename T>
78 return Uncertain<T>(std::trunc(a.mean()), T{0.0}, a.threshold());
79}
80
81template<typename T>
83 return Uncertain<T>(std::round(a.mean()), T{0.0}, a.threshold());
84}
85
86} // namespace sigma
Models an unceratin variable.
Definition uncertain.hpp:34
value_t mean() const
Get the mean value of the variable.
Definition uncertain.hpp:71
value_t threshold() const
Access the zero threshold.
Definition uncertain.hpp:95
void inplace_binary(Uncertain< T > &c, const Uncertain< T > &b, T mean, T dcda, T dcdb)
Generalized Inplace Binary Changes.
Definition operation_common.hpp:61
Uncertain< T > unary_result(const Uncertain< T > &a, T mean, T dcda)
Generalized Unary Changes.
Definition operation_common.hpp:43
The primary namespace for the sigma library.
Definition affine.hpp:12
Affine< T > pow(const Affine< T > &a, const U &exp)
Calculate the power of an affine form.
Definition exponents.ipp:71
Affine< T > abs(const Affine< T > &a)
Absolute Value of an affine form.
Definition basic.ipp:8
Affine< T > fabs(const Affine< T > &a)
Absolute Value of an affine form.
Definition basic.ipp:25
Uncertain< T > round(const Uncertain< T > &a)
Round to the nearest integar, away from zero in halfway case.
Definition basic.ipp:82
Uncertain< T > floor(const Uncertain< T > &a)
Nearest integer not greater than the given value.
Definition basic.ipp:30
Uncertain< T > abs2(const Uncertain< T > &a)
The Square of the Absolute Value.
Definition basic.ipp:20
Uncertain< T > ceil(const Uncertain< T > &a)
Nearest integer not less than the given value.
Definition basic.ipp:25
Uncertain< T > copysign(const Uncertain< T > &a, const Uncertain< T > &b)
Copy the sign of one value to another.
Definition basic.ipp:59
Uncertain< T > trunc(const Uncertain< T > &a)
Remove the fractional part from a variable.
Definition basic.ipp:77
Uncertain< T > fmod(const Uncertain< T > &a, const Uncertain< T > &b)
Floating point module.
Definition basic.ipp:35
Common implementation details for operations.