source: git/ntl/include/NTL/RR.h @ 92c0ac

spielwiese
Last change on this file since 92c0ac was 92c0ac, checked in by Hans Schönemann <hannes@…>, 21 years ago
NTL-5.2 git-svn-id: file:///usr/local/Singular/svn/trunk@6320 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 11.2 KB
Line 
1#ifndef NTL_RR__H
2#define NTL_RR__H
3
4#include <NTL/ZZ.h>
5#include <NTL/xdouble.h>
6#include <NTL/quad_float.h>
7
8NTL_OPEN_NNS
9
10
11class RR {
12
13public:
14
15ZZ x;
16long e;
17
18RR() {  e = 0; }
19
20inline RR(INIT_VAL_TYPE, const ZZ& a);
21inline RR(INIT_VAL_TYPE, int a);
22inline RR(INIT_VAL_TYPE, long a);
23inline RR(INIT_VAL_TYPE, unsigned int a);
24inline RR(INIT_VAL_TYPE, unsigned long a);
25inline RR(INIT_VAL_TYPE, float a);
26inline RR(INIT_VAL_TYPE, double a);
27inline RR(INIT_VAL_TYPE, const xdouble& a);
28inline RR(INIT_VAL_TYPE, const quad_float& a);
29inline RR(INIT_VAL_TYPE, const char *a);  // read from string
30inline RR(INIT_VAL_TYPE, const RR& a);
31
32
33inline RR& operator=(double a);
34
35RR(RR& z, INIT_TRANS_TYPE) : x(z.x, INIT_TRANS), e(z.e) { } 
36
37
38
39
40
41~RR() { }
42
43const ZZ& mantissa() const { return x; }
44long exponent() const { return e; }
45
46static long prec;
47static void SetPrecision(long p);
48static long precision() { return prec; }
49
50static long oprec;
51static void SetOutputPrecision(long p);
52static long OutputPrecision() { return oprec; }
53
54#ifdef NTL_TRANSITION
55private:
56RR& operator=(const RR&);
57RR(const RR&);
58#endif
59
60};
61
62
63long IsZero(const RR& a);
64long IsOne(const RR& a);
65long sign(const RR& a);
66void clear(RR& z);
67void set(RR& z);
68void swap(RR& a, RR& b);
69
70void add(RR& z, const RR& a, const RR& b);
71
72void add(RR& z, const RR& a, double b);
73inline void add(RR& z, double a, const RR& b) { add(z, b, a); }
74
75
76
77void sub(RR& z, const RR& a, const RR& b);
78
79void sub(RR& z, const RR& a, double b);
80void sub(RR& z, double a, const RR& b);
81
82void negate(RR& z, const RR& a);
83
84void abs(RR& z, const RR& a);
85inline RR abs(const RR& a)
86   { RR z; abs(z, a); NTL_OPT_RETURN(RR, z); }
87inline RR fabs(const RR& a)
88   { RR z; abs(z, a); NTL_OPT_RETURN(RR, z); }
89
90void mul(RR& z, const RR& a, const RR& b);
91
92void mul(RR& z, const RR& a, double b);
93inline void mul(RR& z, double a, const RR& b) { mul(z, b, a); }
94
95void sqr(RR& z, const RR& a);
96inline RR sqr(const RR& a)
97   { RR z; sqr(z, a); NTL_OPT_RETURN(RR, z); }
98
99void div(RR& z, const RR& a, const RR& b);
100
101void div(RR& z, const RR& a, double b);
102void div(RR& z, double a, const RR& b);
103
104void inv(RR& z, const RR& a);
105inline RR inv(const RR& a)
106   { RR z; inv(z, a); NTL_OPT_RETURN(RR, z); }
107
108// operator notation:
109
110inline RR operator+(const RR& a, const RR& b)
111   { RR x; add(x, a, b); NTL_OPT_RETURN(RR, x); }
112
113inline RR operator+(const RR& a, double b)
114   { RR x; add(x, a, b); NTL_OPT_RETURN(RR, x); }
115
116inline RR operator+(double a, const RR& b)
117   { RR x; add(x, a, b); NTL_OPT_RETURN(RR, x); }
118
119inline RR& operator+=(RR& x, const RR& b)
120   { add(x, x, b); return x; } 
121
122inline RR& operator+=(RR& x, double b)
123   { add(x, x, b); return x; } 
124
125
126
127inline RR operator-(const RR& a, const RR& b)
128   { RR x; sub(x, a, b); NTL_OPT_RETURN(RR, x); }
129
130inline RR operator-(const RR& a, double b)
131   { RR x; sub(x, a, b); NTL_OPT_RETURN(RR, x); }
132
133inline RR operator-(double a, const RR& b)
134   { RR x; sub(x, a, b); NTL_OPT_RETURN(RR, x); }
135
136inline RR& operator-=(RR& x, const RR& b)
137   { sub(x, x, b); return x; } 
138
139inline RR& operator-=(RR& x, double b)
140   { sub(x, x, b); return x; } 
141
142
143
144inline RR operator*(const RR& a, const RR& b)
145   { RR x; mul(x, a, b); NTL_OPT_RETURN(RR, x); }
146
147inline RR operator*(const RR& a, double b)
148   { RR x; mul(x, a, b); NTL_OPT_RETURN(RR, x); }
149
150inline RR operator*(double a, const RR& b)
151   { RR x; mul(x, a, b); NTL_OPT_RETURN(RR, x); }
152
153inline RR& operator*=(RR& x, const RR& b)
154   { mul(x, x, b); return x; } 
155
156inline RR& operator*=(RR& x, double b)
157   { mul(x, x, b); return x; } 
158
159
160inline RR operator/(const RR& a, const RR& b)
161   { RR x; div(x, a, b); NTL_OPT_RETURN(RR, x); }
162
163inline RR operator/(const RR& a, double b)
164   { RR x; div(x, a, b); NTL_OPT_RETURN(RR, x); }
165
166inline RR operator/(double a, const RR& b)
167   { RR x; div(x, a, b); NTL_OPT_RETURN(RR, x); }
168
169inline RR& operator/=(RR& x, const RR& b)
170   { div(x, x, b); return x; } 
171
172inline RR& operator/=(RR& x, double b)
173   { div(x, x, b); return x; } 
174
175
176inline RR operator-(const RR& a)
177   { RR x; negate(x, a); NTL_OPT_RETURN(RR, x); }
178
179
180inline RR& operator++(RR& x) { add(x, x, 1); return x; }
181inline void operator++(RR& x, int) { add(x, x, 1); }
182inline RR& operator--(RR& x) { sub(x, x, 1); return x; }
183inline void operator--(RR& x, int) { sub(x, x, 1); }
184
185
186
187long compare(const RR& a, const RR& b);
188
189long compare(const RR& a, double b);
190inline long compare(double a, const RR& b) { return -compare(b, a); }
191
192
193long operator==(const RR& a, const RR& b);
194inline long operator!=(const RR& a, const RR& b) { return !(a == b); }
195inline long operator<=(const RR& a, const RR& b) { return compare(a, b) <= 0; }
196inline long operator>=(const RR& a, const RR& b) { return compare(a, b) >= 0; }
197inline long operator <(const RR& a, const RR& b) { return compare(a, b)  < 0; }
198inline long operator >(const RR& a, const RR& b) { return compare(a, b)  > 0; }
199
200long operator==(const RR& a, double b);
201inline long operator!=(const RR& a, double b) { return !(a == b); }
202inline long operator<=(const RR& a, double b) { return compare(a, b) <= 0; }
203inline long operator>=(const RR& a, double b) { return compare(a, b) >= 0; }
204inline long operator <(const RR& a, double b) { return compare(a, b)  < 0; }
205inline long operator >(const RR& a, double b) { return compare(a, b)  > 0; }
206
207inline long operator==(double a, const RR& b) { return (b == a); }
208inline long operator!=(double a, const RR& b) { return !(a == b); }
209inline long operator<=(double a, const RR& b) { return compare(a, b) <= 0; }
210inline long operator>=(double a, const RR& b) { return compare(a, b) >= 0; }
211inline long operator <(double a, const RR& b) { return compare(a, b)  < 0; }
212inline long operator >(double a, const RR& b) { return compare(a, b)  > 0; }
213
214void ceil(RR& z, const RR& a);
215inline RR ceil(const RR& a)
216   { RR z; ceil(z, a); NTL_OPT_RETURN(RR, z); }
217
218void floor(RR& z, const RR& a);
219inline RR floor(const RR& a)
220   { RR z; floor(z, a); NTL_OPT_RETURN(RR, z); }
221
222void trunc(RR& z, const RR& a);
223inline RR trunc(const RR& a)
224   { RR z; trunc(z, a); NTL_OPT_RETURN(RR, z); }
225
226void round(RR& z, const RR& a);
227inline RR round(const RR& a)
228   { RR z; round(z, a); NTL_OPT_RETURN(RR, z); }
229
230void RoundToPrecision(RR& z, const RR& a, long p);
231inline RR RoundToPrecision(const RR& a, long p)
232   { RR z; RoundToPrecision(z, a, p); NTL_OPT_RETURN(RR, z); }
233
234
235void conv(RR& z, const ZZ& a);
236void conv(RR& z, long a);
237inline void conv(RR& z, int a) { conv(z, long(a)); }
238void conv(RR& z, unsigned long a);
239inline void conv(RR& z, unsigned int a) { conv(z, (unsigned long)(a)); }
240void conv(RR& z, const char *s);
241void conv(RR& z, double a);
242inline void conv(RR& z, float a) { conv(z, double(a)); }
243void conv(RR& z, const xdouble& a);
244void conv(RR& z, const quad_float& a);
245
246void conv(RR& z, const RR& a);
247
248
249
250inline RR::RR(INIT_VAL_TYPE, int a) { e = 0; conv(*this, a); }
251inline RR::RR(INIT_VAL_TYPE, long a) { e = 0; conv(*this, a); }
252inline RR::RR(INIT_VAL_TYPE, unsigned int a) { e = 0; conv(*this, a); }
253inline RR::RR(INIT_VAL_TYPE, unsigned long a) { e = 0; conv(*this, a); }
254inline RR::RR(INIT_VAL_TYPE, float a) { e = 0; conv(*this, a); }
255inline RR::RR(INIT_VAL_TYPE, double a) { e = 0; conv(*this, a); }
256
257inline RR::RR(INIT_VAL_TYPE, const RR& a) { e = 0; conv(*this, a); }
258inline RR::RR(INIT_VAL_TYPE, const ZZ& a) { e = 0; conv(*this, a); }
259inline RR::RR(INIT_VAL_TYPE, const xdouble& a) { e = 0; conv(*this, a); }
260inline RR::RR(INIT_VAL_TYPE, const quad_float& a) { e = 0; conv(*this, a); }
261inline RR::RR(INIT_VAL_TYPE, const char *a) { e = 0; conv(*this, a); }
262
263
264inline RR to_RR(int a) { return RR(INIT_VAL, a); }
265inline RR to_RR(long a) { return RR(INIT_VAL, a); }
266inline RR to_RR(unsigned int a) { return RR(INIT_VAL, a); }
267inline RR to_RR(unsigned long a) { return RR(INIT_VAL, a); }
268inline RR to_RR(float a) { return RR(INIT_VAL, a); }
269inline RR to_RR(double a) { return RR(INIT_VAL, a); }
270inline RR to_RR(const ZZ& a) { return RR(INIT_VAL, a); }
271inline RR to_RR(const RR& a) { return RR(INIT_VAL, a); }
272inline RR to_RR(const xdouble& a) { return RR(INIT_VAL, a); }
273inline RR to_RR(const quad_float& a) { return RR(INIT_VAL, a); }
274inline RR to_RR(const char *a) { return RR(INIT_VAL, a); }
275
276inline RR& RR::operator=(double a) { conv(*this, a); return *this; }
277
278void conv(ZZ& z, const RR& a);
279void conv(long& z, const RR& a);
280void conv(double& z, const RR& a);
281void conv(xdouble& z, const RR& a);
282void conv(quad_float& z, const RR& a);
283
284inline void conv(int& z, const RR& a) 
285   { long t; conv(t, a); z = int(t); }
286
287inline void conv(float& z, const RR& a) 
288   { double t; conv(t, a); z = float(t); }
289
290inline int to_int(const RR& a) { int z; conv(z, a); return z; }
291inline long to_long(const RR& a) { long z; conv(z, a); return z; }
292inline float to_float(const RR& a) { float z; conv(z, a); return z; }
293inline double to_double(const RR& a) { double z; conv(z, a); return z; }
294
295inline xdouble to_xdouble(const RR& a) 
296   { xdouble z; conv(z, a); return z; }
297inline quad_float to_quad_float(const RR& a) 
298   { quad_float z; conv(z, a); return z; }
299
300inline ZZ to_ZZ(const RR& a)
301   { ZZ z; conv(z, a); NTL_OPT_RETURN(ZZ, z); }
302
303void CeilToZZ(ZZ& z, const RR& a);
304inline ZZ CeilToZZ(const RR& a)
305   { ZZ z; CeilToZZ(z, a); NTL_OPT_RETURN(ZZ, z); }
306
307void TruncToZZ(ZZ& z, const RR& a);
308inline ZZ TruncToZZ(const RR& a)
309   { ZZ z; TruncToZZ(z, a); NTL_OPT_RETURN(ZZ, z); }
310
311void RoundToZZ(ZZ& z, const RR& a);
312inline ZZ RoundToZZ(const RR& a)
313   { ZZ z; RoundToZZ(z, a); NTL_OPT_RETURN(ZZ, z); }
314
315inline void FloorToZZ(ZZ& z, const RR& a) { conv(z, a); }
316inline ZZ FloorToZZ(const RR& a)
317   { ZZ z; conv(z, a); NTL_OPT_RETURN(ZZ, z); }
318
319void MakeRR(RR& z, const ZZ& a,  long e);
320inline RR MakeRR(const ZZ& a,  long e)
321   { RR z; MakeRR(z, a, e); NTL_OPT_RETURN(RR, z); }
322
323void random(RR& z);
324inline RR random_RR() 
325   { RR z; random(z); NTL_OPT_RETURN(RR, z); }
326
327
328void power(RR& z, const RR& a, long e);
329inline RR power(const RR& a, long e)
330   { RR z; power(z, a, e); NTL_OPT_RETURN(RR, z); }
331
332void power2(RR& z, long e);
333
334inline RR power2_RR(long e)
335   { RR z; power2(z, e); NTL_OPT_RETURN(RR, z); }
336
337NTL_SNS ostream& operator<<(NTL_SNS ostream& s, const RR& a);
338NTL_SNS istream& operator>>(NTL_SNS istream& s, RR& x);
339
340
341void SqrRoot(RR& x, const RR& a);
342inline RR SqrRoot(const RR& a)
343   { RR z; SqrRoot(z, a); NTL_OPT_RETURN(RR, z); }
344inline RR sqrt(const RR& a)
345   { RR z; SqrRoot(z, a); NTL_OPT_RETURN(RR, z); }
346
347void exp(RR& res, const RR& x);
348inline RR exp(const RR& a)
349   { RR z; exp(z, a); NTL_OPT_RETURN(RR, z); }
350
351void log(RR& res, const RR& x);
352inline RR log(const RR& a)
353   { RR z; log(z, a); NTL_OPT_RETURN(RR, z); }
354
355void log10(RR& res, const RR& x);
356inline RR log10(const RR& a)
357   { RR z; log10(z, a); NTL_OPT_RETURN(RR, z); }
358
359void expm1(RR& res, const RR& x);
360inline RR expm1(const RR& a)
361   { RR z; expm1(z, a); NTL_OPT_RETURN(RR, z); }
362
363void log1p(RR& res, const RR& x);
364inline RR log1p(const RR& a)
365   { RR z; log1p(z, a); NTL_OPT_RETURN(RR, z); }
366
367void pow(RR& res, const RR& x, const RR& y);
368inline RR pow(const RR& x, const RR& y)
369   { RR z; pow(z, x, y); NTL_OPT_RETURN(RR, z); }
370
371void ComputePi(RR& res);
372inline RR ComputePi_RR()
373   { RR z; ComputePi(z); NTL_OPT_RETURN(RR, z); }
374
375void sin(RR& res, const RR& x);
376inline RR sin(const RR& a)
377   { RR z; sin(z, a); NTL_OPT_RETURN(RR, z); }
378
379void cos(RR& res, const RR& x);
380inline RR cos(const RR& a)
381   { RR z; cos(z, a); NTL_OPT_RETURN(RR, z); }
382
383
384
385
386NTL_CLOSE_NNS
387
388#endif
Note: See TracBrowser for help on using the repository browser.