vnl_decnum.h
Go to the documentation of this file.
1 // This is core/vnl/vnl_decnum.h
2 #ifndef vnl_decnum_h_
3 #define vnl_decnum_h_
4 //:
5 // \file
6 // \brief Infinite precision numbers with decimal arithmetic
7 //
8 // The vnl_decnum class implements infinite precision integers and
9 // floating point numbers, with all necessary arithmetic, by using a
10 // dynamically allocated string of decimals for the mantissa.
11 // Implicit conversion to the system defined types short, int, and long
12 // is supported by overloaded operator member functions and explicit
13 // conversions from these types is available through constructors;
14 // additionally, an implicit "double" constructor is available (mainly
15 // for use with vnl_decnum_traits), without any guarantees.
16 //
17 // Addition and subtraction operators are performed by simple decimal
18 // arithmetic with checks for carry flag propagation.
19 // The multiplication, division, and remainder operations utilize the
20 // naive, commonly known decimal algorithms. Beware that these could be
21 // considerably slower than both the operations on built-in integer
22 // types and those implemented in the class vnl_bignum.
23 // On the other hand, the I/O could be faster since no decimal <==> binary
24 // conversion needs to be performed.
25 // Rounding errors due to imprecise internal representation can never be
26 // made with vnl_decnum, so consider using this class if decimal I/O and
27 // precise arithmetic are crucial.
28 //
29 // Since the internal representation is decimal, there is no overhead
30 // for converting between a vnl_decnum and a decimal character string
31 // representation. Hence, there is a constructor from std::string, there
32 // are both << and >> operators, and a cast method to std::string, all
33 // of them essentially no-ops.
34 //
35 // Decimal point notation is only supported on input; internally,
36 // only the scientific notation (mantissa and exponent) is used, with
37 // integer mantissa (and, on output, without "e exponent" for integers).
38 // Beware that, even for non-integers, the division and modulo operators
39 // are logically speaking integer operations on the mantissa.
40 // E.g., the result of 42e-3 / 30e-4 is 1e1, while 42e-3 / 3e-3 has as
41 // outcome 14, even though numerically 30e-4 == 3e-3.
42 // But then also 42e-3 % 30e-4 returns 12e-3 while 42e-3 % 3e-3 returns 0.
43 // Both results are compatible with
44 // (a/b) * b + (a%b) = a
45 // which is generally true for other integral types as well.
46 //
47 // The difference between using e.g. 1000 and 10e2 is essentially similar to
48 // the use of the "P" format in Cobol: in the former case, a precision of
49 // four digits is kept, while in the latter only two digits are present (with
50 // two zeros implicitly there). Arithmetic is done with the available precision
51 // only, which explains the outcomes of operator/ and operator%. A similar
52 // logic holds for the difference between e.g. 1000e-2 and 10.
53 //
54 // When none of the used vnl_decnum constructor values have an "e" (or when
55 // all constructors that you use in your program are on integers), no "e" is
56 // ever introduced (except when explicitly using the method compactify()).
57 // In that case, vnl_decnum really behaves as an integral type,
58 // very similar to vnl_bignum, and as an extension of int and long.
59 //
60 // In addition to (arbitrary precision) numbers, vnl_decnum also represents
61 // +Infinity, -Infinity, and Nan. Their internal representations are:
62 // (sign,data,exp) = ('+','Inf',0L), ('-','Inf',0L'), and (' ','NaN',0L).
63 // Arithmetic with these entities is as expected: e.g. 1/0=+Inf, 1/Inf=0,
64 // -Inf < n < +Inf, 1+Inf=+Inf, 0/0=NaN, NaN op n = NaN.
65 //
66 // \sa vnl_bignum
67 //
68 // \author Peter Vanroose, ABIS Leuven
69 // \date August 2011
70 //
71 // \verbatim
72 // Modifications
73 // 15 Aug. 2011 - Peter Vanroose - added member exp_ (and non-integer arith)
74 // 16 Aug. 2011 - Peter Vanroose - added Inf & NaN and constructor from double
75 // \endverbatim
76 
77 #include <iostream>
78 #include <string>
79 #include <utility>
80 #include "vnl/vnl_export.h"
81 #ifdef _MSC_VER
82 # include <vcl_msvc_warnings.h>
83 #endif
84 
85 class VNL_EXPORT vnl_decnum
86 {
87  private:
88  char sign_; // Sign of vnl_decnum ('+' or '-'; for zero and NaN, the sign is ' ')
89  std::string data_;// The decimal mantissa data (absolute value)
90  // data_ consists of decimals (0-9) only, guaranteed without
91  // leading zero. This holds even for zero: represented by "".
92  // The only exceptions are "Inf" and "NaN".
93  long exp_; // The exponent; nonnegative for integers. Zero for Inf and NaN.
94 
95  // private constructor: arguments should satisfy the above constraints
96  vnl_decnum(char s, std::string d, long e) : sign_(s), data_(std::move(d)), exp_(e) {}
97  public:
98  std::string data() const { return data_; }
99  char sign() const { return sign_; }
100  long exp () const { return exp_; }
101  //: Default constructor - creates the number zero.
102  vnl_decnum() : sign_(' '), data_(""), exp_(0L) {}
103  // Copy constructor
104  vnl_decnum(vnl_decnum const& r) = default;
105  //: Constructor from string
106  // This is the principal constructor for vnl_decnum; it essentially parses
107  // the input into (in that order) the sign, the mantissa, and the exponent,
108  // which turn out (surprise!) to be the three data members of this class.
109  // Parsing stops at the first unexpected character, so in the worst case
110  // no characters can be used and the decnum is zero.
111  vnl_decnum(std::string const&);
112  vnl_decnum(char const* r) { operator=(std::string(r)); }
113  //: Creates a vnl_decnum from an unsigned long integer.
114  explicit vnl_decnum(unsigned long);
115  //: Creates a vnl_decnum from a long integer.
116  // Uses the "unsigned long" constructor and additionally sets the sign
117  explicit vnl_decnum(long r)
118  : sign_(r<0 ? '-' : r>0 ? '+' : ' ')
119  { vnl_decnum d((unsigned long)(r<0?-r:r)); data_=d.data(); exp_=d.exp(); }
120  //: Creates a vnl_decnum from an unsigned integer.
121  // Uses the "unsigned long" constructor.
122  explicit vnl_decnum(unsigned int r)
123  : sign_(r>0 ? '+' : ' ')
124  { vnl_decnum d((unsigned long)r); data_=d.data(); exp_=d.exp(); }
125  //: Creates a vnl_decnum from an integer.
126  // Uses the "unsigned long" constructor and additionally sets the sign
127  explicit vnl_decnum(int r)
128  : sign_(r<0 ? '-' : r>0 ? '+' : ' ')
129  { vnl_decnum d((unsigned long)(r<0?-r:r)); data_=d.data(); exp_=d.exp(); }
130  //: Creates a vnl_decnum from a double.
131  // No guarantees on the precise result!
132  // Integers will be correctly converted, though.
133  vnl_decnum(double);
134 
135  ~vnl_decnum() = default; // Destructor
136 
137  //: Implicit type conversion to a decimal string
138  operator std::string() const;
139 
140  operator long() const; // type conversion
141  operator unsigned long() const; // type conversion, drop the sign
142  operator int() const; // type conversion
143  operator unsigned int() const; // type conversion, drop the sign
144 
145  //: Unary plus operator
146  inline vnl_decnum operator+() const { return *this; }
147  //: Unary minus operator
148  inline vnl_decnum operator-() const { if (sign_==' ') return *this; else return vnl_decnum(sign_=='-'?'+':'-', data_, exp_); }
149 
150  //: Left "bit" shift operator (actually: digit shift, or exponent translation)
151  inline vnl_decnum operator<<(long int r) const { return sign_==' ' ? *this : vnl_decnum(sign_, data_, exp_+r); }
152  inline vnl_decnum operator<<(int r) const { return operator<<((long int)r); }
153  //: Right "bit" shift operator (actually: digit shift, or exponent translation)
154  inline vnl_decnum operator>>(long int r) const { return sign_==' ' ? *this : vnl_decnum(sign_, data_, exp_-r); }
155  inline vnl_decnum operator>>(int r) const { return operator>>((long int)r); }
156  //: Left "bit" shift operator (actually: digit shift, or exponent translation)
157  inline vnl_decnum& operator<<=(long int r) { if (sign_!=' ') exp_ += r; return *this; }
158  inline vnl_decnum& operator<<=(int r) { if (sign_!=' ') exp_ += r; return *this; }
159  //: Right "bit" shift operator (actually: digit shift, or exponent translation)
160  inline vnl_decnum& operator>>=(long int r) { if (sign_!=' ') exp_ -= r; return *this; }
161  inline vnl_decnum& operator>>=(int r) { if (sign_!=' ') exp_ -= r; return *this; }
162 
163  //: Remove all trailing zeros from the mantissa, and increase the exponent accordingly.
164  // Return the (thus modified) *this.
165  // This effectively compactifies the data representation of *this, and meanwhile increases the exponent.
166  // No other methods have this effect; to the contrary: e.g. operator+(1) often decreases the exponent to 0.
167  vnl_decnum& compactify();
168 
169  //: Expand integers to their non-compactified representation, i.e., without "e" notation.
170  // Other operators (like + or -) might implicitly have this effect, as the implementation here indeed suggests.
171  inline vnl_decnum& expand() { return *this = operator+(1L)-1L; }
172 
173  //: Assignment operator; no compactification or expansion occurs
174  inline vnl_decnum& operator=(const vnl_decnum& r) { sign_=r.sign(); data_=r.data(); exp_=r.exp(); return *this; }
175  //: Sum
176  vnl_decnum operator+(vnl_decnum const& r) const;
177  //: Difference
178  inline vnl_decnum operator-(vnl_decnum const& r) const { return operator+(-r); }
179  //: Product
180  vnl_decnum operator*(vnl_decnum const& r) const;
181  //: division operator
182  // \returns integral part of quotient (long division) of *this with \p r
183  // When \p r is zero, the result is Inf,
184  // unless also *this is zero, in which case the result is NaN.
185  vnl_decnum operator/(vnl_decnum const& r) const;
186  //: modulo operator
187  // \returns remainder of long division of *this with \p r
188  // When \p r is zero, the result equals *this.
189  vnl_decnum operator%(vnl_decnum const& r) const;
190 
191  inline vnl_decnum& operator+=(vnl_decnum const& r) { return *this = operator+(r); }
192  inline vnl_decnum& operator-=(vnl_decnum const& r) { return *this = operator+(-r); }
193  inline vnl_decnum& operator*=(vnl_decnum const& r) { return *this = operator*(r); }
194  inline vnl_decnum& operator/=(vnl_decnum const& r) { return *this = operator/(r); }
195  inline vnl_decnum& operator%=(vnl_decnum const& r) { return *this = operator%(r); }
196 
197  // === overloads for the above operators with other datatypes as rhs:
198 
199  inline vnl_decnum& operator=(std::string const& r) { return operator=(vnl_decnum(r)); }
200  inline vnl_decnum& operator=(char const* r) { return operator=(vnl_decnum(std::string(r))); }
201  inline vnl_decnum& operator=(unsigned long r) { return operator=(vnl_decnum(r)); }
202  inline vnl_decnum& operator=(long r) { return operator=(vnl_decnum(r)); }
203  inline vnl_decnum& operator=(unsigned int r) { return operator=(vnl_decnum(r)); }
204  inline vnl_decnum& operator=(int r) { return operator=(vnl_decnum(r)); }
205  inline vnl_decnum& operator=(double r) { return operator=(vnl_decnum(r)); }
206 
207  inline vnl_decnum operator+(std::string const& r) const { return operator+(vnl_decnum(r)); }
208  inline vnl_decnum operator+(char const* r) const { return operator+(vnl_decnum(std::string(r))); }
209  inline vnl_decnum operator+(unsigned long r) const { return operator+(vnl_decnum(r)); }
210  inline vnl_decnum operator+(long r) const { return operator+(vnl_decnum(r)); }
211  inline vnl_decnum operator+(unsigned int r) const { return operator+(vnl_decnum(r)); }
212  inline vnl_decnum operator+(int r) const { return operator+(vnl_decnum(r)); }
213  inline vnl_decnum operator+(double r) const { return operator+(vnl_decnum(r)); }
214 
215  inline vnl_decnum operator-(std::string const& r) const { return operator-(vnl_decnum(r)); }
216  inline vnl_decnum operator-(char const* r) const { return operator-(vnl_decnum(std::string(r))); }
217  inline vnl_decnum operator-(unsigned long r) const { return operator-(vnl_decnum(r)); }
218  inline vnl_decnum operator-(long r) const { return operator+(vnl_decnum(-r)); }
219  inline vnl_decnum operator-(unsigned int r) const { return operator-(vnl_decnum(r)); }
220  inline vnl_decnum operator-(int r) const { return operator+(vnl_decnum(-r)); }
221  inline vnl_decnum operator-(double r) const { return operator+(vnl_decnum(-r)); }
222 
223  inline vnl_decnum operator*(std::string const& r) const { return operator*(vnl_decnum(r)); }
224  inline vnl_decnum operator*(char const* r) const { return operator*(vnl_decnum(std::string(r))); }
225  inline vnl_decnum operator*(unsigned long r) const { return operator*(vnl_decnum(r)); }
226  inline vnl_decnum operator*(long r) const { return operator*(vnl_decnum(r)); }
227  inline vnl_decnum operator*(unsigned int r) const { return operator*(vnl_decnum(r)); }
228  inline vnl_decnum operator*(int r) const { return operator*(vnl_decnum(r)); }
229  inline vnl_decnum operator*(double r) const { return operator*(vnl_decnum(r)); }
230 
231  inline vnl_decnum operator/(std::string const& r) const { return operator/(vnl_decnum(r)); }
232  inline vnl_decnum operator/(char const* r) const { return operator/(vnl_decnum(std::string(r))); }
233  inline vnl_decnum operator/(unsigned long r) const { return operator/(vnl_decnum(r)); }
234  inline vnl_decnum operator/(long r) const { return operator/(vnl_decnum(r)); }
235  inline vnl_decnum operator/(unsigned int r) const { return operator/(vnl_decnum(r)); }
236  inline vnl_decnum operator/(int r) const { return operator/(vnl_decnum(r)); }
237  inline vnl_decnum operator/(double r) const { return operator/(vnl_decnum(r)); }
238 
239  inline vnl_decnum operator%(std::string const& r) const { return operator%(vnl_decnum(r)); }
240  inline vnl_decnum operator%(char const* r) const { return operator%(vnl_decnum(std::string(r))); }
241  inline vnl_decnum operator%(unsigned long r) const { return operator%(vnl_decnum(r)); }
242  inline vnl_decnum operator%(long r) const { return operator%(vnl_decnum(r)); }
243  inline vnl_decnum operator%(unsigned int r) const { return operator%(vnl_decnum(r)); }
244  inline vnl_decnum operator%(int r) const { return operator%(vnl_decnum(r)); }
245  inline vnl_decnum operator%(double r) const { return operator%(vnl_decnum(r)); }
246 
247  inline vnl_decnum& operator+=(std::string const& r) { return *this = operator+(vnl_decnum(r)); }
248  inline vnl_decnum& operator-=(std::string const& r) { return *this = operator-(vnl_decnum(r)); }
249  inline vnl_decnum& operator*=(std::string const& r) { return *this = operator*(vnl_decnum(r)); }
250  inline vnl_decnum& operator/=(std::string const& r) { return *this = operator/(vnl_decnum(r)); }
251  inline vnl_decnum& operator%=(std::string const& r) { return *this = operator%(vnl_decnum(r)); }
252 
253  inline vnl_decnum& operator+=(char const* r) { return *this = operator+(std::string(r)); }
254  inline vnl_decnum& operator-=(char const* r) { return *this = operator-(std::string(r)); }
255  inline vnl_decnum& operator*=(char const* r) { return *this = operator*(std::string(r)); }
256  inline vnl_decnum& operator/=(char const* r) { return *this = operator/(std::string(r)); }
257  inline vnl_decnum& operator%=(char const* r) { return *this = operator%(std::string(r)); }
258 
259  inline vnl_decnum& operator+=(unsigned long r) { return *this = operator+(vnl_decnum(r)); }
260  inline vnl_decnum& operator-=(unsigned long r) { return *this = operator-(vnl_decnum(r)); }
261  inline vnl_decnum& operator*=(unsigned long r) { return *this = operator*(vnl_decnum(r)); }
262  inline vnl_decnum& operator/=(unsigned long r) { return *this = operator/(vnl_decnum(r)); }
263  inline vnl_decnum& operator%=(unsigned long r) { return *this = operator%(vnl_decnum(r)); }
264 
265  inline vnl_decnum& operator+=(long r) { return *this = operator+(vnl_decnum(r)); }
266  inline vnl_decnum& operator-=(long r) { return *this = operator+(vnl_decnum(-r)); }
267  inline vnl_decnum& operator*=(long r) { return *this = operator*(vnl_decnum(r)); }
268  inline vnl_decnum& operator/=(long r) { return *this = operator/(vnl_decnum(r)); }
269  inline vnl_decnum& operator%=(long r) { return *this = operator%(vnl_decnum(r)); }
270 
271  inline vnl_decnum& operator+=(unsigned int r) { return *this = operator+(vnl_decnum(r)); }
272  inline vnl_decnum& operator-=(unsigned int r) { return *this = operator-(vnl_decnum(r)); }
273  inline vnl_decnum& operator*=(unsigned int r) { return *this = operator*(vnl_decnum(r)); }
274  inline vnl_decnum& operator/=(unsigned int r) { return *this = operator/(vnl_decnum(r)); }
275  inline vnl_decnum& operator%=(unsigned int r) { return *this = operator%(vnl_decnum(r)); }
276 
277  inline vnl_decnum& operator+=(int r) { return *this = operator+(vnl_decnum(r)); }
278  inline vnl_decnum& operator-=(int r) { return *this = operator+(vnl_decnum(-r)); }
279  inline vnl_decnum& operator*=(int r) { return *this = operator*(vnl_decnum(r)); }
280  inline vnl_decnum& operator/=(int r) { return *this = operator/(vnl_decnum(r)); }
281  inline vnl_decnum& operator%=(int r) { return *this = operator%(vnl_decnum(r)); }
282 
283  inline vnl_decnum& operator+=(double r) { return *this = operator+(vnl_decnum(r)); }
284  inline vnl_decnum& operator-=(double r) { return *this = operator+(vnl_decnum(-r)); }
285  inline vnl_decnum& operator*=(double r) { return *this = operator*(vnl_decnum(r)); }
286  inline vnl_decnum& operator/=(double r) { return *this = operator/(vnl_decnum(r)); }
287  inline vnl_decnum& operator%=(double r) { return *this = operator%(vnl_decnum(r)); }
288 
289  //: prefix increment (++b)
290  inline vnl_decnum& operator++() { return *this = operator+(1L); }
291  //: decrement
292  inline vnl_decnum& operator--() { return *this = operator-(1L); }
293  //: postfix increment (b++)
294  inline vnl_decnum operator++(int) { vnl_decnum b=(*this); operator++(); return b; }
295  //: decrement
296  inline vnl_decnum operator--(int) { vnl_decnum b=(*this); operator--(); return b; }
297 
298  bool operator==(vnl_decnum const&) const; // equality
299  bool operator< (vnl_decnum const&) const; // less than
300  inline bool operator!=(vnl_decnum const& r) const { return !operator==(r); }
301  inline bool operator> (vnl_decnum const& r) const { return r<(*this); }
302  inline bool operator<=(vnl_decnum const& r) const { return !operator>(r); }
303  inline bool operator>=(vnl_decnum const& r) const { return !operator<(r); }
304 
305  inline bool operator==(std::string const& r) const { return operator==(vnl_decnum(r)); }
306  inline bool operator< (std::string const& r) const { return operator< (vnl_decnum(r)); }
307  inline bool operator!=(std::string const& r) const { return operator!=(vnl_decnum(r)); }
308  inline bool operator> (std::string const& r) const { return operator> (vnl_decnum(r)); }
309  inline bool operator<=(std::string const& r) const { return operator<=(vnl_decnum(r)); }
310  inline bool operator>=(std::string const& r) const { return operator>=(vnl_decnum(r)); }
311 
312  inline bool operator==(char const* r) const { return operator==(std::string(r)); }
313  inline bool operator< (char const* r) const { return operator< (std::string(r)); }
314  inline bool operator!=(char const* r) const { return operator!=(std::string(r)); }
315  inline bool operator> (char const* r) const { return operator> (std::string(r)); }
316  inline bool operator<=(char const* r) const { return operator<=(std::string(r)); }
317  inline bool operator>=(char const* r) const { return operator>=(std::string(r)); }
318 
319  inline bool operator==(unsigned long r) const { return operator==(vnl_decnum(r)); }
320  inline bool operator< (unsigned long r) const { return operator< (vnl_decnum(r)); }
321  inline bool operator!=(unsigned long r) const { return operator!=(vnl_decnum(r)); }
322  inline bool operator> (unsigned long r) const { return operator> (vnl_decnum(r)); }
323  inline bool operator<=(unsigned long r) const { return operator<=(vnl_decnum(r)); }
324  inline bool operator>=(unsigned long r) const { return operator>=(vnl_decnum(r)); }
325 
326  inline bool operator==(long r) const { return operator==(vnl_decnum(r)); }
327  inline bool operator< (long r) const { return operator< (vnl_decnum(r)); }
328  inline bool operator!=(long r) const { return operator!=(vnl_decnum(r)); }
329  inline bool operator> (long r) const { return operator> (vnl_decnum(r)); }
330  inline bool operator<=(long r) const { return operator<=(vnl_decnum(r)); }
331  inline bool operator>=(long r) const { return operator>=(vnl_decnum(r)); }
332 
333  inline bool operator==(unsigned int r) const { return operator==(vnl_decnum(r)); }
334  inline bool operator< (unsigned int r) const { return operator< (vnl_decnum(r)); }
335  inline bool operator!=(unsigned int r) const { return operator!=(vnl_decnum(r)); }
336  inline bool operator> (unsigned int r) const { return operator> (vnl_decnum(r)); }
337  inline bool operator<=(unsigned int r) const { return operator<=(vnl_decnum(r)); }
338  inline bool operator>=(unsigned int r) const { return operator>=(vnl_decnum(r)); }
339 
340  inline bool operator==(int r) const { return operator==(vnl_decnum(r)); }
341  inline bool operator< (int r) const { return operator< (vnl_decnum(r)); }
342  inline bool operator!=(int r) const { return operator!=(vnl_decnum(r)); }
343  inline bool operator> (int r) const { return operator> (vnl_decnum(r)); }
344  inline bool operator<=(int r) const { return operator<=(vnl_decnum(r)); }
345  inline bool operator>=(int r) const { return operator>=(vnl_decnum(r)); }
346 
347  inline bool operator==(double r) const { return operator==(vnl_decnum(r)); }
348  inline bool operator< (double r) const { return operator< (vnl_decnum(r)); }
349  inline bool operator!=(double r) const { return operator!=(vnl_decnum(r)); }
350  inline bool operator> (double r) const { return operator> (vnl_decnum(r)); }
351  inline bool operator<=(double r) const { return operator<=(vnl_decnum(r)); }
352  inline bool operator>=(double r) const { return operator>=(vnl_decnum(r)); }
353 
354  inline vnl_decnum abs() const { return sign_=='-' ? operator-() : *this; }
355  inline vnl_decnum trunc() const { return exp_>=0L ? *this : vnl_decnum(sign_,data_.substr(0L,data_.length()+exp_),0L); }
356  inline vnl_decnum roundup() const { return operator==(trunc()) ? *this : sign_=='-' ? trunc()-1 : trunc()+1; }
357  inline vnl_decnum floor() const { return sign_=='-' ? roundup() : trunc(); }
358  inline vnl_decnum ceil() const { return sign_=='-' ? trunc() : roundup(); }
359  inline vnl_decnum pow(unsigned long p) const { return p==0L ? vnl_decnum(1L) : p==1L ? *this : pow(p/2)*pow((p+1)/2); }
360 
361  private: // === Helper functions ===
362  //: Returns the sum of the two first arguments (interpreted as mantissas with the same exponent).
363  // Both arguments should consist of digits only.
364  // The third argument will be used as the exponent of the result.
365  static vnl_decnum plus(std::string const&, std::string const&, long);
366  //: Returns the difference of the two first arguments (interpreted as mantissas with the same exponent).
367  // Both arguments should consist of digits only
368  // and the first one should be numerically larger than the second one.
369  // The third argument will be used as the exponent of the result.
370  static vnl_decnum minus(std::string const&, std::string const&, long);
371  //: This is "operator<" for strings.
372  // The arguments should consist of digits only (interpreted as mantissas with the same exponent).
373  // The shorter of the two arguments is implicitly zero-padded.
374  static bool comp(std::string const&, std::string const&);
375  // Append n zeros to the source string, and return the new padded string
376  inline static std::string add_zeros(std::string const& source, unsigned long n)
377  { std::string d = source; while (n--!=0) d.push_back('0'); return d; }
378  //: Returns the product of the two arguments.
379  // The first argument should consist of digits only;
380  // the second argument should be a single digit.
381  static std::string mult(std::string const&, char);
382  //: Returns the largest one-significant-digit divisor of the two arguments.
383  // The largest multiple of the second argument not larger than the first one
384  // is returned in the second argument.
385  // (I.e.: the product of the original second argument with the returned divisor.)
386  // The arguments should consist of digits only
387  // and the first one should be numerically larger than the second one.
388  static std::string div(std::string const&, std::string&);
389 };
390 
391 //: decimal output
392 // \relatesalso vnl_decnum
393 inline std::ostream& operator<<(std::ostream& s, vnl_decnum const& r)
394 { return s << std::string(r); }
395 
396 //: decimal input
397 // \relatesalso vnl_decnum
398 VNL_EXPORT std::istream& operator>>(std::istream& s, vnl_decnum& r);
399 
400 inline vnl_decnum ceil(vnl_decnum const& x) { return x.ceil(); }
401 inline vnl_decnum floor(vnl_decnum const& x) { return x.floor(); }
402 inline vnl_decnum pow(vnl_decnum const& x, unsigned long p) { return x.pow(p); }
403 
404 namespace vnl_math
405 {
406  inline vnl_decnum abs(vnl_decnum const& x) { return x.abs(); }
407  inline vnl_decnum sqr(vnl_decnum const& x) { return x*x; }
408  inline vnl_decnum cube(vnl_decnum const& x) { return x*x*x; }
409  inline vnl_decnum squared_magnitude(vnl_decnum const& x) { return x*x; }
410  inline bool isnan(vnl_decnum const& x) { return x.data() == "NaN"; }
411  inline bool isfinite(vnl_decnum const& x) { return x.data() != "Inf" && x.data() != "NaN"; }
412  inline vnl_decnum max(vnl_decnum const& x, vnl_decnum const& y) { return (x < y) ? y : x; }
413  inline vnl_decnum min(vnl_decnum const& x, vnl_decnum const& y) { return (x < y) ? x : y; }
414  inline int sgn(vnl_decnum x) { return x.sign()==' '?0:x.sign()=='+'?1:-1; }
415  inline int sgn0(vnl_decnum x) { return x.sign()=='-'?-1:1; }
416 }
417 
418 #endif // vnl_decnum_h_
bool operator<=(double r) const
Definition: vnl_decnum.h:351
vnl_decnum operator%(int r) const
Definition: vnl_decnum.h:244
vnl_decnum operator-(unsigned long r) const
Definition: vnl_decnum.h:217
bool operator<=(std::string const &r) const
Definition: vnl_decnum.h:309
vnl_decnum & operator++()
prefix increment (++b).
Definition: vnl_decnum.h:290
vnl_decnum operator+() const
Unary plus operator.
Definition: vnl_decnum.h:146
bool operator!=(char const *r) const
Definition: vnl_decnum.h:314
vnl_decnum & operator/=(long r)
Definition: vnl_decnum.h:268
bool operator>=(double r) const
Definition: vnl_decnum.h:352
bool operator>(long r1, vnl_bignum const &r2)
Definition: vnl_bignum.h:426
vnl_decnum & operator%=(std::string const &r)
Definition: vnl_decnum.h:251
vnl_decnum operator+(unsigned int r) const
Definition: vnl_decnum.h:211
vnl_decnum operator<<(int r) const
Definition: vnl_decnum.h:152
bool operator!=(unsigned int r) const
Definition: vnl_decnum.h:335
vnl_decnum operator+(int r) const
Definition: vnl_decnum.h:212
std::string data_
Definition: vnl_decnum.h:89
vnl_decnum & operator/=(unsigned int r)
Definition: vnl_decnum.h:274
bool operator!=(int r) const
Definition: vnl_decnum.h:342
vnl_decnum operator%(double r) const
Definition: vnl_decnum.h:245
vnl_decnum operator/(char const *r) const
Definition: vnl_decnum.h:232
vnl_decnum operator+(char const *r) const
Definition: vnl_decnum.h:208
vnl_decnum operator/(unsigned long r) const
Definition: vnl_decnum.h:233
vnl_decnum operator/(long r) const
Definition: vnl_decnum.h:234
vnl_decnum operator-(int r) const
Definition: vnl_decnum.h:220
bool operator!=(double r) const
Definition: vnl_decnum.h:349
vnl_decnum & operator/=(std::string const &r)
Definition: vnl_decnum.h:250
vnl_decnum operator-(std::string const &r) const
Definition: vnl_decnum.h:215
vnl_decnum operator+(double r) const
Definition: vnl_decnum.h:213
vnl_decnum & operator=(const vnl_decnum &r)
Assignment operator; no compactification or expansion occurs.
Definition: vnl_decnum.h:174
vnl_decnum & operator-=(double r)
Definition: vnl_decnum.h:284
vnl_decnum operator/(double r) const
Definition: vnl_decnum.h:237
vnl_decnum & operator%=(unsigned int r)
Definition: vnl_decnum.h:275
vnl_decnum & operator=(long r)
Definition: vnl_decnum.h:202
vnl_decnum operator>>(long int r) const
Right "bit" shift operator (actually: digit shift, or exponent translation).
Definition: vnl_decnum.h:154
bool operator>=(std::string const &r) const
Definition: vnl_decnum.h:310
bool operator>=(long r) const
Definition: vnl_decnum.h:331
vnl_decnum & operator%=(char const *r)
Definition: vnl_decnum.h:257
vnl_decnum & operator+=(unsigned int r)
Definition: vnl_decnum.h:271
bool operator==(unsigned long r) const
Definition: vnl_decnum.h:319
long exp_
Definition: vnl_decnum.h:93
vnl_decnum & operator=(unsigned int r)
Definition: vnl_decnum.h:203
vnl_decnum operator--(int)
decrement.
Definition: vnl_decnum.h:296
vnl_decnum & operator<<=(long int r)
Left "bit" shift operator (actually: digit shift, or exponent translation).
Definition: vnl_decnum.h:157
vnl_decnum & operator-=(int r)
Definition: vnl_decnum.h:278
vnl_vector< T > operator *(vnl_matrix_inverse< T > const &i, vnl_vector< T > const &B)
vnl_decnum()
Default constructor - creates the number zero.
Definition: vnl_decnum.h:102
vnl_decnum trunc() const
Definition: vnl_decnum.h:355
vnl_decnum & operator/=(vnl_decnum const &r)
Definition: vnl_decnum.h:194
vnl_decnum(unsigned int r)
Creates a vnl_decnum from an unsigned integer.
Definition: vnl_decnum.h:122
vnl_decnum & operator+=(char const *r)
Definition: vnl_decnum.h:253
bool operator>=(unsigned long r) const
Definition: vnl_decnum.h:324
vnl_decnum(char s, std::string d, long e)
Definition: vnl_decnum.h:96
std::string data() const
Definition: vnl_decnum.h:98
vnl_decnum operator-() const
Unary minus operator.
Definition: vnl_decnum.h:148
real numerical constants.
Definition: vnl_bignum.h:430
vnl_decnum & operator=(std::string const &r)
Definition: vnl_decnum.h:199
vnl_decnum operator/(int r) const
Definition: vnl_decnum.h:236
bool operator!=(vnl_decnum const &r) const
Definition: vnl_decnum.h:300
vnl_decnum ceil(vnl_decnum const &x)
Definition: vnl_decnum.h:400
vnl_decnum & operator-=(long r)
Definition: vnl_decnum.h:266
vnl_decnum & operator%=(unsigned long r)
Definition: vnl_decnum.h:263
char sign() const
Definition: vnl_decnum.h:99
long exp() const
Definition: vnl_decnum.h:100
vnl_decnum & operator+=(vnl_decnum const &r)
Definition: vnl_decnum.h:191
vnl_bignum squared_magnitude(vnl_bignum const &x)
Definition: vnl_bignum.h:433
vnl_decnum & operator+=(unsigned long r)
Definition: vnl_decnum.h:259
std::ostream & operator<<(std::ostream &s, vnl_decnum const &r)
decimal output.
Definition: vnl_decnum.h:393
bool operator>=(char const *r) const
Definition: vnl_decnum.h:317
vnl_decnum & operator%=(vnl_decnum const &r)
Definition: vnl_decnum.h:195
vnl_decnum & operator=(double r)
Definition: vnl_decnum.h:205
vnl_decnum operator++(int)
postfix increment (b++).
Definition: vnl_decnum.h:294
bool operator<=(int r) const
Definition: vnl_decnum.h:344
bool isnan(vnl_bignum const &)
Definition: vnl_bignum.h:435
vnl_decnum & operator-=(unsigned long r)
Definition: vnl_decnum.h:260
vnl_decnum & operator>>=(int r)
Definition: vnl_decnum.h:161
char sign_
Definition: vnl_decnum.h:88
vnl_decnum & operator>>=(long int r)
Right "bit" shift operator (actually: digit shift, or exponent translation).
Definition: vnl_decnum.h:160
bool operator==(char const *r) const
Definition: vnl_decnum.h:312
vnl_decnum(long r)
Creates a vnl_decnum from a long integer.
Definition: vnl_decnum.h:117
int sgn0(vnl_decnum x)
Definition: vnl_decnum.h:415
bool operator<=(char const *r) const
Definition: vnl_decnum.h:316
vnl_decnum operator>>(int r) const
Definition: vnl_decnum.h:155
vnl_decnum & operator%=(int r)
Definition: vnl_decnum.h:281
vnl_decnum & operator<<=(int r)
Definition: vnl_decnum.h:158
vnl_decnum & operator+=(double r)
Definition: vnl_decnum.h:283
vnl_bignum operator-(vnl_bignum const &r1, vnl_bignum const &r2)
Returns the difference of two bignum numbers.
Definition: vnl_bignum.h:290
vnl_decnum operator/(std::string const &r) const
Definition: vnl_decnum.h:231
vnl_decnum operator-(unsigned int r) const
Definition: vnl_decnum.h:219
vnl_decnum roundup() const
Definition: vnl_decnum.h:356
vnl_decnum & operator%=(double r)
Definition: vnl_decnum.h:287
vnl_decnum & operator-=(std::string const &r)
Definition: vnl_decnum.h:248
vnl_decnum & operator+=(long r)
Definition: vnl_decnum.h:265
bool isfinite(vnl_bignum const &x)
Definition: vnl_bignum.h:436
vnl_decnum pow(unsigned long p) const
Definition: vnl_decnum.h:359
bool operator==(double r) const
Definition: vnl_decnum.h:347
vnl_decnum(char const *r)
Definition: vnl_decnum.h:112
vnl_decnum operator-(char const *r) const
Definition: vnl_decnum.h:216
vnl_decnum cube(vnl_decnum const &x)
Definition: vnl_decnum.h:408
vnl_decnum max(vnl_decnum const &x, vnl_decnum const &y)
Definition: vnl_decnum.h:412
vnl_decnum operator%(unsigned long r) const
Definition: vnl_decnum.h:241
vnl_decnum ceil() const
Definition: vnl_decnum.h:358
vnl_decnum operator-(long r) const
Definition: vnl_decnum.h:218
vnl_decnum operator%(char const *r) const
Definition: vnl_decnum.h:240
vnl_decnum pow(vnl_decnum const &x, unsigned long p)
Definition: vnl_decnum.h:402
vnl_decnum operator-(vnl_decnum const &r) const
Difference.
Definition: vnl_decnum.h:178
bool operator>=(int r) const
Definition: vnl_decnum.h:345
bool operator<=(unsigned int r) const
Definition: vnl_decnum.h:337
vnl_decnum operator%(long r) const
Definition: vnl_decnum.h:242
vnl_decnum & operator/=(unsigned long r)
Definition: vnl_decnum.h:262
vnl_decnum operator%(std::string const &r) const
Definition: vnl_decnum.h:239
vnl_decnum & operator-=(char const *r)
Definition: vnl_decnum.h:254
bool operator!=(std::string const &r) const
Definition: vnl_decnum.h:307
bool operator<=(long r) const
Definition: vnl_decnum.h:330
vnl_decnum & operator-=(unsigned int r)
Definition: vnl_decnum.h:272
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
static std::string add_zeros(std::string const &source, unsigned long n)
Definition: vnl_decnum.h:376
bool operator<=(unsigned long r) const
Definition: vnl_decnum.h:323
vnl_decnum operator+(long r) const
Definition: vnl_decnum.h:210
VNL_EXPORT std::istream & operator>>(std::istream &s, vnl_decnum &r)
decimal input.
Definition: vnl_decnum.cxx:411
bool operator==(const vnl_amoeba_SimplexCorner &a, const vnl_amoeba_SimplexCorner &b)
Definition: vnl_amoeba.cxx:143
vnl_decnum min(vnl_decnum const &x, vnl_decnum const &y)
Definition: vnl_decnum.h:413
bool operator>=(vnl_decnum const &r) const
Definition: vnl_decnum.h:303
vnl_decnum & operator+=(std::string const &r)
Definition: vnl_decnum.h:247
bool operator==(int r) const
Definition: vnl_decnum.h:340
vnl_decnum & operator+=(int r)
Definition: vnl_decnum.h:277
bool operator==(std::string const &r) const
Definition: vnl_decnum.h:305
vnl_decnum abs() const
Definition: vnl_decnum.h:354
vnl_decnum operator/(unsigned int r) const
Definition: vnl_decnum.h:235
vnl_bignum operator/(vnl_bignum const &r1, vnl_bignum const &r2)
Returns the division of two bignum numbers.
Definition: vnl_bignum.h:349
bool operator<(long r1, vnl_bignum const &r2)
Definition: vnl_bignum.h:425
vnl_decnum & operator/=(double r)
Definition: vnl_decnum.h:286
vnl_decnum floor() const
Definition: vnl_decnum.h:357
vnl_decnum & operator=(int r)
Definition: vnl_decnum.h:204
vnl_decnum operator+(unsigned long r) const
Definition: vnl_decnum.h:209
vnl_decnum & operator-=(vnl_decnum const &r)
Definition: vnl_decnum.h:192
bool operator!=(unsigned long r) const
Definition: vnl_decnum.h:321
vnl_decnum & operator/=(int r)
Definition: vnl_decnum.h:280
vnl_decnum & operator=(char const *r)
Definition: vnl_decnum.h:200
int sgn(vnl_decnum x)
Definition: vnl_decnum.h:414
bool operator>=(unsigned int r) const
Definition: vnl_decnum.h:338
vnl_decnum floor(vnl_decnum const &x)
Definition: vnl_decnum.h:401
vnl_decnum & operator/=(char const *r)
Definition: vnl_decnum.h:256
vnl_decnum operator%(unsigned int r) const
Definition: vnl_decnum.h:243
vnl_decnum operator<<(long int r) const
Left "bit" shift operator (actually: digit shift, or exponent translation).
Definition: vnl_decnum.h:151
vnl_bignum sqr(vnl_bignum const &x)
Definition: vnl_bignum.h:434
vnl_decnum & expand()
Expand integers to their non-compactified representation, i.e., without "e" notation.
Definition: vnl_decnum.h:171
bool operator!=(long r) const
Definition: vnl_decnum.h:328
vnl_decnum & operator=(unsigned long r)
Definition: vnl_decnum.h:201
vnl_decnum & operator--()
decrement.
Definition: vnl_decnum.h:292
vnl_bignum operator%(vnl_bignum const &r1, vnl_bignum const &r2)
Returns the remainder of r1 divided by r2.
Definition: vnl_bignum.h:396
vnl_decnum operator-(double r) const
Definition: vnl_decnum.h:221
vnl_decnum(int r)
Creates a vnl_decnum from an integer.
Definition: vnl_decnum.h:127
vnl_decnum operator+(std::string const &r) const
Definition: vnl_decnum.h:207
vnl_decnum & operator%=(long r)
Definition: vnl_decnum.h:269
bool operator<=(vnl_decnum const &r) const
Definition: vnl_decnum.h:302
bool operator==(unsigned int r) const
Definition: vnl_decnum.h:333
bool operator==(long r) const
Definition: vnl_decnum.h:326