|
|
1.1 root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2:
3: /*
4: $Header: b1num.h,v 1.4 85/08/22 16:41:53 timo Exp $
5: */
6:
7: /************************************************************************/
8: /* Full numeric package: private definitions */
9: /* */
10: /* A number is modelled as one of zero, unbounded integer, */
11: /* unbounded rational or approximate. */
12: /* Zero has a 'length' field of zero, and nothing else. */
13: /* A length field of +n means the number is an n digit integer, */
14: /* (with digits to some large base). */
15: /* A length of -1 means there follow two floating point numbers, */
16: /* one the fraction (zero or .5 <= frac <= 1), one the exponent */
17: /* with respect to base 2 (should be an integral value). */
18: /* (This is so when EXT_RANGE is defined. Otherwise, there is */
19: /* only one field, frac, which is not normalized. This saves */
20: /* code and data space on e.g. the IBM PC, where the natural */
21: /* range of double's is sufficient (~1E307).) */
22: /* A length of -2 means there follow two values, pointers to two */
23: /* unbounded integers, ie a rational number. */
24: /* A length of -n, n>2, means it is a rational with a print width */
25: /* of n-2. */
26: /* */
27: /************************************************************************/
28:
29: /*************** Definitions exported for integers *****************/
30:
31: typedef int digit;
32:
33: typedef struct integer {
34: HEADER;
35: digit dig[1];
36: } *integer;
37:
38: #define FreezeSmallInt(v, vv) \
39: (IsSmallInt(v) && (Freeze1(v, vv), Freeze2(v, vv)))
40: #define Freeze1(v, vv) ((vv).type= Num, (vv).refcnt= Maxrefcnt)
41: #define Freeze2(v, vv) \
42: ((vv).len= (v) != 0, (vv).dig[0]= SmallIntVal(v), (v)= &(vv))
43:
44: integer int_gadd();
45: integer int_canon();
46: integer int_prod();
47: integer int_quot();
48: integer int_gcd();
49: integer mk_int();
50: integer int1mul();
51: integer int_tento();
52: integer int_half();
53: integer int_mod();
54: digit int_ldiv();
55:
56: #define int_0 ((integer) MkSmallInt(0))
57: #define int_1 ((integer) MkSmallInt(1))
58: #define int_2 ((integer) MkSmallInt(2))
59: #define int_10 ((integer) MkSmallInt(10))
60:
61: #define int_sum(v, w) int_gadd(v, w, 1)
62: #define int_diff(v, w) int_gadd(v, w, -1)
63: #define int_neg(v) int_gadd(int_0, v, -1)
64:
65: #define Integral(v) (IsSmallInt(v) || Length(v)>=0)
66: #define Modulo(a,b) (((a)%(b)+(b))%(b))
67: #define Digit(v,n) ((v)->dig[n])
68: #define Msd(v) (IsSmallInt(v) ? SmallIntVal(v) : Digit(v,Length(v)-1))
69: #define Lsd(v) (IsSmallInt(v) ? SmallIntVal(v) : Digit(v,0))
70:
71: #define Odd(x) ((x)&1)
72: #define Even(x) (!Odd(x))
73:
74: /* Provisional definitions */
75:
76: value copy();
77: #define Copy(x) copy((value)(x))
78:
79: /***************** Definitions exported for rationals *****************/
80:
81: typedef struct {
82: HEADER;
83: integer num, den;
84: } *rational;
85:
86:
87: #define Numerator(a) ((a)->num)
88: #define Denominator(a) ((a)->den)
89: #define Rational(a) (!IsSmallInt(a) && Length(a)<-1)
90: #define Roundsize(a) (-2-Length(a))
91:
92: rational mk_rat();
93: rational rat_sum();
94: rational rat_diff();
95: rational rat_neg();
96: rational rat_prod();
97: rational rat_quot();
98: rational rat_power();
99:
100: extern rational rat_zero;
101: extern rational rat_half;
102:
103: value tento();
104: value mk_exact();
105:
106: /***************** Definitions exported for approximate numbers *************/
107:
108: #ifdef vax
109: #define EXT_RANGE
110: #endif
111:
112: typedef struct real {
113: HEADER;
114: double frac;
115: #ifdef EXT_RANGE
116: double expo;
117: #endif EXT_RANGE
118: } *real;
119:
120: #define Frac(v) ((v)->frac)
121: #ifdef EXT_RANGE
122: #define Expo(v) ((v)->expo)
123: #else
124: #define Expo(v) 0.0
125: #endif
126:
127: #define Approximate(v) (!IsSmallInt(v) && Length(v)==-1)
128: #define Exact(v) (!Approximate(v))
129:
130: extern real app_0;
131:
132: real mk_approx();
133:
134: real app_sum();
135: real app_diff();
136: real app_prod();
137: real app_quot();
138: real app_neg();
139:
140: real app_exp();
141: real app_log();
142: real app_power();
143:
144: value app_floor();
145:
146:
147: /* Numeric constants. */
148: /* (Source: Knuth, The Art of Computer Programming, Vol. 1, Appendix B-1.) */
149:
150: #define logtwo 0.6931471805599453094172321214581765680755
151: #define invlogtwo 1.4426950408889634073599246810018921374266
152: #define logten 2.3025850929940456840179914546843642076011
153: #define logBASE (logten*tenlogBASE)
154: #define twologBASE (logBASE*invlogtwo)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.