Browse Source

Перевод из double

miket 11 months ago
parent
commit
cfea5b2dc9
3 changed files with 62 additions and 25 deletions
  1. 28 16
      Rational/Rational.cpp
  2. 2 2
      Rational/Rational.h
  3. 32 7
      Rational/Rational_numbers.cpp

+ 28 - 16
Rational/Rational.cpp

@@ -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++) {

+ 2 - 2
Rational/Rational.h

@@ -5,8 +5,8 @@ using namespace std;
 
 class Rational {
 public:
-    int Chisl;
-    int Znam;
+    long long Chisl;
+    long long Znam;
     bool sign=0;
     Rational();
     Rational(int _x, int _y);

+ 32 - 7
Rational/Rational_numbers.cpp

@@ -12,14 +12,18 @@ void resh(Rational, Rational, Rational);
 void check();
 
 int main() {
-    check();
+    Rational r = Rational(5.0/2.0),r2=Rational(3,6);
+    cout << r2 << endl;
+    cout << r << endl;
+    //check();
+
     //сделаны основные операции (минимум, который сдаётся до пятницы). К сожалению пока немного в тупике с решением. т.к. не знаю как перевести double
-    resh(Rational(2, 3), Rational(-1, 3), Rational(-1, 3));
-    Rational a, b, c;
-    cout << "enter a=... b=... c=... \n";
-    cin >> a >> b >> c;
-    resh(a, b, c);
-    
+    //resh(Rational(2, 3), Rational(-1, 3), Rational(-1, 3));
+    //Rational a, b, c;
+    //cout << "enter a=... b=... c=... \n";
+    //cin >> a >> b >> c;
+    //resh(a, b, c);
+    //
 }
 
 
@@ -124,3 +128,24 @@ void resh(Rational a, Rational b, Rational c) {
     
 }
 
+
+
+//void main() {
+//	double a = 1.616161;
+//	a = 12.0 / 5.0;
+//	//0x10000000000000
+//	unsigned long long int bits = *(unsigned long long int*)(&a);
+//	bool 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;
+//	num = sign ? mant : mant;
+//	denum = ((long long)2 << -exp);
+//	cout << a << '\t' << num << '\t' << denum << endl;
+//}