Cpp Utilities 1.2.3
Ratios.hpp
Go to the documentation of this file.
1#ifndef CPP_UTILITIES_DIMENSIONALANALYSIS_RATIO_HPP
2#define CPP_UTILITIES_DIMENSIONALANALYSIS_RATIO_HPP
3
4#include <utility>
5#include <cstdint>
6#include <cmath>
7#include "../Common.h"
8
10
15namespace Dimensional {
25inline std::pair<intmax_t, intmax_t> approximateRatio(long double value, int n)
26{
27 // Modulo operation for floating point
28 auto mod = [](long double a, long double b) -> long double {
29 while (a >= b) a -= b;
30 return a;
31 };
32 // Greatest common divider for floating point
33 auto gcd = [mod](long double x, long double y)
34 -> std::pair<long double, long double> {
35 long double a = x;
36 long double b = y;
37 long double c = mod(a, b);
38 while (int(c) != 0)
39 {
40 a = b;
41 b = c;
42 c = mod(a, b);
43 }
44 return std::make_pair(x / b, y / b);
45 };
46 long double den = std::pow(static_cast<long double>(10), n);
47 long double num = value * std::pow(static_cast<long double>(10), n);
48 std::pair<long double, long double> pair = gcd(num, den);
49 return std::make_pair(intmax_t(std::round(pair.first)),
50 intmax_t(std::round(pair.second)));
51}
52
53} // namespace dimensional
57
58#endif // CPP_UTILITIES_DIMENSIONALANALYSIS_RATIO_HPP
#define UTILITIES_NAMESPACE_END
Define for end namespace declaration, nothing will be generated if UTILITIES_NAMESPACE isn't defined.
Definition: Common.h:92
#define UTILITIES_NAMESPACE_BEGIN
Define for begin namespace declaration, nothing will be generated if UTILITIES_NAMESPACE isn't define...
Definition: Common.h:91
Namespace for all classes, typedefs and functions of dimensional analyse. See Dimensional Analysis fo...
std::pair< intmax_t, intmax_t > approximateRatio(long double value, int n)
Calculate approximate fraction from input decimal.
Definition: Ratios.hpp:25