Browse Source

replace mantis on my

jezv 1 year ago
parent
commit
9363672eef
2 changed files with 11 additions and 22 deletions
  1. 10 21
      Rational.cpp
  2. 1 1
      main_rational.cpp

+ 10 - 21
Rational.cpp

@@ -21,31 +21,20 @@ Rational::Rational(int num1, int num2)
 
 
 Rational::Rational(float x)
 Rational::Rational(float x)
 {
 {
+    const uint32_t bits = *(uint32_t*)(&x);
 
 
-    // First, obtain bitwise representation of the value
-    const uint32_t bitwiseRepr = *reinterpret_cast<uint32_t*>(&x);
+    const uint32_t signBit = bits >> 31;
+    const uint32_t exponentBits = (bits >> 23) & 0xff; 
+    const uint32_t mantisBits = bits & 0x7fffff; 
+    uint32_t significand = (1u << 23u) | mantisBits;
 
 
-        // 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 sign = signBit ? -1 : 1;
 
 
-    const int64_t signFactor = signBit ? -1 : 1;
+    const int32_t exp = exponentBits - 127 - 23;
+    static uint32_t smth = 1 << (uint32_t)(-exp);
 
 
-    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);
+    cout << sign * (int64_t)(significand) << '/' << smth;
+    num = sign * (int64_t)(significand);
     denum = smth;
     denum = smth;
     simple();
     simple();
 }
 }

+ 1 - 1
main_rational.cpp

@@ -10,7 +10,7 @@ int main() {
     Rational r2(3, 727);
     Rational r2(3, 727);
     r += r2;
     r += r2;
     cout << r << endl;
     cout << r << endl;
-    float x = 1.375;
+    float x = float(63)/float(37);
     cout << x << endl;
     cout << x << endl;
     cout << Rational(x);
     cout << Rational(x);
 }
 }