home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / cb / setup / cbuilder / data.z / BCD.H < prev    next >
C/C++ Source or Header  |  1997-02-28  |  11KB  |  408 lines

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