blob: b36b80876e19cfc1a654ef1cd439793914fb2635 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
#pragma once
namespace NFixedPoint {
template <ui64 FracMult>
class TFixedPoint {
typedef TFixedPoint<FracMult> TSelf;
ui64 Rep;
public:
TFixedPoint()
: Rep()
{
}
template <typename T>
explicit TFixedPoint(T t)
: Rep(ui64(t * FracMult))
{
}
explicit TFixedPoint(ui64 i, ui64 f)
: Rep(i * FracMult + f % FracMult)
{
}
template <typename T>
TSelf& operator=(T t) {
Rep = t * FracMult;
return *this;
}
operator double() const {
return Int() + double(Frac()) / FracMult;
}
operator ui64() const {
return Int();
}
template <typename T>
TSelf& operator/=(T t) {
Rep = ui64(Rep / t);
return *this;
}
template <typename T>
TSelf operator/(T t) const {
TSelf r = *this;
return r /= t;
}
ui64 Frac() const {
return Rep % FracMult;
}
ui64 Int() const {
return Rep / FracMult;
}
static ui64 Mult() {
return FracMult;
}
static TSelf Make(ui64 rep) {
TFixedPoint<FracMult> fp;
fp.Rep = rep;
return fp;
}
};
}
|