proj home

Files   Classes   Functions   Hierarchy  

rpnpow Class Reference

#include <mathfunc.h>

Inheritance diagram for rpnpow:
Collaboration diagram for rpnpow:

List of all members.

Public Member Functions

 rpnpow ()
 rpnpow (deque< rpnbase * > &ds, bool const evaluate=true)
 ~rpnpow ()
rpnbasecopy () const
void visit (deque< rpnbase * > &ds, rpninteger &n)
void visit (deque< rpnbase * > &ds, rpnreal &n)
void visit (deque< rpnbase * > &ds, rpncomplex &n)
string const name () const
void eval (deque< rpnbase * > &ds)


Detailed Description

Definition at line 560 of file mathfunc.h.


Constructor & Destructor Documentation

rpnpow::rpnpow (  )  [inline]

Definition at line 564 of file mathfunc.h.

Referenced by copy().

00564 {}

rpnpow::rpnpow ( deque< rpnbase * > &  ds,
bool const   evaluate = true 
)

Definition at line 95 of file mathfunc.cpp.

References eval().

00096 {
00097   if (evaluate)
00098     eval(ds);
00099   else
00100     ds.push_front(this);
00101 }

rpnpow::~rpnpow (  )  [inline]

Definition at line 566 of file mathfunc.h.

00566 {}


Member Function Documentation

rpnbase * rpnpow::copy (  )  const [virtual]

Reimplemented from rpnfunction.

Definition at line 103 of file mathfunc.cpp.

References rpnpow().

00104 {
00105   return new rpnpow();
00106 }

void rpnpow::eval ( deque< rpnbase * > &  ds  )  [virtual]

Reimplemented from rpnfunction.

Definition at line 108 of file mathfunc.cpp.

References rpnbase::accept(), and rpnbase::dec().

Referenced by rpnpow().

00109 {
00110   if (ds.size()>1)
00111     ds[0]->accept(ds,*this);
00112 
00113   dec();
00114 }

string const rpnpow::name (  )  const [inline, virtual]

Reimplemented from rpnfunction.

Definition at line 573 of file mathfunc.h.

00573 { return string("^"); }

void rpnpow::visit ( deque< rpnbase * > &  ds,
rpncomplex n 
) [virtual]

Reimplemented from rpnfunction.

Definition at line 190 of file mathfunc.cpp.

References rpnbase::dec(), rpnbase::iscomplex(), rpnbase::isinteger(), rpnbase::isreal(), and rpncomplex::num.

00191 {
00192   rpnbase* x0 = ds.front();
00193   ds.pop_front();
00194   rpnbase* x1 =ds.front();
00195   if (x1->iscomplex())
00196   {
00197     ((rpncomplex*)x1)->num = pow( ((rpncomplex*)x1)->num,n.num );
00198     x0->dec();
00199     return;
00200   }
00201   else
00202   if (x1->isreal())
00203   {
00204     ds.pop_front();
00205     ds.push_front(x0);
00206     complex< long double > n2( ((rpnreal*)x1)->num, 0.0);
00207     n.num = pow(n2,n.num);
00208     x1->dec();
00209     return;
00210   }
00211   else
00212   if (x1->isinteger())
00213   {
00214     ds.pop_front();
00215     ds.push_front(x0);
00216     complex< long double > n2( ((rpninteger*)x1)->num, 0.0);
00217     n.num = pow(n2,n.num);
00218     x1->dec();
00219     return;
00220   }
00221 
00222   // Restore the stack.
00223   ds.push_front(x0);
00224 }

void rpnpow::visit ( deque< rpnbase * > &  ds,
rpnreal n 
) [virtual]

Reimplemented from rpnfunction.

Definition at line 116 of file mathfunc.cpp.

References rpnbase::dec(), rpnbase::iscomplex(), rpnbase::isinteger(), rpnbase::isreal(), and rpnreal::num.

00117 {
00118   rpnbase* x0 = ds.front();
00119   ds.pop_front();
00120   rpnbase* x1 =ds.front();
00121 
00122   if (x1->isreal())
00123   {
00124     long double y(n.num);
00125     long double & x(((rpnreal*)x1)->num);
00126     if (x==0.0)
00127       x=0.0;
00128     else
00129       x = pow(x,y);
00130 
00131 //    ((rpnreal*)x1)->num = pow( ((rpnreal*)x1)->num, n.num );
00132     x0->dec();
00133     return;
00134   }
00135   else
00136   if (x1->iscomplex())
00137   {
00138     ((rpncomplex*)x1)->num = pow( ((rpncomplex*)x1)->num, n.num );
00139     x0->dec();
00140     return;
00141   }
00142   else
00143   if (x1->isinteger())
00144   {
00145     ds.pop_front();
00146     ds.push_front(x0);
00147     n.num = pow( ((rpninteger*)x1)->num, n.num );
00148     x1->dec();
00149     return;
00150   }
00151 
00152   // Restore the stack.
00153   ds.push_front(x0);
00154 }

void rpnpow::visit ( deque< rpnbase * > &  ds,
rpninteger n 
) [virtual]

Reimplemented from rpnfunction.

Definition at line 156 of file mathfunc.cpp.

References rpnbase::dec(), rpnbase::iscomplex(), rpnbase::isinteger(), rpnbase::isreal(), and rpninteger::num.

00157 {
00158   rpnbase* x0 = ds.front();
00159   ds.pop_front();
00160   rpnbase* x1 =ds.front();
00161 
00162   if (x1->isinteger())
00163   {
00164     long double const a(((rpninteger*)x1)->num);
00165     long double const b(n.num);
00166 
00167     ((rpninteger*)x1)->num = (long int) pow(a,b);
00168     x0->dec();
00169     return;
00170   }
00171   else
00172   if (x1->isreal())
00173   {
00174     long double const b(n.num);
00175     ((rpnreal*)x1)->num = pow( ((rpnreal*)x1)->num,b );
00176     x0->dec();
00177     return;
00178   }
00179   if (x1->iscomplex())
00180   {
00181     ((rpncomplex*)x1)->num = pow( ((rpncomplex*)x1)->num,n.num );
00182     x0->dec();
00183     return;
00184   }
00185 
00186   // Restore the stack.
00187   ds.push_front(x0);
00188 }


The documentation for this class was generated from the following files:

Generated on Fri Mar 4 00:50:15 2011 for Chelton Evans Source by  doxygen 1.5.8