#include #define tabl '\t' class ExpNum { public: short unsigned int mant[30]; char sign; int exp; short unsigned int mant_len; ExpNum(char* exp_str = "+0.0E+0") { sign = *exp_str == '+' ? '+' : '-'; char* exp_ptr = exp_str + 3; mant_len = 0; unsigned int i = 0; while ((*exp_ptr != 'E') && (*exp_ptr != 'e')) { mant[i++] = int(*exp_ptr++) - 48; mant_len++; } for (short int i = mant_len; i < 30;) mant[i++] =0; exp_ptr++; if ('-' == *exp_ptr++) exp = -1; else exp = 1; exp *= int(*exp_ptr++) - 48; while (*exp_ptr != '\0') { exp *= 10; if (exp > 0) exp += int(*exp_ptr++) - 48; else exp -= int(*exp_ptr++) - 48; } Normalize(); } void Normalize() { short unsigned int *p = &mant[29]; short unsigned int mant_tmp[30]; short unsigned int mant_dif = 0; mant_len = 30; while ((!*p--) && (mant_len > 1)) mant_len--; if (mant[0] == 0) { while ((mant[mant_dif] == 0) && (mant_dif < 30)) mant_dif++; if (mant_dif == 30) { exp = 0; mant_len = 0; } else { exp -=mant_dif; mant_len -= mant_dif; for (short int i = 0; i < 30 - mant_dif; i++) mant[i] = mant[i + mant_dif]; for (short int i = 30 - mant_dif; i < 30; i++) mant[i] = 0; } } } }; const ExpNum zero("+0.0E+0"); ostream& operator << (ostream& out,ExpNum b); ExpNum operator >> (istream& in, ExpNum& a); bool operator > (ExpNum a, ExpNum b); bool operator == (ExpNum a, ExpNum b); bool operator < (ExpNum a, ExpNum b); bool operator <= (ExpNum a, ExpNum b); bool operator >= (ExpNum a, ExpNum b); bool operator != (ExpNum a, ExpNum b); ExpNum operator - (ExpNum a, ExpNum b); ExpNum operator -=(ExpNum a, ExpNum b); ExpNum operator +=(ExpNum a, ExpNum b); ExpNum operator /=(ExpNum a, ExpNum b); ExpNum operator + (ExpNum a, ExpNum b); ExpNum operator / (ExpNum a, ExpNum b); ExpNum ABSE(ExpNum a); /*////////////////////////////////////////////////////////////////////////////*/ bool operator < (ExpNum a, ExpNum b) { return !((a == b) || (a > b)); } bool operator <= (ExpNum a, ExpNum b) { return (a < b) || ( a == b); } bool operator >= (ExpNum a, ExpNum b) { return (a > b) || (a == b); } bool operator == (ExpNum a, ExpNum b) { bool l = true; short int i = -1; while ((++i < 29) && l) l = (a.mant[i] == b.mant[i]); return (a.exp == b.exp) && (a.sign == b.sign) && l; } bool operator != (ExpNum a, ExpNum b) { return !(a == b); } bool operator > (ExpNum a, ExpNum b) { bool l; if (a.sign == b.sign) { if (a.exp > b.exp) l = (a.sign == '+'); else { if (a.exp == b.exp) { short int i = 0; while ((i < 30) && (a.mant[i] == b.mant[i])) i++; if (a.mant[i] > b.mant[i]) l = a.sign == '+'; } } } else l = (a.sign == '+'); return l; } ExpNum operator - (ExpNum a, ExpNum b) { ExpNum c; if (a == b) { c.exp = 0; for (short int i = 0 ; i < 30;) c.mant[i++] =0; c.sign = '+'; c.mant_len = 1; } else if (a.sign == b.sign) { if (ABSE(a) < ABSE(b)) { c = b; b = a; a = c; a.sign = '-'; } bool mant_buf = 0; short unsigned int mant_dif = a.exp - b. exp; short int mant_new[31]; for (short int i = 0; i < 30; i) { mant_new[i++] = 0; } if (mant_dif + a.mant_len > 30) mant_buf =1; for (short int i = 29; i >=0;) { mant_new[i] = a.mant[i] - ( (i >= mant_dif ) ? b.mant[i - mant_dif] : 0) - mant_buf; mant_buf = mant_new[i] < 0 ? 1 :0; if (mant_buf) mant_new[i] += 10; i--; } mant_dif = 0; short int *p1 = mant_new; while (!*p1++) { a.exp--; mant_dif++; } delete(p1); for (short int i = 0; i < 29; i ) { c.mant[i] = mant_new[i + mant_dif]; i++; } c.sign = a.sign; c.exp = a.exp; c.mant_len = 30; short unsigned int *p2 = &c.mant[29]; while (!*p2--) c.mant_len--; } else if (a.sign = '+') { b.sign = '+'; c = a + b; } else { b.sign = '-'; c = a + b; } return c; } ExpNum operator + (ExpNum a, ExpNum b) { ExpNum c; if (a.sign == b.sign) { if (b.exp > a.exp) { c = b; b = a; a = c; } short unsigned int mant_new[31]; short unsigned int mant_buf = 0; short unsigned int mant_dif = a.exp - b. exp; for (short int i = 0; i < 31; i++) { mant_new[i] = 0; } for (short int i = 29; i >= mant_dif; i-- ) { mant_buf += a.mant[i] + b.mant[i - mant_dif]; mant_new[ i + 1] = mant_buf % 10; mant_buf /= 10; } for (short int i = mant_dif - 1; i >= 0; i-- ) { mant_buf += a.mant[i]; mant_new[i + 1] = mant_buf % 10; mant_buf /= 10; } if (mant_buf) { mant_new[0] = mant_buf; mant_dif = 0; a.exp++; } else mant_dif = 1; for (short int i = 0; i < mant_dif; i++) mant_new[i] = 0; short unsigned int *p1 = c.mant; short unsigned int *p2 = mant_new + mant_dif; for (short int i = 0; i < 30; i++ ) *p1++ = *p2++; delete(p2); delete (p1); short int i = 29; c.mant_len = 30; while (!c.mant[i--]) c.mant_len--; c.sign = a.sign; c.exp = a.exp; } else if (a.sign == '+') { b.sign = '+'; c = a - b; } else { a.sign = '+'; c = b - a; } return c; } ExpNum operator / (ExpNum a, ExpNum b) { ExpNum c; ExpNum buf = zero; unsigned int a_ct = 0; bool first = 1; short unsigned int *p1; c.mant_len = 0; c.sign = a.sign == b.sign ? '+' : '-'; c.exp = a.exp - b.exp; b.exp = b.mant_len; while ((++c.mant_len < 31) && !((a_ct >= a.mant_len) && (buf == zero))) { buf.Normalize(); while (buf < b) { buf.exp ++; if (buf.mant_len < 30) { if (a_ct < a.mant_len ) buf.mant[buf.mant_len++] = a.mant[a_ct++]; else buf.mant[buf.mant_len++] = 0; } if ((buf < b) && !first) c.mant[c.mant_len++] = 0; } buf.Normalize(); first = 0; while (buf >= b) { buf = buf - b; c.mant[c.mant_len - 1]++; cout << ' '; } buf.Normalize(); } c.Normalize(); return c; } ExpNum operator -=(ExpNum& a, ExpNum b) { a = a - b; return a; } ExpNum operator +=(ExpNum& a, ExpNum b) { a = a + b; return a; } ExpNum operator /=(ExpNum& a, ExpNum b) { a = a / b; return a; } ExpNum operator >> (istream& in, ExpNum& a) { char a_str[41]; in >> a_str; ExpNum c(a_str); a = c; return c; } ostream& operator << (ostream& out,ExpNum a) { out << a.sign << "0."; if (a.mant_len == 0) out << '0'; else for (short unsigned int i = 0; i < a.mant_len;) out << a.mant[i++]; out.setf(ios::showpos); out << "E" << a.exp; return out; out.unsetf(ios::showpos); } ExpNum ABSE(ExpNum a) { a.sign = '+'; return a; }