|
@@ -1,5 +1,8 @@
|
|
#include "Rational.h"
|
|
#include "Rational.h"
|
|
#include <iostream>
|
|
#include <iostream>
|
|
|
|
+#include <iomanip>
|
|
|
|
+#include <bitset>
|
|
|
|
+#include <math.h>
|
|
|
|
|
|
using namespace std;
|
|
using namespace std;
|
|
|
|
|
|
@@ -16,6 +19,37 @@ Rational::Rational(int num1, int num2)
|
|
simple();
|
|
simple();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+Rational::Rational(float x)
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+ // First, obtain bitwise representation of the value
|
|
|
|
+ const uint32_t bitwiseRepr = *reinterpret_cast<uint32_t*>(&x);
|
|
|
|
+
|
|
|
|
+ // Extract sign, exponent and mantissa bits (as stored in memory) for convenience:
|
|
|
|
+ const uint32_t signBit = bitwiseRepr >> 31u;
|
|
|
|
+ const uint32_t expBits = (bitwiseRepr >> 23u) & 0xffu; // 8 bits set
|
|
|
|
+ const uint32_t mntsBits = bitwiseRepr & 0x7fffffu; // 23 bits set
|
|
|
|
+ // mask lowest 23 bits (mantissa)
|
|
|
|
+ uint32_t significand = (1u << 23u) | mntsBits;
|
|
|
|
+
|
|
|
|
+ const int64_t signFactor = signBit ? -1 : 1;
|
|
|
|
+
|
|
|
|
+ const int32_t exp = expBits - 127 - 23;
|
|
|
|
+ static uint32_t smth = 1u << static_cast<uint32_t>(-exp);
|
|
|
|
+
|
|
|
|
+ if(exp < 0)
|
|
|
|
+ {
|
|
|
|
+ cout << signFactor * static_cast<int64_t>(significand) << '/' << smth;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ cout << signFactor * static_cast<int64_t>(significand * smth) << '/' << 1;
|
|
|
|
+ }
|
|
|
|
+ num = signFactor * static_cast<int64_t>(significand);
|
|
|
|
+ denum = smth;
|
|
|
|
+ simple();
|
|
|
|
+}
|
|
|
|
+
|
|
Rational& Rational::operator += (const Rational& r)
|
|
Rational& Rational::operator += (const Rational& r)
|
|
{
|
|
{
|
|
int scm = lcm(denum, r.denum);
|
|
int scm = lcm(denum, r.denum);
|
|
@@ -87,7 +121,7 @@ Rational::operator int() const
|
|
return int(double(*this));
|
|
return int(double(*this));
|
|
}
|
|
}
|
|
|
|
|
|
-int Rational::lcm(int num1, int num2)
|
|
|
|
|
|
+int Rational::lcm(long long int num1, long long int num2)
|
|
{
|
|
{
|
|
int result = 1;
|
|
int result = 1;
|
|
for(int dnum = 2; num1 > 1 or num2 > 1; dnum++)
|
|
for(int dnum = 2; num1 > 1 or num2 > 1; dnum++)
|
|
@@ -103,7 +137,7 @@ int Rational::lcm(int num1, int num2)
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
-int Rational::gcd(int num1, int num2)
|
|
|
|
|
|
+int Rational::gcd(long long int num1, long long int num2)
|
|
{
|
|
{
|
|
while (num1 && num2)
|
|
while (num1 && num2)
|
|
if (num1 >= num2)
|
|
if (num1 >= num2)
|