vnl_bignum.h
Go to the documentation of this file.
1 // This is core/vnl/vnl_bignum.h
2 #ifndef vnl_bignum_h_
3 #define vnl_bignum_h_
4 //:
5 // \file
6 // \brief Infinite precision integers
7 //
8 // The vnl_bignum class implements near-infinite precision integers
9 // and arithmetic by using a dynamic bit vector. A
10 // vnl_bignum object will grow in size as necessary to hold its
11 // integer value. Implicit conversion to the system defined
12 // types: short, int, long, float, double and long double
13 // is supported by overloaded operator member functions.
14 // Addition and subtraction operators are performed by
15 // simple bitwise addition and subtraction on
16 // unsigned short boundaries with checks for carry flag propagation.
17 // The multiplication, division, and remainder operations
18 // utilize the algorithms from Knuth's Volume 2 of "The
19 // Art of Computer Programming". However, despite the use of
20 // these algorithms and inline member functions, arithmetic
21 // operations on vnl_bignum objects are considerably slower than
22 // the built-in integer types that use hardware integer arithmetic
23 // capabilities.
24 //
25 // The vnl_bignum class supports the parsing of character string
26 // representations of all the literal number formats, PLUS the
27 // strings "Infinity", "+Infinity" and "-Infinity". The following
28 // table shows an example of a character string
29 // representation on the left and a brief description of the
30 // interpreted meaning on the right:
31 //
32 // Character String Interpreted Meaning
33 // 1234 1234
34 // 1234l 1234
35 // 1234L 1234
36 // 1234u 1234
37 // 1234U 1234
38 // 1234ul 1234
39 // 1234UL 1234
40 // 01234 1234 in octal (leading 0)
41 // 0x1234 1234 in hexadecimal (leading 0x)
42 // 0X1234 1234 in hexadecimal (leading 0X)
43 // 123.4 123 (value truncated)
44 // 1.234e2 123 (exponent expanded/truncated)
45 // 1.234e-5 0 (truncated value less than 1)
46 // Infinity +Inf ("maxval", obeying all conventional arithmetic)
47 //
48 // \author
49 // Copyright (C) 1991 Texas Instruments Incorporated.
50 //
51 // Permission is granted to any individual or institution to use, copy, modify,
52 // and distribute this software, provided that this complete copyright and
53 // permission notice is maintained, intact, in all copies and supporting
54 // documentation.
55 //
56 // Texas Instruments Incorporated provides this software "as is" without
57 // express or implied warranty.
58 //
59 // \verbatim
60 // Modifications
61 // Peter Vanroose, 24 January 2002: ported to vnl from COOL
62 // Peter Vanroose, 7 September 2002: added "Infinity" (incl. all arithmetic)
63 // Ian Scott, 23 March 2004: made ++ and -- much more efficient.
64 // Peter Vanroose, March 2008: try to fix divide bug: partially succeeded
65 // Peter Vanroose, June 2009: finally fixed this long standing divide bug
66 // \endverbatim
67 
68 #include <iostream>
69 #include <string>
70 #ifdef _MSC_VER
71 # include <vcl_msvc_warnings.h>
72 #endif
73 #include "vnl/vnl_export.h"
74 
75 class vnl_bignum;
76 
77 // These are all auxiliary functions:
78 
79 VNL_EXPORT int magnitude_cmp(const vnl_bignum&, const vnl_bignum&);
80 VNL_EXPORT void add(const vnl_bignum&, const vnl_bignum&, vnl_bignum&);
81 VNL_EXPORT void subtract(const vnl_bignum&, const vnl_bignum&, vnl_bignum&);
82 VNL_EXPORT void multiply_aux(const vnl_bignum&, unsigned short d, vnl_bignum&, unsigned short i);
83 VNL_EXPORT unsigned short normalize(const vnl_bignum&, const vnl_bignum&, vnl_bignum&, vnl_bignum&);
84 VNL_EXPORT void divide_aux(const vnl_bignum&, unsigned short, vnl_bignum&, unsigned short&);
85 VNL_EXPORT unsigned short estimate_q_hat(const vnl_bignum&, const vnl_bignum&, unsigned short);
86 VNL_EXPORT unsigned short multiply_subtract(vnl_bignum&, const vnl_bignum&, unsigned short, unsigned short);
87 VNL_EXPORT void divide(const vnl_bignum&, const vnl_bignum&, vnl_bignum&, vnl_bignum&);
88 VNL_EXPORT vnl_bignum left_shift(const vnl_bignum& b1, int l);
89 VNL_EXPORT vnl_bignum right_shift(const vnl_bignum& b1, int l);
90 VNL_EXPORT void decrement (vnl_bignum& bnum);
91 VNL_EXPORT void increment (vnl_bignum& bnum);
92 
93 //: formatted output
94 // \relatesalso vnl_bignum
95 VNL_EXPORT std::ostream& operator<<(std::ostream& s, vnl_bignum const& r);
96 
97 //: simple input
98 // \relatesalso vnl_bignum
99 VNL_EXPORT std::istream& operator>>(std::istream& s, vnl_bignum& r);
100 
101 //: Infinite precision integers
102 //
103 // The vnl_bignum class implements near-infinite precision integers
104 // and arithmetic by using a dynamic bit vector. A
105 // vnl_bignum object will grow in size as necessary to hold its
106 // integer value. Implicit conversion to the system defined
107 // types: short, int, long, float, double and long double
108 // is supported by overloaded operator member functions.
109 // Addition and subtraction operators are performed by
110 // simple bitwise addition and subtraction on
111 // unsigned short boundaries with checks for carry flag propagation.
112 // The multiplication, division, and remainder operations
113 // utilize the algorithms from Knuth's Volume 2 of "The
114 // Art of Computer Programming". However, despite the use of
115 // these algorithms and inline member functions, arithmetic
116 // operations on vnl_bignum objects are considerably slower than
117 // the built-in integer types that use hardware integer arithmetic
118 // capabilities.
119 //
120 // The vnl_bignum class supports the parsing of character string
121 // representations of all the literal number formats, PLUS the
122 // strings "Infinity", "+Infinity" and "-Infinity". The following
123 // table shows an example of a character string
124 // representation on the left and a brief description of the
125 // interpreted meaning on the right:
126 //
127 // Character String Interpreted Meaning
128 // 1234 1234
129 // 1234l 1234
130 // 1234L 1234
131 // 1234u 1234
132 // 1234U 1234
133 // 1234ul 1234
134 // 1234UL 1234
135 // 01234 1234 in octal (leading 0)
136 // 0x1234 1234 in hexadecimal (leading 0x)
137 // 0X1234 1234 in hexadecimal (leading 0X)
138 // 123.4 123 (value truncated)
139 // 1.234e2 123 (exponent expanded/truncated)
140 // 1.234e-5 0 (truncated value less than 1)
141 // Infinity +Inf ("maxval", obeying all conventional arithmetic)
142 //
143 class VNL_EXPORT vnl_bignum
144 {
145  private:
146  unsigned short count; // Number of data elements (never 0 except for "0")
147  int sign; // Sign of vnl_bignum (+1 or -1, nothing else!!)
148  unsigned short* data; // Pointer to data value
149  public:
150  vnl_bignum(); // Void constructor
151  vnl_bignum(long); // Long constructor
152  vnl_bignum(unsigned long); // Unsigned Long constructor
153  vnl_bignum(int); // Int constructor
154  vnl_bignum(unsigned int); // Unsigned Int constructor
155  vnl_bignum(float); // Float constructor
156  vnl_bignum(double); // Double constructor
157  vnl_bignum(long double); // Long Double constructor
158  vnl_bignum(vnl_bignum const&); // Copy constructor
159  vnl_bignum(const char*); // String constructor
160  ~vnl_bignum(); // Destructor
161 
162  operator short() const; // Implicit type conversion
163  operator int() const; // Implicit type conversion
164  operator long() const; // Implicit type conversion
165  operator float() const; // Implicit type conversion
166  operator double() const; // Implicit type conversion
167  operator long double() const; // Implicit type conversion
168  inline operator short() { return ((const vnl_bignum*)this)->operator short(); }
169  inline operator int() { return ((const vnl_bignum*)this)->operator int(); }
170  inline operator long() { return ((const vnl_bignum*)this)->operator long(); }
171  inline operator float() { return ((const vnl_bignum*)this)->operator float(); }
172  inline operator double() { return ((const vnl_bignum*)this)->operator double(); }
173  inline operator long double() { return ((const vnl_bignum*)this)->operator long double(); }
174 
175  vnl_bignum operator-() const; // Unary minus operator
176  inline vnl_bignum operator+() const { return *this; } // Unary plus operator
177 
178  vnl_bignum& operator=(const vnl_bignum&); // Assignment operator
179 
180  vnl_bignum operator<<(int l) const; // Bit shift
181  vnl_bignum operator>>(int l) const; // Bit shift
182  vnl_bignum operator+(vnl_bignum const& r) const;
183  inline vnl_bignum& operator+=(vnl_bignum const& r) { return *this = operator+(r); }
184  inline vnl_bignum& operator-=(vnl_bignum const& r) { return *this = operator+(-r); }
185  vnl_bignum& operator*=(vnl_bignum const& r);
186  vnl_bignum& operator/=(vnl_bignum const& r);
187  vnl_bignum& operator%=(vnl_bignum const& r);
188  inline vnl_bignum& operator<<=(int l) { return *this = *this << l; }
189  inline vnl_bignum& operator>>=(int l) { return *this = *this >> l; }
190 
191  //: prefix increment (++b)
192  vnl_bignum& operator++();
193  //: decrement
194  vnl_bignum& operator--();
195  //: postfix increment (b++)
196  inline vnl_bignum operator++(int) { vnl_bignum b=(*this); operator++(); return b; }
197  //: decrement
198  inline vnl_bignum operator--(int) { vnl_bignum b=(*this); operator--(); return b; }
199 
200  bool operator==(vnl_bignum const&) const; // equality
201  bool operator< (vnl_bignum const&) const; // less than
202  inline bool operator!=(vnl_bignum const& r) const { return !operator==(r); }
203  inline bool operator> (vnl_bignum const& r) const { return r<(*this); }
204  inline bool operator<=(vnl_bignum const& r) const { return !operator>(r); }
205  inline bool operator>=(vnl_bignum const& r) const { return !operator<(r); }
206  inline bool operator==(long r) const { return operator==(vnl_bignum(r)); }
207  inline bool operator!=(long r) const { return !operator==(vnl_bignum(r)); }
208  inline bool operator< (long r) const { return operator<(vnl_bignum(r)); }
209  inline bool operator> (long r) const { return vnl_bignum(r) < (*this); }
210  inline bool operator<=(long r) const { return !operator>(vnl_bignum(r)); }
211  inline bool operator>=(long r) const { return !operator<(vnl_bignum(r)); }
212  inline bool operator==(int r) const { return operator==(long(r)); }
213  inline bool operator!=(int r) const { return !operator==(long(r)); }
214  inline bool operator< (int r) const { return operator<(long(r)); }
215  inline bool operator> (int r) const { return vnl_bignum(long(r)) < (*this); }
216  inline bool operator<=(int r) const { return !operator>(long(r)); }
217  inline bool operator>=(int r) const { return !operator<(long(r)); }
218  inline bool operator==(double r) const { return r == this->operator double(); }
219  inline bool operator!=(double r) const { return r != this->operator double(); }
220  inline bool operator< (double r) const { return r > this->operator double(); }
221  inline bool operator> (double r) const { return r < this->operator double(); }
222  inline bool operator<=(double r) const { return r >= this->operator double(); }
223  inline bool operator>=(double r) const { return r <= this->operator double(); }
224  inline bool operator==(long double r) const { return r == this->operator long double(); }
225  inline bool operator!=(long double r) const { return r != this->operator long double(); }
226  inline bool operator< (long double r) const { return r > this->operator long double(); }
227  inline bool operator> (long double r) const { return r < this->operator long double(); }
228  inline bool operator<=(long double r) const { return r >= this->operator long double(); }
229  inline bool operator>=(long double r) const { return r <= this->operator long double(); }
230 
231  inline vnl_bignum abs() const { return operator<(0L) ? operator-() : *this; }
232 
233  // "+/-Inf" is represented as: count=1, data[0]=0, sign=+/-1 :
234  inline bool is_infinity() const { return count==1 && data && data[0]==0; }
235  inline bool is_plus_infinity() const { return is_infinity() && sign==1; }
236  inline bool is_minus_infinity() const { return is_infinity() && sign==-1; }
237 
238  void dump(std::ostream& = std::cout) const; // Dump contents of vnl_bignum
239 
240  friend int magnitude_cmp(const vnl_bignum&, const vnl_bignum&);
241  friend void add(const vnl_bignum&, const vnl_bignum&, vnl_bignum&);
242  friend void subtract(const vnl_bignum&, const vnl_bignum&, vnl_bignum&);
243  friend void increment (vnl_bignum& bnum);
244  friend void decrement (vnl_bignum& bnum);
245  friend void multiply_aux(const vnl_bignum&, unsigned short, vnl_bignum&, unsigned short);
246  friend unsigned short normalize(const vnl_bignum&, const vnl_bignum&, vnl_bignum&, vnl_bignum&);
247  friend void divide_aux(const vnl_bignum&, unsigned short, vnl_bignum&, unsigned short&);
248  friend unsigned short estimate_q_hat(const vnl_bignum&, const vnl_bignum&, unsigned short);
249  friend unsigned short multiply_subtract(vnl_bignum&, const vnl_bignum&, unsigned short, unsigned short);
250  friend void divide(const vnl_bignum&, const vnl_bignum&, vnl_bignum&, vnl_bignum&);
251  friend vnl_bignum left_shift(const vnl_bignum& b1, int l);
252  friend vnl_bignum right_shift(const vnl_bignum& b1, int l);
253  friend std::ostream& operator<< (std::ostream&, const vnl_bignum&);
254  friend std::istream& operator>> (std::istream&, vnl_bignum&);
255  friend VNL_EXPORT std::string& vnl_bignum_to_string (std::string& s, const vnl_bignum& b);
256  friend VNL_EXPORT vnl_bignum& vnl_bignum_from_string (vnl_bignum& b, const std::string& s);
257 
258  private:
259  void xtoBigNum(const char *s); // convert hex to vnl_bignum
260  int dtoBigNum(const char *s); // convert decimal to vnl_bignum
261  void otoBigNum(const char *s); // convert octal to vnl_bignum
262  void exptoBigNum(const char *s); // convert exponential to vnl_bignum
263 
264  void resize(short); // Resize vnl_bignum data
265  vnl_bignum& trim(); // Trim vnl_bignum data
266 };
267 
268 
269 //: Convert the number to a decimal representation in a string.
270 // \relatesalso vnl_bignum
271 VNL_EXPORT std::string& vnl_bignum_to_string (std::string& s, const vnl_bignum& b);
272 
273 //: Convert the number from a decimal representation in a string.
274 // \relatesalso vnl_bignum
275 VNL_EXPORT vnl_bignum& vnl_bignum_from_string (vnl_bignum& b, const std::string& s);
276 
277 //: Returns the sum of two bignum numbers.
278 // \relatesalso vnl_bignum
279 inline vnl_bignum operator+(vnl_bignum const& r1, long r2) { return r1+vnl_bignum(r2); }
280 inline vnl_bignum operator+(vnl_bignum const& r1, int r2) { return r1+long(r2); }
281 inline vnl_bignum operator+(vnl_bignum const& r1, double r2) { return r1+vnl_bignum(r2); }
282 inline vnl_bignum operator+(vnl_bignum const& r1, long double r2) { return r1+vnl_bignum(r2); }
283 inline vnl_bignum operator+(long r2, vnl_bignum const& r1) { return r1 + r2; }
284 inline vnl_bignum operator+(int r2, vnl_bignum const& r1) { return r1 + r2; }
285 inline vnl_bignum operator+(double r2, vnl_bignum const& r1) { return r1 + r2; }
286 inline vnl_bignum operator+(long double r2, vnl_bignum const& r1) { return r1 + r2; }
287 
288 //: Returns the difference of two bignum numbers.
289 // \relatesalso vnl_bignum
290 inline vnl_bignum operator-(vnl_bignum const& r1, vnl_bignum const& r2) { return r1 + (-r2); }
291 inline vnl_bignum operator-(vnl_bignum const& r1, long r2) { return r1 + (-r2); }
292 inline vnl_bignum operator-(vnl_bignum const& r1, int r2) { return r1 + (-r2); }
293 inline vnl_bignum operator-(vnl_bignum const& r1, double r2) { return r1 + (-r2); }
294 inline vnl_bignum operator-(vnl_bignum const& r1, long double r2) { return r1 + (-r2); }
295 inline vnl_bignum operator-(long r2, vnl_bignum const& r1) { return -(r1 + (-r2)); }
296 inline vnl_bignum operator-(int r2, vnl_bignum const& r1) { return -(r1 + (-r2)); }
297 inline vnl_bignum operator-(double r2, vnl_bignum const& r1) { return -(r1 + (-r2)); }
298 inline vnl_bignum operator-(long double r2, vnl_bignum const& r1) { return -(r1 + (-r2)); }
299 
300 //: Returns the product of two bignum numbers.
301 // \relatesalso vnl_bignum
302 inline vnl_bignum operator*(vnl_bignum const& r1, vnl_bignum const& r2)
303 {
304  vnl_bignum result(r1); return result *= r2;
305 }
306 
307 inline vnl_bignum operator*(vnl_bignum const& r1, long r2)
308 {
309  vnl_bignum result(r1); return result *= vnl_bignum(r2);
310 }
311 
312 inline vnl_bignum operator*(vnl_bignum const& r1, int r2)
313 {
314  vnl_bignum result(r1); return result *= (long)r2;
315 }
316 
317 inline vnl_bignum operator*(vnl_bignum const& r1, double r2)
318 {
319  vnl_bignum result(r1); return result *= (vnl_bignum)r2;
320 }
321 
322 inline vnl_bignum operator*(vnl_bignum const& r1, long double r2)
323 {
324  vnl_bignum result(r1); return result *= (vnl_bignum)r2;
325 }
326 
327 inline vnl_bignum operator*(long r2, vnl_bignum const& r1)
328 {
329  vnl_bignum result(r1); return result *= r2;
330 }
331 
332 inline vnl_bignum operator*(int r2, vnl_bignum const& r1)
333 {
334  vnl_bignum result(r1); return result *= (long)r2;
335 }
336 
337 inline vnl_bignum operator*(double r2, vnl_bignum const& r1)
338 {
339  vnl_bignum result(r1); return result *= (vnl_bignum)r2;
340 }
341 
342 inline vnl_bignum operator*(long double r2, vnl_bignum const& r1)
343 {
344  vnl_bignum result(r1); return result *= (vnl_bignum)r2;
345 }
346 
347 //: Returns the division of two bignum numbers.
348 // \relatesalso vnl_bignum
349 inline vnl_bignum operator/(vnl_bignum const& r1, vnl_bignum const& r2)
350 {
351  vnl_bignum result(r1); return result /= r2;
352 }
353 
354 inline vnl_bignum operator/(vnl_bignum const& r1, long r2)
355 {
356  vnl_bignum result(r1); return result /= r2;
357 }
358 
359 inline vnl_bignum operator/(vnl_bignum const& r1, int r2)
360 {
361  vnl_bignum result(r1); return result /= (long)r2;
362 }
363 
364 inline vnl_bignum operator/(vnl_bignum const& r1, double r2)
365 {
366  vnl_bignum result(r1); return result /= (vnl_bignum)r2;
367 }
368 
369 inline vnl_bignum operator/(vnl_bignum const& r1, long double r2)
370 {
371  vnl_bignum result(r1); return result /= (vnl_bignum)r2;
372 }
373 
374 inline vnl_bignum operator/(long r1, vnl_bignum const& r2)
375 {
376  vnl_bignum result(r1); return result /= r2;
377 }
378 
379 inline vnl_bignum operator/(int r1, vnl_bignum const& r2)
380 {
381  vnl_bignum result((long)r1); return result /= r2;
382 }
383 
384 inline vnl_bignum operator/(double r1, vnl_bignum const& r2)
385 {
386  vnl_bignum result(r1); return result /= r2;
387 }
388 
389 inline vnl_bignum operator/(long double r1, vnl_bignum const& r2)
390 {
391  vnl_bignum result(r1); return result /= r2;
392 }
393 
394 //: Returns the remainder of r1 divided by r2.
395 // \relatesalso vnl_bignum
396 inline vnl_bignum operator%(vnl_bignum const& r1, vnl_bignum const& r2)
397 {
398  vnl_bignum result(r1); return result %= r2;
399 }
400 
401 inline vnl_bignum operator%(vnl_bignum const& r1, long r2)
402 {
403  vnl_bignum result(r1); return result %= vnl_bignum(r2);
404 }
405 
406 inline vnl_bignum operator%(vnl_bignum const& r1, int r2)
407 {
408  vnl_bignum result(r1); return result %= vnl_bignum((long)r2);
409 }
410 
411 inline vnl_bignum operator%(long r1, vnl_bignum const& r2)
412 {
413  vnl_bignum result(r1); return result %= r2;
414 }
415 
416 inline vnl_bignum operator%(int r1, vnl_bignum const& r2)
417 {
418  vnl_bignum result((long)r1); return result %= r2;
419 }
420 
421 // Miscellaneous operators and functions
422 
423 inline bool operator==(long r1, vnl_bignum const& r2) { return r2==r1; }
424 inline bool operator!=(long r1, vnl_bignum const& r2) { return r2!=r1; }
425 inline bool operator< (long r1, vnl_bignum const& r2) { return r2> r1; }
426 inline bool operator> (long r1, vnl_bignum const& r2) { return r2< r1; }
427 inline bool operator<=(long r1, vnl_bignum const& r2) { return r2>=r1; }
428 inline bool operator>=(long r1, vnl_bignum const& r2) { return r2<=r1; }
429 
430 namespace vnl_math
431 {
432  inline vnl_bignum abs(vnl_bignum const& x) { return x.abs(); }
433  inline vnl_bignum squared_magnitude(vnl_bignum const& x) { return x*x; }
434  inline vnl_bignum sqr(vnl_bignum const& x) { return x*x; }
435  inline bool isnan(vnl_bignum const& ) { return false; }
436  inline bool isfinite(vnl_bignum const& x) { return ! x.is_infinity(); }
437 }
438 
439 #endif // vnl_bignum_h_
VNL_EXPORT vnl_bignum left_shift(const vnl_bignum &b1, int l)
left shift (arithmetic) non-infinite vnl_bignum by positive number.
bool operator>=(int r) const
Definition: vnl_bignum.h:217
vnl_bignum operator+(vnl_bignum const &r1, long r2)
Returns the sum of two bignum numbers.
Definition: vnl_bignum.h:279
bool operator<=(double r) const
Definition: vnl_bignum.h:222
bool operator==(long r) const
Definition: vnl_bignum.h:206
bool operator>(long r1, vnl_bignum const &r2)
Definition: vnl_bignum.h:426
bool operator<=(int r) const
Definition: vnl_bignum.h:216
bool operator!=(long double r) const
Definition: vnl_bignum.h:225
unsigned short count
Definition: vnl_bignum.h:146
bool operator<=(vnl_bignum const &r) const
Definition: vnl_bignum.h:204
bool operator!=(int r) const
Definition: vnl_bignum.h:213
VNL_EXPORT vnl_bignum right_shift(const vnl_bignum &b1, int l)
right shift (arithmetic) non-infinite vnl_bignum by positive number.
vnl_bignum & operator-=(vnl_bignum const &r)
Definition: vnl_bignum.h:184
bool is_infinity() const
Definition: vnl_bignum.h:234
VNL_EXPORT void divide_aux(const vnl_bignum &, unsigned short, vnl_bignum &, unsigned short &)
divide a vnl_bignum by a "single digit".
bool operator>=(long r) const
Definition: vnl_bignum.h:211
VNL_EXPORT void subtract(const vnl_bignum &, const vnl_bignum &, vnl_bignum &)
subtract bmin from bmax (unsigned, non-infinite), result in diff.
Definition: vnl_bignum.cxx:947
VNL_EXPORT vnl_bignum & vnl_bignum_from_string(vnl_bignum &b, const std::string &s)
Convert the number from a decimal representation in a string.
Definition: vnl_bignum.cxx:667
real numerical constants.
Definition: vnl_bignum.h:430
VNL_EXPORT void multiply_aux(const vnl_bignum &, unsigned short d, vnl_bignum &, unsigned short i)
multiply a non-infinite vnl_bignum by a "single digit".
bool operator==(long double r) const
Definition: vnl_bignum.h:224
bool operator<=(long r1, vnl_bignum const &r2)
Definition: vnl_bignum.h:427
vnl_bignum squared_magnitude(vnl_bignum const &x)
Definition: vnl_bignum.h:433
VNL_EXPORT unsigned short normalize(const vnl_bignum &, const vnl_bignum &, vnl_bignum &, vnl_bignum &)
normalize two vnl_bignums.
vnl_bignum & operator<<=(int l)
Definition: vnl_bignum.h:188
std::ostream & operator<<(std::ostream &s, vnl_decnum const &r)
decimal output.
Definition: vnl_decnum.h:393
Infinite precision integers.
Definition: vnl_bignum.h:143
bool operator==(long r1, vnl_bignum const &r2)
Definition: vnl_bignum.h:423
bool operator!=(vnl_bignum const &r) const
Definition: vnl_bignum.h:202
bool is_plus_infinity() const
Definition: vnl_bignum.h:235
bool operator==(double r) const
Definition: vnl_bignum.h:218
bool isnan(vnl_bignum const &)
Definition: vnl_bignum.h:435
bool operator<=(long r) const
Definition: vnl_bignum.h:210
vnl_bignum operator+() const
Definition: vnl_bignum.h:176
bool operator==(int r) const
Definition: vnl_bignum.h:212
bool operator==(int r1, vnl_finite_int< N > const &r2)
Definition: vnl_finite.h:385
VNL_EXPORT std::istream & operator>>(std::istream &s, vnl_bignum &r)
simple input.
Definition: vnl_bignum.cxx:354
VNL_EXPORT void increment(vnl_bignum &bnum)
Add 1 to bnum (unsigned, non-infinite).
Definition: vnl_bignum.cxx:928
VNL_EXPORT unsigned short estimate_q_hat(const vnl_bignum &, const vnl_bignum &, unsigned short)
estimate next dividend.
VNL_EXPORT void add(const vnl_bignum &, const vnl_bignum &, vnl_bignum &)
add two non-infinite vnl_bignum values and save their sum.
Definition: vnl_bignum.cxx:887
bool operator>=(vnl_bignum const &r) const
Definition: vnl_bignum.h:205
vnl_bignum & operator>>=(int l)
Definition: vnl_bignum.h:189
vnl_bignum operator-(vnl_bignum const &r1, vnl_bignum const &r2)
Returns the difference of two bignum numbers.
Definition: vnl_bignum.h:290
bool operator>=(long r1, vnl_bignum const &r2)
Definition: vnl_bignum.h:428
vnl_bignum abs() const
Definition: vnl_bignum.h:231
bool isfinite(vnl_bignum const &x)
Definition: vnl_bignum.h:436
vnl_bignum & operator+=(vnl_bignum const &r)
Definition: vnl_bignum.h:183
vnl_bignum operator%(vnl_bignum const &r1, vnl_bignum const &r2)
Returns the remainder of r1 divided by r2.
Definition: vnl_bignum.h:396
unsigned short * data
Definition: vnl_bignum.h:148
VNL_EXPORT void divide(const vnl_bignum &, const vnl_bignum &, vnl_bignum &, vnl_bignum &)
divide b2 into b1, getting quotient q and remainder r.
bool operator!=(double r) const
Definition: vnl_bignum.h:219
bool operator<=(long double r) const
Definition: vnl_bignum.h:228
vnl_bignum abs(vnl_bignum const &x)
Definition: vnl_bignum.h:432
vnl_bignum operator+(vnl_bignum const &r1, long r2)
Returns the sum of two bignum numbers.
Definition: vnl_bignum.h:279
bool operator>=(long double r) const
Definition: vnl_bignum.h:229
VNL_EXPORT std::istream & operator>>(std::istream &s, vnl_decnum &r)
decimal input.
Definition: vnl_decnum.cxx:411
vnl_bignum operator-(vnl_bignum const &r1, vnl_bignum const &r2)
Returns the difference of two bignum numbers.
Definition: vnl_bignum.h:290
bool operator!=(int r1, vnl_finite_int< N > const &r2)
Definition: vnl_finite.h:390
vnl_bignum operator++(int)
postfix increment (b++).
Definition: vnl_bignum.h:196
VNL_EXPORT std::string & vnl_bignum_to_string(std::string &s, const vnl_bignum &b)
Convert the number to a decimal representation in a string.
Definition: vnl_bignum.cxx:643
bool operator!=(long r) const
Definition: vnl_bignum.h:207
VNL_EXPORT void decrement(vnl_bignum &bnum)
Subtract 1 from bnum (unsigned, non-infinite, non-zero).
Definition: vnl_bignum.cxx:969
bool operator<(long r) const
Definition: vnl_bignum.h:208
bool operator<(long r1, vnl_bignum const &r2)
Definition: vnl_bignum.h:425
VNL_EXPORT std::ostream & operator<<(std::ostream &s, vnl_bignum const &r)
formatted output.
Definition: vnl_bignum.cxx:617
bool operator>=(double r) const
Definition: vnl_bignum.h:223
vnl_bignum operator/(vnl_bignum const &r1, vnl_bignum const &r2)
Returns the division of two bignum numbers.
Definition: vnl_bignum.h:349
vnl_bignum operator--(int)
decrement.
Definition: vnl_bignum.h:198
vnl_bignum operator *(vnl_bignum const &r1, vnl_bignum const &r2)
Returns the product of two bignum numbers.
Definition: vnl_bignum.h:302
vnl_bignum sqr(vnl_bignum const &x)
Definition: vnl_bignum.h:434
VNL_EXPORT int magnitude_cmp(const vnl_bignum &, const vnl_bignum &)
compare absolute values of two vnl_bignums.
Definition: vnl_bignum.cxx:988
VNL_EXPORT unsigned short multiply_subtract(vnl_bignum &, const vnl_bignum &, unsigned short, unsigned short)
calculate u - v*q_hat.
VNL_EXPORT bool operator<(vnl_vector< T > const &lhs, vnl_vector< T > const &rhs)
Define a complete ordering on vnl_vector.
Definition: vnl_operators.h:24
bool operator<(int r) const
Definition: vnl_bignum.h:214
bool is_minus_infinity() const
Definition: vnl_bignum.h:236