Incremental Engine  1.0.6
A 2D Game Engine to create Idle Games
IncrementalEngine::KmbNumber Class Reference

#include <KmbNumber.h>

Public Member Functions

 KmbNumber ()
 
 KmbNumber (const KmbNumber &kmbNumber)
 
 KmbNumber (float firstDigits, float trailing, int exponent)
 
 KmbNumber (float number, int exponent=0)
 
std::wstring ToString ()
 
bool Equals (KmbNumber &other)
 
float GetRawNumber ()
 
float GetInt ()
 
void Refactor (float value, int exponent)
 
void Refactor ()
 
void Add (KmbNumber adder)
 
void Subtract (KmbNumber subtractor)
 
void Multiply (KmbNumber multiplier)
 
void Divide (KmbNumber divider)
 
void operator= (float number1)
 
void operator= (KmbNumber &number1)
 

Static Public Member Functions

static void RoundUp (KmbNumber &number)
 

Public Attributes

float FirstDigits = 0
 
float TrailingPercentage = 0
 
int Exponent = 0
 
std::wstring Suffix = L" "
 

Static Public Attributes

static KmbNumber Zero = KmbNumber(0, 0, 0)
 

Private Member Functions

void SetSuffix ()
 
float GetStringTrailingPercentage ()
 

Detailed Description

Definition at line 9 of file KmbNumber.h.

Constructor & Destructor Documentation

◆ KmbNumber() [1/4]

IncrementalEngine::KmbNumber::KmbNumber ( )

Definition at line 9 of file KmbNumber.cpp.

10  {
11  FirstDigits = 0;
13  Exponent = 0;
14  }

◆ KmbNumber() [2/4]

IncrementalEngine::KmbNumber::KmbNumber ( const KmbNumber kmbNumber)

Definition at line 16 of file KmbNumber.cpp.

17  {
18  FirstDigits = kmbNumber.FirstDigits;
19  TrailingPercentage = kmbNumber.TrailingPercentage;
20  Exponent = kmbNumber.Exponent;
21  }

◆ KmbNumber() [3/4]

IncrementalEngine::KmbNumber::KmbNumber ( float  firstDigits,
float  trailing,
int  exponent 
)

Definition at line 23 of file KmbNumber.cpp.

24  {
25  FirstDigits = firstDigits;
26  TrailingPercentage = trailing;
27  Exponent = exponent;
28  }

◆ KmbNumber() [4/4]

IncrementalEngine::KmbNumber::KmbNumber ( float  number,
int  exponent = 0 
)

Definition at line 30 of file KmbNumber.cpp.

31  {
32  Refactor(number, exponent);
33  }

Member Function Documentation

◆ Add()

void IncrementalEngine::KmbNumber::Add ( KmbNumber  adder)

Definition at line 157 of file KmbNumber.cpp.

158  {
159  if (adder.Exponent == Exponent)
160  {
161  FirstDigits += adder.FirstDigits;
162  TrailingPercentage += adder.TrailingPercentage;
163  Refactor();
164  return;
165  }
166 
167  if (Exponent > adder.Exponent)
168  {
169  TrailingPercentage += adder.FirstDigits * (float)(std::pow(10, -(Exponent - adder.Exponent)));
170  Refactor();
171  return;
172  }
173 
174  if (adder.Exponent > Exponent)
175  {
176  adder.TrailingPercentage += FirstDigits * (float)(std::pow(10, -(adder.Exponent - Exponent)));
177 
178  FirstDigits = adder.FirstDigits;
179  TrailingPercentage = adder.TrailingPercentage;
180  Exponent = adder.Exponent;
181 
182  Refactor();
183  return;
184  }
185  }

◆ Divide()

void IncrementalEngine::KmbNumber::Divide ( KmbNumber  divider)

Definition at line 222 of file KmbNumber.cpp.

223  {
224  auto firstNumber = FirstDigits + TrailingPercentage;
225  auto secondNumber = divider.FirstDigits + divider.TrailingPercentage;
226 
227  if (secondNumber != 0)
228  {
229  auto resultFloat = firstNumber / secondNumber;
230  auto resultExponents = Exponent - divider.Exponent;
231 
232  Refactor(resultFloat, resultExponents);
233  }
234  }

◆ Equals()

