Number *Complex::expt(Number *number2){ Complex *tmp = SCAST_COMPLEX(number2); Float *f = new Float(); Float *real1 =SCAST_FLOAT(f->convert(real_)); Float *imag1 = SCAST_FLOAT(f->convert(imag_)); Float *real2 = SCAST_FLOAT(f->convert(tmp->real_)); Float *imag2 = SCAST_FLOAT(f->convert(tmp->imag_)); complex<double> a(real1->number_, imag1->number_), b(real2->number_, imag2->number_); complex<double> res = pow(a, b); Float *real = new Float(res.real()), *imag = new Float(res.imag()); if (real->number_ == -0) real->number_ = 0; Complex *result = new Complex(real, imag); delete f, real1, imag1, real2, imag2, real, imag; return result; }
Complex::Complex(string real, string imag) { type_ = COMPLEX; const char* real2(real.c_str()); const char* imag2(imag.c_str()); Float *f = new Float(); real_ = Rational::from_string(real2); imag_ = Rational::from_string(imag2); if (!real_ || !imag_){ if (!imag_) imag_ = Float::from_string(imag2); else imag_ = f->convert(imag_); if (!real_) real_ = Float::from_string(real2); else real_ = f->convert(real_); if (!real_ || !imag_) throw 0; } }
Number* Rational::acoss() { Float* res = new Float; Float* tmp = SCAST_FLOAT(res->convert(this)); if (fabs(tmp->number_)<=1.0) { res->number_=asin(tmp->number_); delete tmp; return res; } else if (tmp->number_>0) { complex<double> c_a(tmp->number_,0.0); complex<double> c_res = asin(c_a); Complex* res = new Complex; res->exact_ = false; res->real_ = new Float(::real(c_res)); res->imag_ = new Float(::imag(c_res)); delete tmp; return res; } else { complex<double> c_a(fabs(tmp->number_),0.0); complex<double> c_res = asin(c_a); Complex* res = new Complex; res->exact_ = false; res->real_ = new Float(::real(c_res)+PI); res->imag_ = new Float(0.0-::imag(c_res)); delete tmp; return res; } }
Number* Rational::atann() { Float* res = new Float; Float* tmp2 = SCAST_FLOAT(res->convert(this)); res->number_ = atan(tmp2->number_); delete tmp2; return res; }
Number *Complex::ang(){ Float *f = new Float(); Float *real1 = SCAST_FLOAT(f->convert(real_)); Float *imag1 = SCAST_FLOAT(f->convert(imag_)); complex<double> a(real1->number_, imag1->number_); Float *result = new Float(arg(a)); delete f, real1, imag1; return result; }
Number* Rational::expp(Number* number2) { Rational* rtmp2 = SCAST_RATIONAL(number2); if (num_==ZERO_ && rtmp2->num_==ZERO_) return new Float(1); else if (num_==ZERO_ && rtmp2->num_!=ZERO_) return new Float(0); if(num_.sgn_) { Complex* c = new Complex; c = SCAST_COMPLEX(c->convert(this)); Complex* d = SCAST_COMPLEX(c->convert(rtmp2)); return c->expp(d); } else { Float* tmpf = new Float; tmpf = SCAST_FLOAT(tmpf->convert(rtmp2)); return new Float(pow(SCAST_FLOAT(tmpf->convert(this))->number_, tmpf->number_)); } }
Number* Rational::expt(Number* obj){ if(sgn()<0){ Complex* c = new Complex(); c = SCAST_COMPLEX(c->convert(this)); Complex* d = SCAST_COMPLEX(c->convert(obj)); return c->expt(d); }else{ Float* tmpf = new Float(); tmpf = SCAST_FLOAT(tmpf->convert(obj)); return new Float(pow(double(*this), double(*SCAST_RATIONAL(obj)))); } }
Number* Rational::sqt() { if (!num_.sgn_) return new Float(sqrt((double)num_/(double)den_)); else { Complex* resc = new Complex; Float* real = new Float(0.0); Float* imag = new Float(sqrt(fabs(SCAST_FLOAT(real->convert(this))->number_))); resc->real_ = real; resc->imag_ = imag; resc->exact_=false; return resc; } }
Number *Complex::logx(){ Float *f = new Float(); Float *real1 = SCAST_FLOAT(f->convert(real_)); Float *imag1 = SCAST_FLOAT(f->convert(imag_)); complex<double> a(real1->number_, imag1->number_); complex<double> res = log(a); Float *real = new Float(res.real()), *imag = new Float(res.imag()); if (real->number_ == -0) real->number_ = 0; Complex *result = new Complex(real, imag); delete f, real1, imag1, real, imag; return result; }
Number* Rational::logg() { assert(num_!=ZERO_ && "undefined log0"); if (!num_.sgn_) { Float* tmpf = new Float; tmpf = SCAST_FLOAT(tmpf->convert(this)); return new Float(log(tmpf->number_)); } else { Float* tmp = new Float; tmp = SCAST_FLOAT(tmp->convert(this)); complex<double> c_x(tmp->number_,0.0); complex<double> c_res = log(c_x); Complex* res = new Complex; res->exact_ = false; res->real_ = new Float(::real(c_res)); res->imag_ = new Float(::imag(c_res)); delete tmp; return res; } }
Number *Complex::acosx(){ Float *f = new Float(); Float *real1 = SCAST_FLOAT(f->convert(real_)); Float *imag1 = SCAST_FLOAT(f->convert(imag_)); complex<double> a(real1->number_, imag1->number_); complex<double> res = acos(a); Float *real = new Float(res.real()), *imag = new Float(res.imag()); if (real->number_ == -0) real->number_ = 0; Complex *result = new Complex(real, imag); delete f, real1, imag1, real, imag; return result; // Complex *arcsin = SCAST_COMPLEX(this->asinx()); // Complex *halfpi = new Complex("1.57079632679489661923", "0"); // Complex *result = SCAST_COMPLEX(halfpi->sub(arcsin)); // delete arcsin, halfpi; // return result; }
Number *Complex::atanx(){ Float *f = new Float(); Float *real1 = SCAST_FLOAT(f->convert(real_)); Float *imag1 = SCAST_FLOAT(f->convert(imag_)); complex<double> a(real1->number_, imag1->number_); complex<double> res = atan(a); Float *real = new Float(res.real()), *imag = new Float(res.imag()); if (real->number_ == -0) real->number_ = 0; Complex *result = new Complex(real, imag); delete f, real1, imag1, real, imag; return result; // complex<double> i(0,1), one(1,0), two(2,0); // complex<double> res = (log(one + i*a) - log(one - i*a)) / (two*i); // Float *real = new Float(res.real()), *imag = new Float(res.imag()); // if (real->number_ == -0) real->number_ = 0; // Complex *result = new Complex(real, imag); // delete f, real1, imag1, real, imag; // return result; }
Number *Complex::asinx(){ Float *f = new Float(); Float *real1 = SCAST_FLOAT(f->convert(real_)); Float *imag1 = SCAST_FLOAT(f->convert(imag_)); complex<double> a(real1->number_, imag1->number_); complex<double> res = asin(a); Float *real = new Float(res.real()), *imag = new Float(res.imag()); if (real->number_ == -0) real->number_ = 0; Complex *result = new Complex(real, imag); delete f, real1, imag1, real, imag; return result; // complex<double> i(0, 1), one(1, 0); // complex<double> res = (-i)*log(i*a + sqrt(one - pow(a, 2))); // Float *real = new Float(res.real()), *imag = new Float(res.imag()); // if (real->number_ == -0) real->number_ = 0; // Complex *result = new Complex(real, imag); // delete f, real1, imag1, real, imag; // return result; }
Number* Rational::exttoinext() { Float* res = new Float; return res->convert(this); }
Number* Rational::expe() { Float* tmpf = new Float; tmpf = SCAST_FLOAT(tmpf->convert(this)); return new Float(exp(tmpf->number_)); }