|
@@ -41,10 +41,21 @@ Rational::Rational(int _x, int _y) {
|
|
|
}
|
|
|
|
|
|
Rational::Rational(double _x) {
|
|
|
- sign = _x < 0;
|
|
|
- int dec = 1000000;
|
|
|
- Chisl = dec * _x;
|
|
|
- Znam = dec;
|
|
|
+
|
|
|
+ //0x10000000000000
|
|
|
+ unsigned long long int bits = *(unsigned long long int*)(&_x);
|
|
|
+ sign = bits >> 63;
|
|
|
+ long long int mant = (bits & 0xFFFFFFFFFFFFF) | 0x10000000000000;
|
|
|
+ long long exp = (bits >> 52) & 0x7ff;
|
|
|
+ exp -= 1075;
|
|
|
+
|
|
|
+ //cout << hex << sign << '\t' << hex << mant << '\t' << hex << exp << '\t' << dec << bits << '\t' << hex << bits << '\n';
|
|
|
+
|
|
|
+ long long t = ((long long int)1 << 52);
|
|
|
+ //cout <<hex << t;
|
|
|
+ long long num, denum;
|
|
|
+ Chisl = mant;
|
|
|
+ Znam = (pow(2,-exp));
|
|
|
socr();
|
|
|
}
|
|
|
|
|
@@ -55,19 +66,20 @@ Rational::socr() {
|
|
|
sign = (!((Chisl >= 0 && Znam >= 0) || (Chisl < 0 && Znam < 0)))||sign;
|
|
|
Chisl = Chisl >= 0 ? Chisl : -Chisl;
|
|
|
Znam = Znam >= 0 ? Znam : -Znam;
|
|
|
- int a, b;
|
|
|
+ long long a, b,zero=0;
|
|
|
a = Chisl;
|
|
|
b = Znam;
|
|
|
+
|
|
|
int end = 0;
|
|
|
- while (a != 0 && b != 0 && end!=100000) {
|
|
|
- end++;
|
|
|
+ while (a != zero && b != zero && end!= INT_MAX) {
|
|
|
+ //end++;
|
|
|
if (a > b) {
|
|
|
a %= b;
|
|
|
}
|
|
|
else
|
|
|
b %= a;
|
|
|
}
|
|
|
- if (end != 100000) {
|
|
|
+ if (end != INT_MAX) {
|
|
|
Chisl /= (a + b);
|
|
|
Znam /= (a + b);
|
|
|
}
|
|
@@ -84,8 +96,8 @@ Rational::root() {
|
|
|
//îïåðàòîðû ôîðìàòà *=
|
|
|
const Rational&
|
|
|
Rational::operator += (const Rational& r) {
|
|
|
- int obsh_znam = Znam * r.Znam;
|
|
|
- int mod1, mod2;
|
|
|
+ long long obsh_znam = Znam * r.Znam;
|
|
|
+ long long mod1, mod2;
|
|
|
mod1 = sign ? -1 : 1;
|
|
|
mod2 = r.sign ? -1 : 1;
|
|
|
Chisl = Chisl * r.Znam * mod1 + r.Chisl * Znam * mod2;
|
|
@@ -101,8 +113,8 @@ Rational::operator += (const Rational& r) {
|
|
|
|
|
|
const Rational&
|
|
|
Rational::operator -= (const Rational& r) {
|
|
|
- int obsh_znam = Znam * r.Znam;
|
|
|
- int mod1, mod2;
|
|
|
+ long long obsh_znam = Znam * r.Znam;
|
|
|
+ long long mod1, mod2;
|
|
|
mod1 = sign ? -1 : 1;
|
|
|
mod2 = r.sign ? -1 : 1;
|
|
|
Chisl = Chisl * r.Znam * mod1 - r.Chisl * Znam * mod2;
|
|
@@ -156,7 +168,7 @@ Rational::operator > (const Rational& r) {
|
|
|
Rational r2 = r;
|
|
|
r1.Chisl *= r2.Znam;
|
|
|
r2.Chisl *= r1.Znam;
|
|
|
- return r1.Chisl > r2.Chisl;
|
|
|
+ return r1.Chisl > r2.Chisl;
|
|
|
}
|
|
|
|
|
|
const bool&
|
|
@@ -278,7 +290,7 @@ const Rational&
|
|
|
Rational::operator - (const int& i) {
|
|
|
Rational res = *this;
|
|
|
res -= i;
|
|
|
- return res;
|
|
|
+ return res;
|
|
|
}
|
|
|
|
|
|
const Rational&
|
|
@@ -293,7 +305,7 @@ Rational::operator / (const int& i) {
|
|
|
|
|
|
istream&
|
|
|
operator >>(istream& is, Rational& r) {
|
|
|
- char input[100];
|
|
|
+ char input[10000];
|
|
|
r.Chisl = 0;
|
|
|
r.Znam = 1;
|
|
|
r.sign = false;
|
|
@@ -335,7 +347,7 @@ operator >>(istream& is, Rational& r) {
|
|
|
ostream&
|
|
|
operator <<(ostream& os, Rational& r) {
|
|
|
if (r.Chisl % r.Znam == 0)
|
|
|
- return os << "\n " << r.Chisl / r.Znam << "\n";
|
|
|
+ return os << "\n " << r.Chisl << '/' << r.Znam << "\n";
|
|
|
|
|
|
double len_max = log10((double)max(r.Chisl, r.Znam));
|
|
|
for (int i = 0; i < (int)(len_max - log10(r.Chisl)) / 2; i++) {
|