jezv год назад
Родитель
Сommit
55c533d400
5 измененных файлов с 50 добавлено и 6 удалено
  1. 1 1
      Fraction
  2. 36 2
      Rational.cpp
  3. 3 2
      Rational.h
  4. 4 1
      main_rational.cpp
  5. 6 0
      makefile

+ 1 - 1
Fraction

@@ -1 +1 @@
-Subproject commit 9eb9e98cd9035b69380c59263ec3a14fc5a6742e
+Subproject commit 55f59015aa913505d168b191f32e1ee803c4d9bb

+ 36 - 2
Rational.cpp

@@ -1,5 +1,8 @@
 #include "Rational.h"
 #include <iostream>
+#include <iomanip>
+#include <bitset>
+#include <math.h>
 
 using namespace std;
 
@@ -16,6 +19,37 @@ Rational::Rational(int num1, int num2)
     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)
 {
     int scm = lcm(denum, r.denum);
@@ -87,7 +121,7 @@ Rational::operator int() const
     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;
     for(int dnum = 2; num1 > 1 or num2 > 1; dnum++)
@@ -103,7 +137,7 @@ int Rational::lcm(int num1, int num2)
     return result;
 }
 
-int Rational::gcd(int num1, int num2)
+int Rational::gcd(long long int num1, long long int num2)
 {
     while (num1 && num2)
         if (num1 >= num2)

+ 3 - 2
Rational.h

@@ -12,6 +12,7 @@ public:
     int denum;
 
     Rational();
+    Rational(float num);
     Rational(int num1, int num2);
 
     Rational& operator *=(const Rational& r);
@@ -32,9 +33,9 @@ private:
     // упрощение самого себя
     void simple();
     // НОК
-    int lcm(int num1, int num2);
+    int lcm(long long int num1, long long int num2);
     // НОД
-    int gcd(int num1, int num2);
+    int gcd(long long int num1, long long int num2);
 };
 
 #endif

+ 4 - 1
main_rational.cpp

@@ -9,5 +9,8 @@ int main() {
     cout << r << endl;
     Rational r2(3, 727);
     r += r2;
-    cout << r;
+    cout << r << endl;
+    float x = 1.375;
+    cout << x << endl;
+    cout << Rational(x);
 }

+ 6 - 0
makefile

@@ -4,6 +4,9 @@ all: Fractional.o Rational.o main_rational.o
 main: Rational.o main_rational.o
 	g++ Rational.o main_rational.o
 
+mainf: Rational.o Fractional.o main_fractional.o
+	g++ Rational.o Fractional.o main_fractional.o
+
 Fractional.o: main_rational.cpp
 	g++ -c Fraction/Fractional.cpp
 
@@ -13,6 +16,9 @@ Rational.o: main_rational.cpp
 main_rational.o: main_rational.cpp
 	g++ -c main_rational.cpp
 
+main_fractional.o: Fraction/main_fractional.cpp
+	g++ -c Fraction/main_fractional.cpp
+
 clean:
 	rm -rf *.o all