libpromeki main
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
rational.h
Go to the documentation of this file.
1
8#pragma once
9
10#include <numeric>
11#include <algorithm>
13#include <promeki/core/string.h>
14
16
36template <typename T = int> class Rational {
37 public:
46 Rational(T n = 0, T d = 1) : _num(n), _den(d) {
47 if(_den != 0) simplify();
48 }
49
51 bool isValid() const { return _den != 0; }
52
59 if(!isValid() || !rhs.isValid()) return Rational(0, 0);
60 T lcm = std::lcm(_den, rhs._den);
61 T num = _num * (lcm / _den) + rhs._num * (lcm / rhs._den);
62 return Rational(num, lcm);
63 }
64
71 if(!isValid() || !rhs.isValid()) return Rational(0, 0);
72 T lcm = std::lcm(_den, rhs._den);
73 T num = _num * (lcm / _den) - rhs._num * (lcm / rhs._den);
74 return Rational(num, lcm);
75 }
76
83 if(!isValid() || !rhs.isValid()) return Rational(0, 0);
84 T num = _num * rhs._num;
85 T den = _den * rhs._den;
86 return Rational(num, den);
87 }
88
95 if(!isValid() || !rhs.isValid() || rhs._num == 0) return Rational(0, 0);
96 T num = _num * rhs._den;
97 T den = _den * rhs._num;
98 return Rational(num, den);
99 }
100
102 bool operator==(const Rational &rhs) const {
103 return _num == rhs._num && _den == rhs._den;
104 }
105
107 bool operator!=(const Rational &rhs) const {
108 return !(*this == rhs);
109 }
110
112 T numerator() const { return _num; }
113
115 T denominator() const { return _den; }
116
121 double toDouble() const {
122 if(!isValid()) return 0.0;
123 return static_cast<double>(_num) / static_cast<double>(_den);
124 }
125
127 String toString() const {
128 return String::dec(_num) + "/" + String::dec(_den);
129 }
130
132 operator String() const {
133 return toString();
134 }
135
136 private:
137 T _num;
138 T _den;
139
140 void simplify() {
141 T gcd = std::gcd(_num, _den);
142 _num /= gcd;
143 _den /= gcd;
144 return;
145 }
146};
147
Dynamic array container wrapping std::vector.
Definition list.h:40
Rational number with numerator and denominator.
Definition rational.h:36
Rational operator+(const Rational &rhs) const
Adds two rationals.
Definition rational.h:58
bool operator==(const Rational &rhs) const
Equality comparison.
Definition rational.h:102
Rational operator/(const Rational &rhs) const
Divides two rationals.
Definition rational.h:94
Rational operator*(const Rational &rhs) const
Multiplies two rationals.
Definition rational.h:82
bool isValid() const
Returns true if the denominator is non-zero.
Definition rational.h:51
Rational(T n=0, T d=1)
Constructs a rational number.
Definition rational.h:46
T numerator() const
Returns the numerator.
Definition rational.h:112
double toDouble() const
Converts to double.
Definition rational.h:121
bool operator!=(const Rational &rhs) const
Inequality comparison.
Definition rational.h:107
String toString() const
Converts to a String in "num/den" format.
Definition rational.h:127
T denominator() const
Returns the denominator.
Definition rational.h:115
Rational operator-(const Rational &rhs) const
Subtracts two rationals.
Definition rational.h:70
Encoding-aware string class with copy-on-write semantics.
Definition string.h:35
static String dec(const T &val, int padding=0, char padchar=' ')
Formats a value as a decimal string with optional padding.
Definition string.h:167
#define PROMEKI_NAMESPACE_BEGIN
Starts a promeki namespace block.
Definition namespace.h:14
#define PROMEKI_NAMESPACE_END
Ends a promeki namespace block.
Definition namespace.h:19