proj home

Files   Classes   Functions   Hierarchy  

mathfunc.cpp

Go to the documentation of this file.
00001 #include <mathfunc.h>
00002 
00003 
00004 #include <cmath>
00005 using namespace std;
00006 
00007 #include <rpn.h>
00008 
00009 
00010 // Implementation
00011 // ------------------------------------------------------------
00012 //
00013 
00014 /*
00015 
00016   Call to rpnf< fcos >; or other functional object.
00017 
00018 
00019 */
00020 
00021 
00022 void rpnfsqrt::visit(deque<rpnbase*>& ds,rpninteger& n)
00023 {
00024   rpnbase * x0 = ds.front();
00025   ds.pop_front();
00026 
00027   new rpnreal(ds,sqrt((long double)(n.num)));
00028   x0->dec();  
00029 }
00030 
00031 
00032 
00033 
00034 rpnrealconvert::rpnrealconvert(deque<rpnbase*>& ds, bool const evaluate)
00035 {
00036   if (evaluate)
00037     eval(ds);
00038   else
00039     ds.push_front(this);
00040 }
00041 
00042 rpnbase* rpnrealconvert::copy() const
00043 {
00044   return new rpnrealconvert();
00045 }
00046 
00047 void rpnrealconvert::eval( deque<rpnbase*>& ds )
00048 {
00049   if(!ds.empty())
00050     ds[0]->accept(ds,*this);
00051 
00052   dec();
00053 }
00054 
00055 void rpnrealconvert::visit(deque<rpnbase*>& ds,rpnstring & s)
00056 {
00057   rpnbase* x0 = ds.front();
00058   ds.pop_front();
00059 
00060   long double n;
00061   stringstream ss(s.str.c_str());
00062   ss >> n;
00063   new rpnreal(ds,n);
00064 
00065   x0->dec();
00066 }
00067 
00068 void rpnrealconvert::visit(deque<rpnbase*>& ds,rpninteger & n)
00069 {
00070   rpnbase* x0 = ds.front();
00071   ds.pop_front();
00072 
00073   long double num = (long double)(n.num);
00074   new rpnreal(ds,num);
00075 
00076   x0->dec();
00077 }
00078 
00079 void rpnrealconvert::visit(deque<rpnbase*>& ds,rpncomplex & n)
00080 {
00081   rpnbase* x0 = ds.front();
00082   ds.pop_front();
00083 
00084   new rpnreal(ds,real(n.num));
00085 
00086   x0->dec();
00087 
00088 }
00089 
00090 
00091 
00092 
00093 
00094 
00095 rpnpow::rpnpow(deque<rpnbase*>& ds, bool const evaluate)
00096 {
00097   if (evaluate)
00098     eval(ds);
00099   else
00100     ds.push_front(this);
00101 }
00102 
00103 rpnbase* rpnpow::copy() const
00104 {
00105   return new rpnpow();
00106 }
00107 
00108 void rpnpow::eval( deque<rpnbase*>& ds )
00109 {
00110   if (ds.size()>1)
00111     ds[0]->accept(ds,*this);
00112 
00113   dec();
00114 }
00115 
00116 void rpnpow::visit(deque<rpnbase*>& ds,rpnreal& n)
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 }
00155 
00156 void rpnpow::visit(deque<rpnbase*>& ds, rpninteger& n)
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 }
00189 
00190 void rpnpow::visit(deque<rpnbase*>& ds, rpncomplex& n)
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 }
00225 
00226 
00227 void rpnr_to_d::visit(deque<rpnbase*>& ds,rpnreal & n)
00228 {
00229   n.num *= mathconstants::r_to_d;
00230 }
00231 
00232 void rpnd_to_r::visit(deque<rpnbase*>& ds,rpnreal & n)
00233 {
00234   n.num *= mathconstants::d_to_r;
00235 }
00236 
00237 void rpnp_to_c::eval( deque<rpnbase*>& ds )
00238 {
00239   if (ds.size()>1)
00240     ds[0]->accept(ds,*this);
00241 
00242   dec();
00243 }
00244 
00245 void rpnp_to_c::visit(deque<rpnbase*>& ds,rpnreal& n)
00246 {
00247   rpnbase* x0 = ds.front();
00248   ds.pop_front();
00249   rpnbase* x1 =ds.front();
00250   ds.pop_front();
00251 
00252   if (x1->isreal())
00253   {
00254     long double const r = ((rpnreal*)x1)->num;
00255     long double const t = n.num;
00256     new rpncomplex(ds,r*cos(t),r*sin(t));
00257     x0->dec();
00258     x1->dec();
00259     return;
00260   }
00261 
00262   // Restore the stack.
00263   ds.push_front(x1);
00264   ds.push_front(x0);
00265 }
00266 
00267 
00268 
00269 void rpnr_to_c::eval( deque<rpnbase*>& ds )
00270 {
00271   if (ds.size()>1)
00272     ds[0]->accept(ds,*this);
00273 
00274   dec();
00275 }
00276 
00277 void rpnr_to_c::visit(deque<rpnbase*>& ds,rpnreal& n)
00278 {
00279   rpnbase* x0 = ds.front();
00280   ds.pop_front();
00281   rpnbase* x1 =ds.front();
00282   ds.pop_front();
00283 
00284   if (x1->isreal())
00285   {
00286     long double const x = ((rpnreal*)x1)->num;
00287     long double const y = n.num;
00288     new rpncomplex(ds,x,y);
00289     x0->dec();
00290     x1->dec();
00291     return;
00292   }
00293   else
00294   if (x1->isinteger())
00295   {
00296     long double const x = ((rpninteger*)x1)->num;
00297     long double const y = n.num;
00298     new rpncomplex(ds,x,y);
00299     x0->dec();
00300     x1->dec();
00301     return;
00302   }
00303 
00304   // Restore the stack.
00305   ds.push_front(x1);
00306   ds.push_front(x0);
00307 }
00308 
00309 void rpnr_to_c::visit(deque<rpnbase*>& ds,rpninteger& n)
00310 {
00311   rpnbase* x0 = ds.front();
00312   ds.pop_front();
00313   rpnbase* x1 =ds.front();
00314   ds.pop_front();
00315 
00316   if (x1->isreal())
00317   {
00318     long double const x = ((rpnreal*)x1)->num;
00319     long double const y = n.num;
00320     new rpncomplex(ds,x,y);
00321     x0->dec();
00322     x1->dec();
00323     return;
00324   }
00325   else
00326   if (x1->isinteger())
00327   {
00328     long double const x = ((rpninteger*)x1)->num;
00329     long double const y = n.num;
00330     new rpncomplex(ds,x,y);
00331     x0->dec();
00332     x1->dec();
00333     return;
00334   }
00335 
00336   // Restore the stack.
00337   ds.push_front(x1);
00338   ds.push_front(x0);
00339 }
00340 
00341 
00342 
00343 
00344 
00345 
00346 
00347 long double mathconstants::pi = atan(1.0)*4.0;
00348 long double mathconstants::r_to_d = 180.0/mathconstants::pi;
00349 long double mathconstants::d_to_r = mathconstants::pi/180.0;
00350 
00351 

Generated on Fri Mar 4 00:49:30 2011 for Chelton Evans Source by  doxygen 1.5.8