bool IncrementalEngine::KmbNumber::Equals ( KmbNumber other)

Definition at line 236 of file KmbNumber.cpp.

237  {
238  float trailingDiff = std::abs(TrailingPercentage - other.TrailingPercentage);
239  bool isTralingEqual = trailingDiff > std::numeric_limits<float>::epsilon() && trailingDiff < 0.000000001f;
240 
241  if (trailingDiff == 0)
242  {
243  isTralingEqual = true;
244  }
245 
246  return Exponent == other.Exponent && isTralingEqual && FirstDigits == other.FirstDigits && Suffix == other.Suffix;
247  }

◆ GetInt()

float IncrementalEngine::KmbNumber::GetInt ( )

Definition at line 83 of file KmbNumber.cpp.

84  {
85  return ((int)FirstDigits) *
86  ((int)std::pow(10, Exponent)) +
87  ((int)TrailingPercentage) *
88  ((int)std::pow(10, Exponent));
89  }

◆ GetRawNumber()

float IncrementalEngine::KmbNumber::GetRawNumber ( )

Definition at line 78 of file KmbNumber.cpp.

79  {
81  }

◆ GetStringTrailingPercentage()

float IncrementalEngine::KmbNumber::GetStringTrailingPercentage ( )
private

Definition at line 70 of file KmbNumber.cpp.

71  {
72  auto trailingPercentage1000 = (FirstDigits + TrailingPercentage) * 1000.0f;
73  trailingPercentage1000 = std::floor(trailingPercentage1000);
74  auto trailingPercentage = trailingPercentage1000 / 1000;
75  return trailingPercentage;
76  }

◆ Multiply()

void IncrementalEngine::KmbNumber::Multiply ( KmbNumber  multiplier)

Definition at line 212 of file KmbNumber.cpp.

213  {
214  auto firstNumber = FirstDigits + TrailingPercentage;
215  auto secondNumber = multiplier.FirstDigits + multiplier.TrailingPercentage;
216  auto resultFloat = firstNumber * secondNumber;
217  auto resultExponents = Exponent + multiplier.Exponent;
218 
219  Refactor(resultFloat, resultExponents);
220  }

◆ operator=() [1/2]

void IncrementalEngine::KmbNumber::operator= ( float  number1)

Definition at line 249 of file KmbNumber.cpp.

250  {
251  Refactor(number1, 0);
252  }

◆ operator=() [2/2]

void IncrementalEngine::KmbNumber::operator= ( KmbNumber number1)

Definition at line 254 of file KmbNumber.cpp.

255  {
256  FirstDigits = number1.FirstDigits;
257  TrailingPercentage = number1.TrailingPercentage;
258  Exponent = number1.Exponent;
259 
260  Refactor();
261  }

◆ Refactor() [1/2]

void IncrementalEngine::KmbNumber::Refactor ( )

Definition at line 114 of file KmbNumber.cpp.

115  {
116  while (TrailingPercentage < 0)
117  {
119  FirstDigits -= 1;
120  }
121 
122  while (TrailingPercentage >= 1)
123  {
124  TrailingPercentage -= 1;
125  FirstDigits++;
126  }
127 
128  while (FirstDigits > 999)
129  {
130  TrailingPercentage = (TrailingPercentage / 1000) + std::fmod(FirstDigits, 1000) / 1000;
131  FirstDigits /= 1000;
132 
133  auto a = std::trunc(FirstDigits);
134  FirstDigits = (float)a;
135  Exponent += 3;
136  }
137 
138  if (FirstDigits < 1 && FirstDigits >= 0 && Exponent > 0)
139  {
140  if (FirstDigits == 0 && TrailingPercentage == 0)
141  {
142  Exponent = 1;
143  return;
144  }
145 
147  Exponent -= 3;
148  Refactor();
149  }
150 
151  if (TrailingPercentage >= 1)
152  {
153  Refactor();
154  }
155  }

◆ Refactor() [2/2]

void IncrementalEngine::KmbNumber::Refactor ( float  value,
int  exponent 
)

Definition at line 103 of file KmbNumber.cpp.

104  {
105  auto trail = std::fmod(value, 1);
106 
107  FirstDigits = value - trail;
108  TrailingPercentage = trail;
109  Exponent = exponent;
110 
111  Refactor();
112  }

◆ RoundUp()

