home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / progs / CB / DATA.Z / BCD.H < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-18  |  10.5 KB  |  409 lines

  1. /*  bcd.h
  2.  
  3.     BCD Number Library - Include File
  4.     class bcd:  declarations for decimal numbers.
  5.  
  6. */
  7.  
  8. /* $Copyright: 1987$ */
  9. /* $Revision:   8.1  $ */
  10.  
  11. #ifndef __cplusplus
  12. #error Must use C++ for the type bcd.
  13. #endif
  14.  
  15. #if !defined(__BCD_H)
  16. #define __BCD_H
  17.  
  18. #if !defined(___DEFS_H)
  19. #include <_defs.h>
  20. #endif
  21.  
  22. #if !defined(__MATH_H)
  23. #include <math.h>
  24. #endif
  25.  
  26. #if !defined(__IOSTREAM_H)
  27. #include <iostream.h>
  28. #endif
  29.  
  30.  
  31. #if !defined(RC_INVOKED)
  32.  
  33. #pragma pack(push, 1)
  34.  
  35. #if defined(__BCOPT__)
  36. #if !defined(_RTL_ALLOW_po) && !defined(__FLAT__)
  37. #pragma option -po-     // disable Object data calling convention
  38. #endif
  39. #endif
  40.  
  41. #pragma option -Vo-
  42.  
  43. #if defined(__STDC__)
  44. #pragma warn -nak
  45. #endif
  46.  
  47. #endif  /* !RC_INVOKED */
  48.  
  49.  
  50. #define _BcdMaxDecimals     5000
  51.  
  52. _CLASSDEF(bcd)
  53.  
  54. class _EXPCLASS bcd {
  55.  
  56. public:
  57.     // constructors
  58.     _RTLENTRY bcd();
  59.     _RTLENTRY bcd(int x);
  60.     _RTLENTRY bcd(unsigned int x);
  61.     _RTLENTRY bcd(long x);
  62.     _RTLENTRY bcd(unsigned long x);
  63.     _RTLENTRY bcd(double x, int decimals = _BcdMaxDecimals);
  64.     _RTLENTRY bcd(long double x, int decimals = _BcdMaxDecimals);
  65.  
  66.     // bcd manipulations
  67.     friend long double _RTLENTRY real(bcd _FAR &);   // Return the real part
  68.  
  69.     // Overloaded ANSI C math functions
  70.     friend bcd _RTLENTRY _EXPFUNC abs(bcd _FAR &);
  71.     friend bcd _RTLENTRY _EXPFUNC acos(bcd _FAR &);
  72.     friend bcd _RTLENTRY _EXPFUNC asin(bcd _FAR &);
  73.     friend bcd _RTLENTRY _EXPFUNC atan(bcd _FAR &);
  74.     friend bcd _RTLENTRY _EXPFUNC cos(bcd _FAR &);
  75.     friend bcd _RTLENTRY _EXPFUNC cosh(bcd _FAR &);
  76.     friend bcd _RTLENTRY _EXPFUNC exp(bcd _FAR &);
  77.     friend bcd _RTLENTRY _EXPFUNC log(bcd _FAR &);
  78.     friend bcd _RTLENTRY _EXPFUNC log10(bcd _FAR &);
  79.     friend bcd _RTLENTRY _EXPFUNC pow(bcd _FAR & base, bcd _FAR & expon);
  80.     friend bcd _RTLENTRY _EXPFUNC sin(bcd _FAR &);
  81.     friend bcd _RTLENTRY _EXPFUNC sinh(bcd _FAR &);
  82.     friend bcd _RTLENTRY _EXPFUNC sqrt(bcd _FAR &);
  83.     friend bcd _RTLENTRY _EXPFUNC tan(bcd _FAR &);
  84.     friend bcd _RTLENTRY _EXPFUNC tanh(bcd _FAR &);
  85.  
  86.     // Binary Operator Functions
  87.     friend bcd _RTLENTRY _EXPFUNC operator+(bcd _FAR &, bcd _FAR &);
  88.     friend bcd _RTLENTRY _EXPFUNC operator+(long double, bcd _FAR &);
  89.     friend bcd _RTLENTRY _EXPFUNC operator+(bcd _FAR &, long double);
  90.     friend bcd _RTLENTRY _EXPFUNC operator-(bcd _FAR &, bcd _FAR &);
  91.     friend bcd _RTLENTRY _EXPFUNC operator-(long double, bcd _FAR &);
  92.     friend bcd _RTLENTRY _EXPFUNC operator-(bcd _FAR &, long double);
  93.     friend bcd _RTLENTRY _EXPFUNC operator*(bcd _FAR &, bcd _FAR &);
  94.     friend bcd _RTLENTRY _EXPFUNC operator*(bcd _FAR &, long double);
  95.     friend bcd _RTLENTRY _EXPFUNC operator*(long double, bcd _FAR &);
  96.     friend bcd _RTLENTRY _EXPFUNC operator/(bcd _FAR &, bcd _FAR &);
  97.     friend bcd _RTLENTRY _EXPFUNC operator/(bcd _FAR &, long double);
  98.     friend bcd _RTLENTRY _EXPFUNC operator/(long double, bcd _FAR &);
  99.     friend int _RTLENTRY _EXPFUNC operator==(bcd _FAR &, bcd _FAR &);
  100.     friend int _RTLENTRY _EXPFUNC operator!=(bcd _FAR &, bcd _FAR &);
  101.     friend int _RTLENTRY _EXPFUNC operator>=(bcd _FAR &, bcd _FAR &);
  102.     friend int _RTLENTRY _EXPFUNC operator<=(bcd _FAR &, bcd _FAR &);
  103.     friend int _RTLENTRY _EXPFUNC operator>(bcd _FAR &, bcd _FAR &);
  104.     friend int _RTLENTRY _EXPFUNC operator<(bcd _FAR &, bcd _FAR &);
  105.     bcd _FAR & _RTLENTRY operator+=(bcd _FAR &);
  106.     bcd _FAR & _RTLENTRY operator+=(long double);
  107.     bcd _FAR & _RTLENTRY operator-=(bcd _FAR &);
  108.     bcd _FAR & _RTLENTRY operator-=(long double);
  109.     bcd _FAR & _RTLENTRY operator*=(bcd _FAR &);
  110.     bcd _FAR & _RTLENTRY operator*=(long double);
  111.     bcd _FAR & _RTLENTRY operator/=(bcd _FAR &);
  112.     bcd _FAR & _RTLENTRY operator/=(long double);
  113.     bcd  _RTLENTRY operator+();
  114.     bcd  _RTLENTRY operator-();
  115.  
  116. // Implementation
  117. private:
  118.     long mantissa[2];
  119.     int expo;
  120. };
  121.  
  122. // const bcd _bcd_zero(0);
  123.  
  124. enum _bcdexpo {
  125.     _ExpoZero,
  126.     _ExpoInf,
  127.     _ExpoNan
  128. };
  129.  
  130. extern "C"
  131. {
  132. #if defined(__FLAT__)
  133.     long double _RTLENTRY _EXPFUNC __bcd_tobinary (const bcd *p);
  134.     void        _RTLENTRY _EXPFUNC __bcd_todecimal(long double x, int decimals, bcd *p);
  135.     long double _RTLENTRY _EXPFUNC __bcd_log10    (bcd *p);
  136.     void        _RTLENTRY _EXPFUNC __bcd_pow10    (int n, bcd *p);
  137. #else
  138.     long double __pascal _EXPFUNC __bcd_tobinary(const bcd __far *p);
  139.     void        __pascal _EXPFUNC __bcd_todecimal(long double x, int decimals, bcd __far *p);
  140.     long double __pascal _EXPFUNC __bcd_log10(bcd __far *p);
  141.     void        __pascal _EXPFUNC __bcd_pow10(int n, bcd __far *p);
  142. #endif
  143. }
  144.  
  145. inline _RTLENTRY bcd::bcd()
  146. {
  147. /* if you want zero ...
  148.     mantissa[0] = 0;
  149.     mantissa[1] = 0;
  150.     expo = ExpoZero;
  151. */
  152. }
  153.  
  154. inline _RTLENTRY bcd::bcd(long double x, int decimals)
  155. {
  156.     __bcd_todecimal(x,decimals,this);
  157. }
  158.  
  159. inline _RTLENTRY bcd::bcd(double x, int decimals)
  160. {
  161.     __bcd_todecimal(x,decimals,this);
  162. }
  163.  
  164. inline _RTLENTRY bcd::bcd(int x)
  165. {
  166.     mantissa[0] = x;
  167.     mantissa[1] = x >= 0 ? 0 : -1;
  168.     expo = 0;
  169. }
  170.  
  171. inline _RTLENTRY bcd::bcd(unsigned int x)
  172. {
  173.     mantissa[0] = x;
  174.     mantissa[1] = 0;
  175.     expo = 0;
  176. }
  177.  
  178. inline _RTLENTRY bcd::bcd(long x)
  179. {
  180.     mantissa[0] = x;
  181.     mantissa[1] = x >= 0 ? 0 : -1;
  182.     expo = 0;
  183. }
  184.  
  185. inline _RTLENTRY bcd::bcd(unsigned long x)
  186. {
  187.     mantissa[0] = x;
  188.     mantissa[1] = 0;
  189.     expo = 0;
  190. }
  191.  
  192. inline long double _RTLENTRY real(bcd _FAR &z)
  193. {
  194.     return __bcd_tobinary(&z);
  195. }
  196.  
  197. // Definitions of compound-assignment operator member functions
  198.  
  199. inline bcd& _RTLENTRY bcd::operator+=(bcd _FAR &b)
  200. {
  201.     __bcd_todecimal(real(*this)+real(b),_BcdMaxDecimals,this);
  202.     return *this;
  203. }
  204.  
  205. inline bcd& _RTLENTRY bcd::operator+=(long double b)
  206. {
  207.     __bcd_todecimal(real(*this)+b,_BcdMaxDecimals,this);
  208.     return *this;
  209. }
  210.  
  211. inline bcd& _RTLENTRY bcd::operator-=(bcd _FAR &b)
  212. {
  213.     __bcd_todecimal(real(*this)-real(b),_BcdMaxDecimals,this);
  214.     return *this;
  215. }
  216.  
  217. inline bcd& _RTLENTRY bcd::operator-=(long double b)
  218. {
  219.     __bcd_todecimal(real(*this)-b,_BcdMaxDecimals,this);
  220.     return *this;
  221. }
  222.  
  223. inline bcd& _RTLENTRY bcd::operator*=(bcd _FAR &b)
  224. {
  225.     __bcd_todecimal(real(*this)*real(b),_BcdMaxDecimals,this);
  226.     return *this;
  227. }
  228.  
  229. inline bcd& _RTLENTRY bcd::operator*=(long double b)
  230. {
  231.     __bcd_todecimal(real(*this)*b,_BcdMaxDecimals,this);
  232.     return *this;
  233. }
  234.  
  235. inline bcd& _RTLENTRY bcd::operator/=(bcd _FAR &b)
  236. {
  237.     __bcd_todecimal(real(*this)/real(b),_BcdMaxDecimals,this);
  238.     return *this;
  239. }
  240.  
  241. inline bcd& _RTLENTRY bcd::operator/=(long double b)
  242. {
  243.     __bcd_todecimal(real(*this)/b,_BcdMaxDecimals,this);
  244.     return *this;
  245. }
  246.  
  247.  
  248. // Definitions of non-member binary operator functions
  249.  
  250. inline bcd _RTLENTRY operator+(bcd _FAR &a, bcd _FAR &b)
  251. {
  252.     return bcd(real(a) + real(b));
  253. }
  254.  
  255. inline bcd _RTLENTRY operator+(long double a, bcd _FAR &b)
  256. {
  257.     return bcd(a + real(b));
  258. }
  259.  
  260. inline bcd _RTLENTRY operator+(bcd _FAR &a, long double b)
  261. {
  262.     return bcd(real(a) + b);
  263. }
  264.  
  265. inline bcd _RTLENTRY operator-(bcd _FAR &a, bcd _FAR &b)
  266. {
  267.     return bcd(real(a) - real(b));
  268. }
  269.  
  270. inline bcd _RTLENTRY operator-(long double a, bcd _FAR &b)
  271. {
  272.     return bcd(a - real(b));
  273. }
  274.  
  275. inline bcd _RTLENTRY operator-(bcd _FAR &a, long double b)
  276. {
  277.     return bcd(real(a) - b);
  278. }
  279.  
  280. inline bcd _RTLENTRY operator*(bcd _FAR &a, bcd _FAR &b)
  281. {
  282.     return bcd(real(a) * real(b));
  283. }
  284.  
  285. inline bcd _RTLENTRY operator*(bcd _FAR &a, long double b)
  286. {
  287.     return bcd(real(a) * b);
  288. }
  289.  
  290. inline bcd _RTLENTRY operator*(long double a, bcd _FAR &b)
  291. {
  292.     return bcd(a * real(b));
  293. }
  294.  
  295. inline bcd _RTLENTRY operator/(bcd _FAR &a, bcd  _FAR &b)
  296. {
  297.     return bcd(real(a) / real(b));
  298. }
  299.  
  300. inline bcd _RTLENTRY operator/(long double a, bcd _FAR &b)
  301. {
  302.     return bcd(a / real(b));
  303. }
  304.  
  305. inline bcd _RTLENTRY operator/(bcd _FAR &a, long double b)
  306. {
  307.     return bcd(real(a) / b);
  308. }
  309.  
  310. inline int _RTLENTRY operator==(bcd _FAR &a, bcd _FAR &b)
  311. {
  312.     return real(a) == real(b);
  313. }
  314.  
  315. inline int _RTLENTRY operator!=(bcd _FAR &a, bcd _FAR &b)
  316. {
  317.     return real(a) != real(b);
  318. }
  319.  
  320. inline int _RTLENTRY operator>=(bcd _FAR &a, bcd _FAR &b)
  321. {
  322.     return real(a) >= real(b);
  323. }
  324.  
  325. inline int _RTLENTRY operator<=(bcd _FAR &a, bcd _FAR &b)
  326. {
  327.     return real(a) <= real(b);
  328. }
  329.  
  330. inline int _RTLENTRY operator>(bcd _FAR &a, bcd _FAR &b)
  331. {
  332.     return real(a) > real(b);
  333. }
  334.  
  335. inline int _RTLENTRY operator<(bcd _FAR &a, bcd _FAR &b)
  336. {
  337.     return real(a) < real(b);
  338. }
  339.  
  340. inline bcd _RTLENTRY bcd::operator+()
  341. {
  342.     return *this;
  343. }
  344.  
  345. inline bcd _RTLENTRY bcd::operator-()
  346. {
  347. //  return bcd(-real(this));
  348.  
  349. // 1's comp
  350.     mantissa[0] = - ++ mantissa[0];
  351.     mantissa[1] = - ++ mantissa[1];
  352. // inc
  353.     if (++mantissa[0] == 0) ++mantissa[1];
  354.     return *this;
  355. }
  356.  
  357. inline bcd _RTLENTRY abs(bcd& a)   { return bcd(fabs(real(a)));}
  358. inline bcd _RTLENTRY acos(bcd& a)  { return bcd(acos(real(a)));}
  359. inline bcd _RTLENTRY asin(bcd& a)  { return bcd(asin(real(a)));}
  360. inline bcd _RTLENTRY atan(bcd& a)  { return bcd(atan(real(a)));}
  361. inline bcd _RTLENTRY cos(bcd& a)   { return bcd(cos(real(a)));}
  362. inline bcd _RTLENTRY cosh(bcd& a)  { return bcd(cosh(real(a)));}
  363. inline bcd _RTLENTRY exp(bcd& a)   { return bcd(exp(real(a)));}
  364. inline bcd _RTLENTRY log(bcd& a)   { return bcd(log(real(a)));}
  365. inline bcd _RTLENTRY log10(bcd& a) { return bcd(__bcd_log10(&a));}
  366. inline bcd _RTLENTRY sin(bcd& a)   { return bcd(sin(real(a)));}
  367. inline bcd _RTLENTRY sinh(bcd& a)  { return bcd(sinh(real(a)));}
  368. inline bcd _RTLENTRY sqrt(bcd& a)  { return bcd(sqrt(real(a)));}
  369. inline bcd _RTLENTRY tan(bcd& a)   { return bcd(tan(real(a)));}
  370. inline bcd _RTLENTRY tanh(bcd& a)  { return bcd(tanh(real(a)));}
  371.  
  372. inline bcd _RTLENTRY pow(bcd& a, bcd& b)   { return bcd(pow(real(a),real(b)));}
  373. inline void _RTLENTRY pow10(int n, bcd& a) { __bcd_pow10(n,&a);}
  374.  
  375. // bcd stream I/O
  376.  
  377. #if defined(__FLAT__)
  378. ostream _FAR & _RTLENTRY _EXPFUNC operator<<(ostream _FAR &, bcd _FAR &);
  379. istream _FAR & _RTLENTRY _EXPFUNC operator>>(istream _FAR &, bcd _FAR &);
  380. #else
  381. ostream _FAR & __pascal _EXPFUNC operator<<(ostream _FAR &, bcd _FAR &);
  382. istream _FAR & __pascal _EXPFUNC operator>>(istream _FAR &, bcd _FAR &);
  383. #endif
  384.  
  385.  
  386. #if !defined(RC_INVOKED)
  387.  
  388. #if defined(__STDC__)
  389. #pragma warn .nak
  390. #endif
  391.  
  392. #pragma option -Vo.
  393.  
  394. #if defined(__BCOPT__)
  395. #if !defined(_RTL_ALLOW_po) && !defined(__FLAT__)
  396. #pragma option -po.     // restore Object data calling convention
  397. #endif
  398. #endif
  399.  
  400. /* restore default packing */
  401. #pragma pack(pop)
  402.  
  403. #endif  /* !RC_INVOKED */
  404.  
  405.  
  406. #endif  // __BCD_H
  407.  
  408.  
  409.