|
@@ -21,31 +21,20 @@ Rational::Rational(int num1, int num2)
|
|
|
|
|
|
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;
|
|
|
simple();
|
|
|
}
|