|
| VNL_EXPORT int | magnitude_cmp (const vnl_bignum &, const vnl_bignum &) |
| | compare absolute values of two vnl_bignums. More...
|
| |
| VNL_EXPORT void | add (const vnl_bignum &, const vnl_bignum &, vnl_bignum &) |
| | add two non-infinite vnl_bignum values and save their sum. More...
|
| |
| VNL_EXPORT void | subtract (const vnl_bignum &, const vnl_bignum &, vnl_bignum &) |
| | subtract bmin from bmax (unsigned, non-infinite), result in diff. More...
|
| |
| 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". More...
|
| |
| VNL_EXPORT unsigned short | normalize (const vnl_bignum &, const vnl_bignum &, vnl_bignum &, vnl_bignum &) |
| | normalize two vnl_bignums. More...
|
| |
| VNL_EXPORT void | divide_aux (const vnl_bignum &, unsigned short, vnl_bignum &, unsigned short &) |
| | divide a vnl_bignum by a "single digit". More...
|
| |
| VNL_EXPORT unsigned short | estimate_q_hat (const vnl_bignum &, const vnl_bignum &, unsigned short) |
| | estimate next dividend. More...
|
| |
| VNL_EXPORT unsigned short | multiply_subtract (vnl_bignum &, const vnl_bignum &, unsigned short, unsigned short) |
| | calculate u - v*q_hat. More...
|
| |
| VNL_EXPORT void | divide (const vnl_bignum &, const vnl_bignum &, vnl_bignum &, vnl_bignum &) |
| | divide b2 into b1, getting quotient q and remainder r. More...
|
| |
| VNL_EXPORT vnl_bignum | left_shift (const vnl_bignum &b1, int l) |
| | left shift (arithmetic) non-infinite vnl_bignum by positive number. More...
|
| |
| VNL_EXPORT vnl_bignum | right_shift (const vnl_bignum &b1, int l) |
| | right shift (arithmetic) non-infinite vnl_bignum by positive number. More...
|
| |
| VNL_EXPORT void | decrement (vnl_bignum &bnum) |
| | Subtract 1 from bnum (unsigned, non-infinite, non-zero). More...
|
| |
| VNL_EXPORT void | increment (vnl_bignum &bnum) |
| | Add 1 to bnum (unsigned, non-infinite). More...
|
| |
| VNL_EXPORT std::ostream & | operator<< (std::ostream &s, vnl_bignum const &r) |
| | formatted output. More...
|
| |
| VNL_EXPORT std::istream & | operator>> (std::istream &s, vnl_bignum &r) |
| | simple input. More...
|
| |
| 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. More...
|
| |
| 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. More...
|
| |
| vnl_bignum | operator+ (vnl_bignum const &r1, long r2) |
| | Returns the sum of two bignum numbers. More...
|
| |
| vnl_bignum | operator+ (vnl_bignum const &r1, int r2) |
| |
| vnl_bignum | operator+ (vnl_bignum const &r1, double r2) |
| |
| vnl_bignum | operator+ (vnl_bignum const &r1, long double r2) |
| |
| vnl_bignum | operator+ (long r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator+ (int r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator+ (double r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator+ (long double r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator- (vnl_bignum const &r1, vnl_bignum const &r2) |
| | Returns the difference of two bignum numbers. More...
|
| |
| vnl_bignum | operator- (vnl_bignum const &r1, long r2) |
| |
| vnl_bignum | operator- (vnl_bignum const &r1, int r2) |
| |
| vnl_bignum | operator- (vnl_bignum const &r1, double r2) |
| |
| vnl_bignum | operator- (vnl_bignum const &r1, long double r2) |
| |
| vnl_bignum | operator- (long r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator- (int r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator- (double r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator- (long double r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator * (vnl_bignum const &r1, vnl_bignum const &r2) |
| | Returns the product of two bignum numbers. More...
|
| |
| vnl_bignum | operator * (vnl_bignum const &r1, long r2) |
| |
| vnl_bignum | operator * (vnl_bignum const &r1, int r2) |
| |
| vnl_bignum | operator * (vnl_bignum const &r1, double r2) |
| |
| vnl_bignum | operator * (vnl_bignum const &r1, long double r2) |
| |
| vnl_bignum | operator * (long r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator * (int r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator * (double r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator * (long double r2, vnl_bignum const &r1) |
| |
| vnl_bignum | operator/ (vnl_bignum const &r1, vnl_bignum const &r2) |
| | Returns the division of two bignum numbers. More...
|
| |
| vnl_bignum | operator/ (vnl_bignum const &r1, long r2) |
| |
| vnl_bignum | operator/ (vnl_bignum const &r1, int r2) |
| |
| vnl_bignum | operator/ (vnl_bignum const &r1, double r2) |
| |
| vnl_bignum | operator/ (vnl_bignum const &r1, long double r2) |
| |
| vnl_bignum | operator/ (long r1, vnl_bignum const &r2) |
| |
| vnl_bignum | operator/ (int r1, vnl_bignum const &r2) |
| |
| vnl_bignum | operator/ (double r1, vnl_bignum const &r2) |
| |
| vnl_bignum | operator/ (long double r1, vnl_bignum const &r2) |
| |
| vnl_bignum | operator% (vnl_bignum const &r1, vnl_bignum const &r2) |
| | Returns the remainder of r1 divided by r2. More...
|
| |
| vnl_bignum | operator% (vnl_bignum const &r1, long r2) |
| |
| vnl_bignum | operator% (vnl_bignum const &r1, int r2) |
| |
| vnl_bignum | operator% (long r1, vnl_bignum const &r2) |
| |
| vnl_bignum | operator% (int r1, vnl_bignum const &r2) |
| |
| bool | operator== (long r1, vnl_bignum const &r2) |
| |
| bool | operator!= (long r1, vnl_bignum const &r2) |
| |
| bool | operator< (long r1, vnl_bignum const &r2) |
| |
| bool | operator> (long r1, vnl_bignum const &r2) |
| |
| bool | operator<= (long r1, vnl_bignum const &r2) |
| |
| bool | operator>= (long r1, vnl_bignum const &r2) |
| |
| vnl_bignum | vnl_math::abs (vnl_bignum const &x) |
| |
| vnl_bignum | vnl_math::squared_magnitude (vnl_bignum const &x) |
| |
| vnl_bignum | vnl_math::sqr (vnl_bignum const &x) |
| |
| bool | vnl_math::isnan (vnl_bignum const &) |
| |
| bool | vnl_math::isfinite (vnl_bignum const &x) |
| |
Infinite precision integers.
The vnl_bignum class implements near-infinite precision integers and arithmetic by using a dynamic bit vector. A vnl_bignum object will grow in size as necessary to hold its integer value. Implicit conversion to the system defined types: short, int, long, float, double and long double is supported by overloaded operator member functions. Addition and subtraction operators are performed by simple bitwise addition and subtraction on unsigned short boundaries with checks for carry flag propagation. The multiplication, division, and remainder operations utilize the algorithms from Knuth's Volume 2 of "The
Art of Computer Programming". However, despite the use of these algorithms and inline member functions, arithmetic operations on vnl_bignum objects are considerably slower than the built-in integer types that use hardware integer arithmetic capabilities.
The vnl_bignum class supports the parsing of character string representations of all the literal number formats, PLUS the strings "Infinity", "+Infinity" and "-Infinity". The following table shows an example of a character string representation on the left and a brief description of the interpreted meaning on the right:
Character String Interpreted Meaning 1234 1234 1234l 1234 1234L 1234 1234u 1234 1234U 1234 1234ul 1234 1234UL 1234 01234 1234 in octal (leading 0) 0x1234 1234 in hexadecimal (leading 0x) 0X1234 1234 in hexadecimal (leading 0X) 123.4 123 (value truncated) 1.234e2 123 (exponent expanded/truncated) 1.234e-5 0 (truncated value less than 1) Infinity +Inf ("maxval", obeying all conventional arithmetic)
- Author
- Copyright (C) 1991 Texas Instruments Incorporated.
Permission is granted to any individual or institution to use, copy, modify, and distribute this software, provided that this complete copyright and permission notice is maintained, intact, in all copies and supporting documentation.
Texas Instruments Incorporated provides this software "as is" without express or implied warranty.
Modifications
Peter Vanroose, 24 January 2002: ported to vnl from COOL
Peter Vanroose, 7 September 2002: added "Infinity" (incl. all arithmetic)
Ian Scott, 23 March 2004: made ++ and -- much more efficient.
Peter Vanroose, March 2008: try to fix divide bug: partially succeeded
Peter Vanroose, June 2009: finally fixed this long standing divide bug
Definition in file vnl_bignum.h.