示例#1
0
文件: complex.cpp 项目: Riolu/Scheme
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;
}
示例#2
0
文件: complex.cpp 项目: Riolu/Scheme
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;
	}
}
示例#3
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;
    }
}
示例#4
0
Number* Rational::atann()
{
    Float* res = new Float;
    Float* tmp2 = SCAST_FLOAT(res->convert(this));
    res->number_ = atan(tmp2->number_);
    delete tmp2;
    return res;
}
示例#5
0
文件: complex.cpp 项目: Riolu/Scheme
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;
}
示例#6
0
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_));
    }
}
示例#7
0
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))));
    }
}
示例#8
0
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;
    }
}
示例#9
0
文件: complex.cpp 项目: Riolu/Scheme
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;
}
示例#10
0
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;
    }
}
示例#11
0
文件: complex.cpp 项目: Riolu/Scheme
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;
}
示例#12
0
文件: complex.cpp 项目: Riolu/Scheme
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;
}
示例#13
0
文件: complex.cpp 项目: Riolu/Scheme
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;
}
示例#14
0
Number* Rational::exttoinext()
{
    Float* res = new Float;
    return res->convert(this);
}
示例#15
0
Number* Rational::expe()
{
    Float* tmpf = new Float;
    tmpf = SCAST_FLOAT(tmpf->convert(this));
    return new Float(exp(tmpf->number_));
}