Files Classes Functions Hierarchy
00001 #ifndef MATHFUNC_H 00002 #define MATHFUNC_H 00003 00004 00005 #include <cmath> 00006 #include <complex> 00007 using namespace std; 00008 00009 #include <rpn.h> 00010 00011 00012 00013 00014 00015 00016 class rpnfcos: public rpnfunction 00017 { 00018 public: 00019 00020 string const name() const 00021 { return string("cos"); } 00022 00023 void visit(deque<rpnbase*>& ds,rpnreal& n) 00024 { n.num = cos(n.num); } 00025 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00026 { n.num = cos(n.num); } 00027 00028 rpnfcos() {} 00029 rpnfcos(deque<rpnbase*>& ds, bool const evaluate=true) 00030 { 00031 if (evaluate) 00032 eval(ds); 00033 else 00034 ds.push_front(this); 00035 } 00036 ~rpnfcos() {} 00037 rpnbase* copy() const 00038 { return new rpnfcos(); } 00039 00040 }; 00041 00042 00043 class rpnfsin: public rpnfunction 00044 { 00045 public: 00046 00047 string const name() const 00048 { return string("sin"); } 00049 00050 void visit(deque<rpnbase*>& ds,rpnreal& n) 00051 { n.num = sin(n.num); } 00052 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00053 { n.num = sin(n.num); } 00054 00055 rpnfsin() {} 00056 rpnfsin(deque<rpnbase*>& ds, bool const evaluate=true) 00057 { 00058 if (evaluate) 00059 eval(ds); 00060 else 00061 ds.push_front(this); 00062 } 00063 ~rpnfsin() {} 00064 rpnbase* copy() const 00065 { return new rpnfsin(); } 00066 00067 }; 00068 00069 00070 00071 class rpnftan: public rpnfunction 00072 { 00073 public: 00074 00075 string const name() const 00076 { return string("tan"); } 00077 00078 void visit(deque<rpnbase*>& ds,rpnreal& n) 00079 { n.num = tan(n.num); } 00080 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00081 { n.num = tan(n.num); } 00082 00083 rpnftan() {} 00084 rpnftan(deque<rpnbase*>& ds, bool const evaluate=true) 00085 { 00086 if (evaluate) 00087 eval(ds); 00088 else 00089 ds.push_front(this); 00090 } 00091 ~rpnftan() {} 00092 rpnbase* copy() const 00093 { return new rpnftan(); } 00094 00095 }; 00096 00097 00098 00099 00100 class rpnflog: public rpnfunction 00101 { 00102 public: 00103 00104 string const name() const 00105 { return string("log"); } 00106 00107 void visit(deque<rpnbase*>& ds,rpnreal& n) 00108 { n.num = log(n.num); } 00109 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00110 { n.num = log(n.num); } 00111 00112 rpnflog() {} 00113 rpnflog(deque<rpnbase*>& ds, bool const evaluate=true) 00114 { 00115 if (evaluate) 00116 eval(ds); 00117 else 00118 ds.push_front(this); 00119 } 00120 ~rpnflog() {} 00121 rpnbase* copy() const 00122 { return new rpnflog(); } 00123 00124 }; 00125 00126 00127 class rpnflog10: public rpnfunction 00128 { 00129 public: 00130 00131 string const name() const 00132 { return string("log10"); } 00133 00134 void visit(deque<rpnbase*>& ds,rpnreal& n) 00135 { n.num = log10(n.num); } 00136 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00137 { n.num = log10(n.num); } 00138 00139 rpnflog10() {} 00140 rpnflog10(deque<rpnbase*>& ds, bool const evaluate=true) 00141 { 00142 if (evaluate) 00143 eval(ds); 00144 else 00145 ds.push_front(this); 00146 } 00147 ~rpnflog10() {} 00148 rpnbase* copy() const 00149 { return new rpnflog10(); } 00150 00151 }; 00152 00153 class rpnfexp: public rpnfunction 00154 { 00155 public: 00156 00157 string const name() const 00158 { return string("exp"); } 00159 00160 void visit(deque<rpnbase*>& ds,rpnreal& n) 00161 { n.num = exp(n.num); } 00162 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00163 { n.num = exp(n.num); } 00164 00165 rpnfexp() {} 00166 rpnfexp(deque<rpnbase*>& ds, bool const evaluate=true) 00167 { 00168 if (evaluate) 00169 eval(ds); 00170 else 00171 ds.push_front(this); 00172 } 00173 ~rpnfexp() {} 00174 rpnbase* copy() const 00175 { return new rpnfexp(); } 00176 00177 }; 00178 00179 class rpnfsqrt: public rpnfunction 00180 { 00181 public: 00182 00183 string const name() const 00184 { return string("sqrt"); } 00185 00186 void visit(deque<rpnbase*>& ds,rpninteger& n); 00187 void visit(deque<rpnbase*>& ds,rpnreal& n) 00188 { n.num = sqrt(n.num); } 00189 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00190 { n.num = sqrt(n.num); } 00191 00192 rpnfsqrt() {} 00193 rpnfsqrt(deque<rpnbase*>& ds, bool const evaluate=true) 00194 { 00195 if (evaluate) 00196 eval(ds); 00197 else 00198 ds.push_front(this); 00199 } 00200 ~rpnfsqrt() {} 00201 rpnbase* copy() const 00202 { return new rpnfsqrt(); } 00203 00204 }; 00205 00206 class rpnfsinh: public rpnfunction 00207 { 00208 public: 00209 00210 string const name() const 00211 { return string("sinh"); } 00212 00213 void visit(deque<rpnbase*>& ds,rpnreal& n) 00214 { n.num = sinh(n.num); } 00215 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00216 { n.num = sinh(n.num); } 00217 00218 rpnfsinh() {} 00219 rpnfsinh(deque<rpnbase*>& ds, bool const evaluate=true) 00220 { 00221 if (evaluate) 00222 eval(ds); 00223 else 00224 ds.push_front(this); 00225 } 00226 ~rpnfsinh() {} 00227 rpnbase* copy() const 00228 { return new rpnfsinh(); } 00229 00230 }; 00231 00232 class rpnfcosh: public rpnfunction 00233 { 00234 public: 00235 00236 string const name() const 00237 { return string("cosh"); } 00238 00239 void visit(deque<rpnbase*>& ds,rpnreal& n) 00240 { n.num = cosh(n.num); } 00241 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00242 { n.num = cosh(n.num); } 00243 00244 rpnfcosh() {} 00245 rpnfcosh(deque<rpnbase*>& ds, bool const evaluate=true) 00246 { 00247 if (evaluate) 00248 eval(ds); 00249 else 00250 ds.push_front(this); 00251 } 00252 ~rpnfcosh() {} 00253 rpnbase* copy() const 00254 { return new rpnfcosh(); } 00255 00256 }; 00257 00258 class rpnftanh: public rpnfunction 00259 { 00260 public: 00261 00262 string const name() const 00263 { return string("tanh"); } 00264 00265 void visit(deque<rpnbase*>& ds,rpnreal& n) 00266 { n.num = tanh(n.num); } 00267 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00268 { n.num = tanh(n.num); } 00269 00270 rpnftanh() {} 00271 rpnftanh(deque<rpnbase*>& ds, bool const evaluate=true) 00272 { 00273 if (evaluate) 00274 eval(ds); 00275 else 00276 ds.push_front(this); 00277 } 00278 ~rpnftanh() {} 00279 rpnbase* copy() const 00280 { return new rpnftanh(); } 00281 00282 }; 00283 00284 00285 class rpnffloor: public rpnfunction 00286 { 00287 public: 00288 00289 string const name() const 00290 { return string("floor"); } 00291 00292 void visit(deque<rpnbase*>& ds,rpnreal& n) 00293 { n.num = floor(n.num); } 00294 00295 rpnffloor() {} 00296 rpnffloor(deque<rpnbase*>& ds, bool const evaluate=true) 00297 { 00298 if (evaluate) 00299 eval(ds); 00300 else 00301 ds.push_front(this); 00302 } 00303 ~rpnffloor() {} 00304 rpnbase* copy() const 00305 { return new rpnffloor(); } 00306 }; 00307 00308 class rpnfceil: public rpnfunction 00309 { 00310 public: 00311 00312 string const name() const 00313 { return string("ceil"); } 00314 00315 void visit(deque<rpnbase*>& ds,rpnreal& n) 00316 { n.num = ceil(n.num); } 00317 00318 rpnfceil() {} 00319 rpnfceil(deque<rpnbase*>& ds, bool const evaluate=true) 00320 { 00321 if (evaluate) 00322 eval(ds); 00323 else 00324 ds.push_front(this); 00325 } 00326 ~rpnfceil() {} 00327 rpnbase* copy() const 00328 { return new rpnfceil(); } 00329 }; 00330 00331 00332 class rpnfacos: public rpnfunction 00333 { 00334 public: 00335 00336 string const name() const 00337 { return string("acos"); } 00338 00339 void visit(deque<rpnbase*>& ds,rpnreal& n) 00340 { n.num = acos(n.num); } 00341 00342 rpnfacos() {} 00343 rpnfacos(deque<rpnbase*>& ds, bool const evaluate=true) 00344 { 00345 if (evaluate) 00346 eval(ds); 00347 else 00348 ds.push_front(this); 00349 } 00350 ~rpnfacos() {} 00351 rpnbase* copy() const 00352 { return new rpnfacos(); } 00353 }; 00354 00355 class rpnfasin: public rpnfunction 00356 { 00357 public: 00358 00359 string const name() const 00360 { return string("asin"); } 00361 00362 void visit(deque<rpnbase*>& ds,rpnreal& n) 00363 { n.num = asin(n.num); } 00364 00365 rpnfasin() {} 00366 rpnfasin(deque<rpnbase*>& ds, bool const evaluate=true) 00367 { 00368 if (evaluate) 00369 eval(ds); 00370 else 00371 ds.push_front(this); 00372 } 00373 ~rpnfasin() {} 00374 rpnbase* copy() const 00375 { return new rpnfasin(); } 00376 }; 00377 00378 class rpnfatan: public rpnfunction 00379 { 00380 public: 00381 00382 string const name() const 00383 { return string("atan"); } 00384 00385 void visit(deque<rpnbase*>& ds,rpnreal& n) 00386 { n.num = atan(n.num); } 00387 00388 rpnfatan() {} 00389 rpnfatan(deque<rpnbase*>& ds, bool const evaluate=true) 00390 { 00391 if (evaluate) 00392 eval(ds); 00393 else 00394 ds.push_front(this); 00395 } 00396 ~rpnfatan() {} 00397 rpnbase* copy() const 00398 { return new rpnfatan(); } 00399 00400 }; 00401 00402 class rpnfabs: public rpnfunction 00403 { 00404 public: 00405 00406 string const name() const 00407 { return string("abs"); } 00408 00409 void visit(deque<rpnbase*>& ds,rpninteger& n) 00410 { if(n.num<0) n.num *= -1; } 00411 void visit(deque<rpnbase*>& ds,rpnreal& n) 00412 { if(n.num<0) n.num *= -1; } 00413 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00414 { 00415 rpnbase* x0 = ds.front(); 00416 ds.pop_front(); 00417 new rpnreal(ds,abs(n.num)); 00418 x0->dec(); 00419 } 00420 00421 rpnfabs() {} 00422 rpnfabs(deque<rpnbase*>& ds, bool const evaluate=true) 00423 { 00424 if (evaluate) 00425 eval(ds); 00426 else 00427 ds.push_front(this); 00428 } 00429 ~rpnfabs() {} 00430 rpnbase* copy() const 00431 { return new rpnfabs(); } 00432 }; 00433 00434 class rpnfarg: public rpnfunction 00435 { 00436 public: 00437 00438 string const name() const 00439 { return string("arg"); } 00440 00441 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00442 { 00443 rpnbase* x0 = ds.front(); 00444 ds.pop_front(); 00445 new rpnreal(ds,arg(n.num)); 00446 x0->dec(); 00447 } 00448 00449 rpnfarg() {} 00450 rpnfarg(deque<rpnbase*>& ds, bool const evaluate=true) 00451 { 00452 if (evaluate) 00453 eval(ds); 00454 else 00455 ds.push_front(this); 00456 } 00457 ~rpnfarg() {} 00458 rpnbase* copy() const 00459 { return new rpnfarg(); } 00460 }; 00461 00462 class rpnfnorm: public rpnfunction 00463 { 00464 public: 00465 00466 string const name() const 00467 { return string("norm"); } 00468 00469 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00470 { 00471 rpnbase* x0 = ds.front(); 00472 ds.pop_front(); 00473 new rpnreal(ds,norm(n.num)); 00474 x0->dec(); 00475 } 00476 00477 rpnfnorm() {} 00478 rpnfnorm(deque<rpnbase*>& ds, bool const evaluate=true) 00479 { 00480 if (evaluate) 00481 eval(ds); 00482 else 00483 ds.push_front(this); 00484 } 00485 ~rpnfnorm() {} 00486 rpnbase* copy() const 00487 { return new rpnfnorm(); } 00488 }; 00489 00490 class rpnfimag: public rpnfunction 00491 { 00492 public: 00493 00494 string const name() const 00495 { return string("imag"); } 00496 00497 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00498 { 00499 rpnbase* x0 = ds.front(); 00500 ds.pop_front(); 00501 new rpnreal(ds,imag(n.num)); 00502 x0->dec(); 00503 } 00504 00505 rpnfimag() {} 00506 rpnfimag(deque<rpnbase*>& ds, bool const evaluate=true) 00507 { 00508 if (evaluate) 00509 eval(ds); 00510 else 00511 ds.push_front(this); 00512 } 00513 ~rpnfimag() {} 00514 rpnbase* copy() const 00515 { return new rpnfimag(); } 00516 }; 00517 00518 class rpnrealconvert : public rpnfunction 00519 { 00520 public: 00521 00522 rpnrealconvert() {} 00523 rpnrealconvert(deque<rpnbase*>& ds, bool const evaluate=true); 00524 ~rpnrealconvert() {} 00525 rpnbase* copy() const; 00526 00527 void visit(deque<rpnbase*>& ds,rpnstring& s); 00528 void visit(deque<rpnbase*>& ds,rpninteger& n); 00529 void visit(deque<rpnbase*>& ds,rpncomplex& n); 00530 00531 string const name() const { return string("real"); } 00532 00533 void eval( deque<rpnbase*>& ds ); 00534 }; 00535 00536 class rpnfconj: public rpnfunction 00537 { 00538 public: 00539 00540 string const name() const 00541 { return string("conj"); } 00542 00543 void visit(deque<rpnbase*>& ds,rpncomplex& n) 00544 { n.num = conj(n.num); } 00545 00546 rpnfconj() {} 00547 rpnfconj(deque<rpnbase*>& ds, bool const evaluate=true) 00548 { 00549 if (evaluate) 00550 eval(ds); 00551 else 00552 ds.push_front(this); 00553 } 00554 ~rpnfconj() {} 00555 rpnbase* copy() const 00556 { return new rpnfconj(); } 00557 }; 00558 00559 00560 class rpnpow: public rpnfunction 00561 { 00562 public: 00563 00564 rpnpow() {} 00565 rpnpow(deque<rpnbase*>& ds, bool const evaluate=true); 00566 ~rpnpow() {} 00567 rpnbase* copy() const; 00568 00569 void visit(deque<rpnbase*>& ds,rpninteger& n); 00570 void visit(deque<rpnbase*>& ds,rpnreal& n); 00571 void visit(deque<rpnbase*>& ds,rpncomplex& n); 00572 00573 string const name() const { return string("^"); } 00574 00575 void eval( deque<rpnbase*>& ds ); 00576 }; 00577 00578 00579 00580 00581 class rpnr_to_d: public rpnfunction 00582 { 00583 public: 00584 00585 string const name() const 00586 { return string("r->d"); } 00587 00588 void visit(deque<rpnbase*>& ds,rpnreal& n); 00589 00590 rpnr_to_d() {} 00591 rpnr_to_d(deque<rpnbase*>& ds, bool const evaluate=true) 00592 { 00593 if (evaluate) 00594 eval(ds); 00595 else 00596 ds.push_front(this); 00597 } 00598 ~rpnr_to_d() {} 00599 rpnbase* copy() const 00600 { return new rpnr_to_d(); } 00601 00602 }; 00603 00604 00605 class rpnd_to_r: public rpnfunction 00606 { 00607 public: 00608 00609 string const name() const 00610 { return string("d->r"); } 00611 00612 void visit(deque<rpnbase*>& ds,rpnreal& n); 00613 00614 rpnd_to_r() {} 00615 rpnd_to_r(deque<rpnbase*>& ds, bool const evaluate=true) 00616 { 00617 if (evaluate) 00618 eval(ds); 00619 else 00620 ds.push_front(this); 00621 } 00622 ~rpnd_to_r() {} 00623 rpnbase* copy() const 00624 { return new rpnd_to_r(); } 00625 00626 }; 00627 00628 00629 00630 class rpnp_to_c: public rpnfunction 00631 { 00632 public: 00633 00634 string const name() const 00635 { return string("p->c"); } 00636 00637 void visit(deque<rpnbase*>& ds,rpnreal& n); 00638 00639 rpnp_to_c() {} 00640 rpnp_to_c(deque<rpnbase*>& ds, bool const evaluate=true) 00641 { 00642 if (evaluate) 00643 eval(ds); 00644 else 00645 ds.push_front(this); 00646 } 00647 ~rpnp_to_c() {} 00648 rpnbase* copy() const 00649 { return new rpnp_to_c(); } 00650 00651 void eval( deque<rpnbase*>& ds ); 00652 }; 00653 00654 00655 00656 class rpnr_to_c: public rpnfunction 00657 { 00658 public: 00659 00660 string const name() const 00661 { return string("complex"); } 00662 00663 void visit(deque<rpnbase*>& ds,rpninteger& n); 00664 void visit(deque<rpnbase*>& ds,rpnreal& n); 00665 00666 rpnr_to_c() {} 00667 rpnr_to_c(deque<rpnbase*>& ds, bool const evaluate=true) 00668 { 00669 if (evaluate) 00670 eval(ds); 00671 else 00672 ds.push_front(this); 00673 } 00674 ~rpnr_to_c() {} 00675 rpnbase* copy() const 00676 { return new rpnr_to_c(); } 00677 00678 void eval( deque<rpnbase*>& ds ); 00679 }; 00680 00681 00682 00683 00684 class mathconstants 00685 { 00686 public: 00687 00688 static long double pi; 00689 static long double r_to_d; 00690 static long double d_to_r; 00691 }; 00692 00693 00694 #endif 00695 00696
1.5.8