Rational.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "Rational.h"
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <bitset>
  5. #include <math.h>
  6. using namespace std;
  7. Rational::Rational(){
  8. num = 0;
  9. denum = 1;
  10. }
  11. Rational::Rational(int num1, int num2)
  12. {
  13. num = num1;
  14. denum = num2;
  15. simple();
  16. }
  17. Rational::Rational(float x)
  18. {
  19. const uint32_t bits = *(uint32_t*)(&x);
  20. const uint32_t signBit = bits >> 31;
  21. const uint32_t exponentBits = (bits >> 23) & 0xff;
  22. const uint32_t mantisBits = bits & 0x7fffff;
  23. uint32_t significand = (1u << 23u) | mantisBits;
  24. const int64_t sign = signBit ? -1 : 1;
  25. const int32_t exp = exponentBits - 127 - 23;
  26. static uint32_t smth = 1 << (uint32_t)(-exp);
  27. cout << sign * (int64_t)(significand) << '/' << smth;
  28. num = sign * (int64_t)(significand);
  29. denum = smth;
  30. simple();
  31. }
  32. Rational& Rational::operator += (const Rational& r)
  33. {
  34. int scm = lcm(denum, r.denum);
  35. num = (num * (scm/denum) + r.num * (scm/r.denum));
  36. denum = scm;
  37. return *this;
  38. }
  39. Rational Rational :: operator + (const Rational& r) const
  40. {
  41. Rational res(*this);
  42. return res += r;
  43. }
  44. Rational& Rational::operator -= (const Rational& r)
  45. {
  46. int scm = lcm(denum, r.denum);
  47. num = (num * (scm/denum) - r.num * (scm/r.denum));
  48. denum = scm;
  49. return *this;
  50. }
  51. Rational Rational :: operator - (const Rational& r) const
  52. {
  53. Rational res(*this);
  54. return res -= r;
  55. }
  56. Rational& Rational::operator *= (const Rational& r)
  57. {
  58. num *= r.num;
  59. denum *= r.denum;
  60. simple();
  61. return *this;
  62. }
  63. Rational Rational :: operator * (const Rational& r) const
  64. {
  65. Rational res(*this);
  66. return res *= r;
  67. }
  68. Rational& Rational::operator /= (const Rational& r)
  69. {
  70. num *= r.denum;
  71. denum *= r.num;
  72. simple();
  73. return *this;
  74. }
  75. Rational Rational :: operator / (const Rational& r) const
  76. {
  77. Rational res(*this);
  78. return res /= r;
  79. }
  80. ostream& operator <<(ostream& out, const Rational& r)
  81. {
  82. return out << '(' << r.num << ")/(" << r.denum << ')';
  83. }
  84. Rational::operator double() const
  85. {
  86. return ((double)num/(double)denum);
  87. }
  88. Rational::operator int() const
  89. {
  90. return int(double(*this));
  91. }
  92. int Rational::lcm(long long int num1, long long int num2)
  93. {
  94. int result = 1;
  95. for(int dnum = 2; num1 > 1 or num2 > 1; dnum++)
  96. {
  97. if(num1%dnum==0 or num2%dnum==0)
  98. {
  99. num1%dnum==0 ? num1/=dnum : num1*1;
  100. num2%dnum==0 ? num2/=dnum : num1*1;
  101. result *= dnum;
  102. dnum--;
  103. }
  104. }
  105. return result;
  106. }
  107. int Rational::gcd(long long int num1, long long int num2)
  108. {
  109. while (num1 && num2)
  110. if (num1 >= num2)
  111. num1 %= num2;
  112. else
  113. num2 %= num1;
  114. return num1 | num2;
  115. }
  116. void Rational::simple()
  117. {
  118. int gct = gcd(num, denum);
  119. num /= gct;
  120. denum /= gct;
  121. }