void IncrementalEngine::KmbNumber::RoundUp ( KmbNumber number)
static

Definition at line 35 of file KmbNumber.cpp.

36  {
37  if (number.TrailingPercentage > 0)
38  {
39  number.TrailingPercentage = (float)(std::round(number.TrailingPercentage * std::pow(10, 2))) / std::pow(10, 2);
40  number.FirstDigits += 1;
41  }
42  }

◆ SetSuffix()

void IncrementalEngine::KmbNumber::SetSuffix ( )
private

Definition at line 91 of file KmbNumber.cpp.

92  {
93  std::wstring suffixArray[] = SUFFIX;
94  for (int i = 0; i < sizeof(suffixArray) / sizeof(suffixArray[0]); i++)
95  {
96  if (Exponent / 3 == i)
97  {
98  Suffix = suffixArray[i];
99  }
100  }
101  }

◆ Subtract()

void IncrementalEngine::KmbNumber::Subtract ( KmbNumber  subtractor)

Definition at line 187 of file KmbNumber.cpp.

188  {
189  if (Exponent == subtractor.Exponent)
190  {
191  FirstDigits -= subtractor.FirstDigits;
192  TrailingPercentage -= subtractor.TrailingPercentage;
193  Refactor();
194  return;
195  }
196 
197  auto exponentDif = Exponent - subtractor.Exponent;
198 
199  auto value1 = FirstDigits + TrailingPercentage;
200  auto value2 = subtractor.FirstDigits + subtractor.TrailingPercentage;
201 
202  if (exponentDif > MAXFLOATEXPONENT)
203  {
204  Refactor();
205  return;
206  }
207 
208  value1 *= (float)(std::pow(10, exponentDif));
209  Refactor(value1 - value2, Exponent - exponentDif);
210  }

◆ ToString()

std::wstring IncrementalEngine::KmbNumber::ToString ( )

Definition at line 44 of file KmbNumber.cpp.

45  {
46  SetSuffix();
47 
48  if (FirstDigits == 0)
49  {
50  if (GetStringTrailingPercentage() == 0)
51  {
52  return L"0" + Suffix;
53  }
54 
55  std::wstringstream stream;
56  stream << std::fixed << std::setprecision(DECIMALS_TO_SHOW) << GetStringTrailingPercentage();
57  return stream.str() + Suffix;
58  }
59 
60  if (Exponent == 0)
61  {
62  return std::to_wstring((int)FirstDigits);
63  }
64 
65  std::wstringstream stream;
66  stream << std::fixed << std::setprecision(DECIMALS_TO_SHOW) << GetStringTrailingPercentage();
67  return stream.str() + Suffix;
68  }

Member Data Documentation

◆ Exponent

int IncrementalEngine::KmbNumber::Exponent = 0

Definition at line 24 of file KmbNumber.h.

◆ FirstDigits

float IncrementalEngine::KmbNumber::FirstDigits = 0

Definition at line 22 of file KmbNumber.h.

◆ Suffix

std::wstring IncrementalEngine::KmbNumber::Suffix = L" "

Definition at line 26 of file KmbNumber.h.

◆ TrailingPercentage

float IncrementalEngine::KmbNumber::TrailingPercentage = 0

Definition at line 23 of file KmbNumber.h.

◆ Zero

KmbNumber IncrementalEngine::KmbNumber::Zero = KmbNumber(0, 0, 0)
static

Definition at line 20 of file KmbNumber.h.

IncrementalEngine::KmbNumber::Suffix
std::wstring Suffix
Definition: KmbNumber.h:26
IncrementalEngine::KmbNumber::GetStringTrailingPercentage
float GetStringTrailingPercentage()
Definition: KmbNumber.cpp:70
IncrementalEngine::KmbNumber::Exponent
int Exponent
Definition: KmbNumber.h:24
IncrementalEngine::KmbNumber::SetSuffix
void SetSuffix()
Definition: KmbNumber.cpp:91
IncrementalEngine::KmbNumber::FirstDigits
float FirstDigits
Definition: KmbNumber.h:22
IncrementalEngine::KmbNumber::TrailingPercentage
float TrailingPercentage
Definition: KmbNumber.h:23
IncrementalEngine::KmbNumber::Refactor
void Refactor()
Definition: KmbNumber.cpp:114