Files Classes Functions Hierarchy
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
1.5.8