Complete version history of the rewrite project
===============================================

If you just want to see which things are new and different from the original
Math::* in the Perl core, see HISTORY.

The file NEW lists only the changes for the latest version.

############################################################################## 
Math::BigInt::Calc:

2001-07-09 v0.06 Tels
 * first release
2001-07-15 v0.07 Tels
 * applied Philip Newtons speling and doc patch(s) 
 * accidentily had the old, slow mul() code in. Oups.
 * fixed also a bug in that new code
 * also the speedup in mul() occurs with $x having lots of zeros, not $y.
 * first argument is always classname, so removed checks and shift
 * shift in base ten by _lsft() and _rsft()
2001-07-15 v0.08 Tels
 * fixed bug in mul() shortcut
2001-07-20 v0.09 Tels
 * don't use warnings for older Perls
2001-08-24 v0.10 Tels
 * no longer export anything, ignore import calls
2001-09-07 v0.11 Tels
 * automatically USE_MUL or USE_DIV
2001-10-03 v0.12 Tels
 * _div: 99999 => $BASE-1 ($MAX_VAL), that made some div's fail if $BASE != 5
2001-10-23 v0.13 Tels
 * better detection of BASELEN by matching against expected pattern
2001-11-04 v0.14 Tels
 * added _mod() for faster $x % $y
2001-11-11 v0.15 Tels
 * added _dec() and _inc() for much faster $x++ and $x--
2001-11-19 v0.16 Tels
 * fixed comments a bit
 * finished _mod() when $y < $BASE and $BASE % $y != 0 and $BASE % $y != 1
 * streamlined _mod() loops a bit
 * added _pow() for faster bpow()
 * small fix to make 5.005_03 happy ($x = shift @prod vs $x = shift @prod || 0)
2001-12-06 v0.17 Tels
 * added _sqrt() for more speed
 * _sqrt() shortcut for small (< $BASE) numbers for better performance
 * shortcut in _mul for small numbers (< $BASE_LEN2)
 * added _and, _or, and _xor and let them use more than 16 bits
 * find out how many bits _and, _or and _xor can safely use (cap at 23)
 * div() might leave empty array, so __strip_zeros fixes these
 * streamlined _acmp() 
 * cap of 5 for BASE for UTS and UNICOS/Cray
 * better test to find out what BASE should be (use +0.0 to force floats)
2001-12-20 v0.18 Tels
 * added _as_hex() and _as_bin() with 16 bit chunks
 * from_bin() now uses oct() and 16 bits per iteration
 * removed needless return statements
2001-12-23 v0.19 Tels
 * first working version of using two different bases: one for mul/div, the
   other for all other ops, including converting via _to_large()/_to_small()
2002-01-07 v0.20 Tels
 * better detection of higher-int-only base (but disabled due to failures)
 * streamlined converting
 * turned dual-basis off by default (now 7-7 on 32 bit and 9-9 on most 64 it)
 * _str() uses int() on first part to avoid '0000' instead of '0'
2002-02-10 v0.22 Tels
 * _sqrt1() => _sqrt() (oups)
 * much better guess for _sqrt() resulting in faster sqrt
 * added _fac()
2002-02-24 v0.23 Tels
 * from_bin() repack input and use from_hex(): twice as fast
2002-02-27 v0.24 Tels
 * streamlined _mod() shortcuts
 * _div() has shortcut if $y is very small
2002-03-03 v0.25 Tels
 * started _square() (not done yet)
2002-03-17 v0.26 Tels
 * a fix in _rsft() that left empty array instead of (0)
 * a fix in _sub(): early out made -1 + 100000000001 == 0 (if length($y) > 8)
2002-05-30 v0.28 Tels
 * added _modinv(), _modpow() (not yet implemented)
2002-06-09 v0.29 Tels
 * filled in _modpow()
2002-06-10 v0.30 Tels
 * undef mul/div in case Calc.pm get's loaded twice
 * fix in _as_hex() and _as_bin() for older Perls
 * speedups in _pow() and _modpow()
2002-08-13 v0.31 Tels
 * _acmp() no longer calls _len() => tad faster
 * some cleanup of old code, added some more comments
2002-08-21 v0.32 Tels
 * fixed bug in _rsft() that did not set result to 0 in some cases
 * _modinv() now works, thanx to the all-positive algorithmn
 * much more tests in bigintc.t (taken over from FastCalc)
2002-09-09 v0.33 Tels
 * _fac() keep $n as scalar if possible
 * test for when to USE_MUL or not was inverted
 * _mul() is about 6 times faster if $y is small and $x is big
2002-09-27 v0.34 Tels
 * fixed bug in mul_use_div() shortcut that used * $RBASE instead of / $MBASE
 * $caught & 1 != 0 vs ($caught & 1) != 0 (changed to $caught != 2)
 * $i %= $MBASE does not work on ARM (v5.003), so make it $i -= $car * $MBASE
 * removed unused LEN_CONVERT code (smaller memory footprint)
2003-07-06 v0.35 Tels
 * fixed a bug in _floor() which caused ffloor(0.1234567) to fail.
   (Thanx to cpan@ali.as for finding it and sending a fix/testcases)
 * make _as_hex() and _as_bin() handle 0, and make them faster for very
   short numbers (less than BASE_LEN digits)
2003-08-31 v0.36 Tels
 * fixed a bug in div_use_div() that computed remainder wrong if X == X and
   X was very large
 * fixed a off-by-one error discovered with mbi_rand.t in _div_use_XXX()
   (one internal in $x overflowed, thus the wrong computation)
2003-12-11 v0.37 Tels
 * implemented _log_int() with a simple and fast "iterative" method
 * fixed bug in _root(): int() rounds sometimes wrong, so use sprintf()
 * _as_bin() and _as_hex() are faster (for small values) due to inlining
   is_zero()
 * _acmp() is about 26% faster for very small numbers or numbers that
   differ in length, and slightly faster for bigger numbers. This helps
   both bacmp() and bcmp()
 * _fac() did:
   + not modify $x in place for small arguments
   + something strange for large arguments
   + not handle 0..2 optimal (code now simplified)
 * _as_bin() used %b, which was not known to v5.5.3 - workaround that
 * implemented _log_int(), which is simple and very fast
 * implemented the missing pieces for _root() (which is quite fast)
2003-12-30 v0.38 Tels
 * guess _log_int() result based on $base if $base < $BASE
 * _pow() handle cases 0 ** Y, 1 ** Y, X ** 0 and X ** 1
 * _new(): shortcut for short numbers, makes MBI->new() about 20% faster
 * _root() was wrong for numbers like 9 (0b1001) because they start with
   the pattern /^0b1(0+)/ (missing '$' in regexp) and after fixing this
   it was dead slow for large numbers.
2004-01-25 v0.39 Tels (not released)
 * _zeros(0) is 0, not 1
2004-03-12 v0.40 Tels
 * added: api_version(), _ten(), _two(), _is_ten(), _is_two(), _gcd()
 * streamlined: is_foo() methods
 * _new() takes scalar, not scalar ref
 * _str() returns scalar, not scalar ref
 * _and(): bugfix for [perl #26559]: negative arguments that are shorter
    than the positive one caused an error due to cutting instead padding
 * _ior(): forgot to calculate the proper sing of result, making, for
    instance, 30 | -4 go wrong
2004-04-05 v0.41a Tels (not released)
 * removed the unused integer-detection code and combined the two BEGIN blocks
2004-07-30 v0.41 Tels
 * from_hex() convert 28 bits (vs 16) at a time, faster (helps from_bin(), too)
 * potential bug in padding with '0' in _digit()
 * fixed undef warnings in fceil(0.222222222222...) (thanx kenny!)
2004-10-10 v0.42 Tels
 * fix critical bug in _from_hex() with parts that were to big for one part
   (introduced in v1.72, thanx Mark Lakata for finding it!)
2005-01-01 v0.44 Tels
 * small cleanups
 * shortcut for numbers of same length in _div, where X > Y

############################################################################## 
Math::BigInt::CalcEmu:

2003-12-26 v0.01 Tels
 * first version, taken over all the code from BigInt
2003-12-30 v0.02 Tels
 * the code in Calc::_root() uses now sprintf(), but the one in Emu was not
2004-01-13 v0.03 Tels
 * $VERSION was overriding the $VERSION from MBI (Thanx Gisle Aas!)
2004-03-12 v0.04 Tels
 * removed unnecc. emulation routines (all except _signed_foo)

############################################################################## 
Math::BigInt::Scalar:

2001-07-09 v0.04 Tels
 * first release
2001-07-15 v0.05 Tels
 * first argument is always classname, so removed checks and shift
2001-07-20 v0.06 Tels
 * don't use warnings for older Perls
2001-08-24 v0.10 Tels
 * no longer export anything, ignore import calls
2002-01-07 v0.11 Tels
 * fixed version
 * added DESCRIPTION section to stop pod2man complaining
 * added _dec, _inc

############################################################################## 
Math::BigFloat:

2001-02-18 1.00: started work
2001-02-22 1.01: new() and bstr() work now (sort of)
2001-02-24 1.02: add()/sub() should work now
2001-03-06 1.03: layed more foundations (mul() etc)
2001-03-27 1.04: bmul/bdiv/cmp work now, better _norm()
2001-03-31 1.05: fixed bstr() and bsstr()
	         added AUTOLOAD for fxxx() to work as well as bxxx()
		 enhanced and fixed testsuite for mul/cmp/add/new
2001-04-05 1.06: bstr() returns NaN for NaN's
		 renamed _norm to bnorm, added it to AUTOLOAD for compatibility
		 fixed bug Math::BigFloat->new(Math::BigInt->new(3));
		 bug mul/div when second arg was BigInt
		 bdiv() works now with precision
		 precision()
		 doc about mixing different objects in overloaded math
2001-04-07 1.07: bug in bstr() for 0.xxx style numbers, as well as for "-xxx"
		 babs(), bneg(), bint() work now
		 empty stubs for bsqrt(), bround() and bmod()
		 exponent(), mantissa(), parts() work now as expected
2001-04-18 1.08: exponent(), mantissa() and parts() now return BigInt's
		 bnorm: 0Ey => 0E1 (was wrongly 0E0)
		 fixed is_zero()
		 added bround() and bfround() (only truncate mode)
                 fixed bug in bstr() for 1.203E-2 style numbers (Thanx Tom!)
2001-04-23 1.09: length() in list context return length of mantissa & exponent
		 bug in bstr() for '0.x' style strings
		 added bsqrt()
		 workaround for Perl v5.6.0 overload-bool bug (via MBI)
                 fixed rounding
2001-05-07 1.10: Tom's round fixes (minus one nit)
 		 new: .xxx, -.xxx, +.xxx etc are valid inputs, while
                 '.', 'x x x' and 'Exxx' are now invalid
                 finally got rid of C&P of overload section and clone()
2001-05-09 1.11: bug bcmp() (1e-08 was < 0, aka fractions were broken)
2001-05-11 1.12 Tels
 * taken over testsuite from John P.
 * added tests for compare with fraction
 * fixed fcmp/fround/ffround
 * added accuracy/precision/fallback/round_mode
 * bsstr('NaN') returned 'NaNeNaN'
2001-06-09 1.13 Tels:
 * adjusted fdiv() so that it now works proper with old testcases
 * (except a few nits, see testsuite and ACCURACY)
 * fdiv() in listmode (uses non-working fmod())
 * fixed/test A/P after each op
 * $x->accuracy(), $x->precision() actually round $x to the value A/P
 * fixed fpow(), added tests for it
 * hexadecimal integer input (0xdeadbeef)
 * is_one() for -1 was wrongly true, tests for is_one()
2001-06-13 1.14 Tels:
 * accuracy/precision rounding after fdiv() was missing
 * binary integer input (0b01110 etc)
 * A/P rounding after fdiv() was missing
 * '-0x0' would wrongly leave '-0'
 * as_number() was wrong for negative numbers and had no tests
 * added is_even(), is_odd(), _set(), the inherited ones were broken
 * fixed is_zero() for NaN
 * $x->bpow($y) for negative $y was unfinished 
 * added is_inf(), binf() and some support for +-inf in new(), bsstr() etc
 * added tests for is_odd(), is_even(), _set() and is_zero(), is_inf(), bsstr()
2001-06-15 v1.15 Tels
 * added bfloor(), bceil()
2001-07-09 v1.16 Tels
 * is_positive(), is_negative()
 * various pod fixes (overlong =item, speling erorrs etc)
 * removed internal _set() and the tests for it
 * infinity support for fcmp(), fpow()
 * nailed the bug in fdiv() that caused fsqrt() to fail. fsqr() works now, too.
 * more tests 
2001-07-15 v1.17 Tels
 * applied Philip Newtons speling and doc patch(s) 
 * added bone()
 * tests for bnan() and bone()
2001-08-02 v1.19 Tels
 * 123/+-inf => 0, test for that and -1,0 / NaN => NaN
 * +123 / 0 => +inf, -123 / 0 => -inf (was missing in MBF)
 * fixed +-inf handling in bacmp/bcmp/bsub/badd/bdiv and tests for that
 * padd bstr() output of numbers with set A or P
 * remove bfloat() (Math::BigInt->bfloat() did not work, anyway, see bint())
2001-08-03 v1.20 Tels
 * streamlined bcmp
 * drop leading '+' for inf
2001-09-03 v1.21 Tels
 * serious bug in bcmp() caused 1.5 to be greater than 2. Yikes!
 * bcmp() did not only return -1,0,1 and undef but other values, too
 * new('inf') produced NaN (was expecting '+inf')
 * exponent(), mantissa() & parts() failed or returned scalars for inf,-inf,NaN
 * include finf in AUTOLOAD list
2001-10-03 v1.22 Tels
 * Quite a lot of rounding fixes
 * $x->bnorm() is 4 times faster if $x == 0
 * $x->bround($n) is 43 times faster if $n > $x->{_a} (no-op)
 * added as_number()
2001-10-05 v1.23 Tels
 * fixed facmp() (was broken the same way as fcmp())
 * more rounding fixes from John P.
2001-11-11 v1.24 Tels
 * bacmp() fix for +-inf
 * streamlined new()
 * faster finc()/fdec()
2001-11-18 v1.25 Tels
 * streamlining fixes in new() were missing
 * further streamlining in new() for 12345e1234 cases (fraction part empty)
 * added $rnd_mode support for compatibility
 * replaced the 'laber schwad blah blah' pod section by a pointer to MBI
2001-12-06 v1.26 Tels
 * fneg() failed (now hand up to MBI)
 * frsft() and flsft() were no aliases to brsft() and blsft()
 * fone() was no alias for bone()
 * blsft() and brsft() were missing altogether
 * streamlined: fpow() and fmul()
 * removed the EXPORT_OK
 * fqsrt() uses now BigInt::bsqrt() as guess: greatly improved performance
 * make fsqrt() subclass proof by using $self instead of Math::BigFloat
 * bzero(), bone(): take additional A and P and store 'em
 * bnan(), binf(): clear A and P 
2002-01-06 v1.27 Tels
 * overload for log() and flog()/blog()
 * bzero()/bone() handling of A & P was broken
 * bround()/bfround() handling of zeros forgot to set A & P
 * fdiv: fixed a bug in round to A with given round_mode (always used global)
 * fsqrt(): would hang/fail if either $x's or global A or P were set
 * fsqrt() didn't modify $x sometimes, but returned a new reference
 * fsqrt(): calc 4 more digits for rounding, not 1 (endless looping otherwise)
 * fmod() now actually works
2002-02-10 v1.27 Tels (forgot to increase version)
 * ffac()
 * various: disable Math::BigInt::upgrade to avoid deep recursion
2002-02-16 v1.28 Tels
 * fixed use Math::BigFloat ':constant';
 * fixed flog() function to calc right result, honour rounding-globals
2002-02-24 v1.29 Tels
 * overload for 'log' now inherited by BigInt
 * _binf(), _bnan(), _bone() and _bzero() instead of longer bone() etc
 * inf/NaN fixes from v1.51 were missing for BigFloat
 * bdiv() upgrades if applicable
2002-02-25 v1.30 Tels
 * bug in bsub() with not rounding when $x->bsub(0) was also in MBF
 * bcmp() and bacmp() 5 times faster due to numify() (might have now impose a
   limit on exponent - but I couldn't find a test that breaks it)
 * streamlined ffloor() and fceil()
 * fixed bug in $x->bsub(0) and $x->badd(0) (both forgot to round result)
 * new() downgrade integers if $downgrade is in effect
 * optimized fpow() (one is_zero() less)
 * optimized as_number (nearly twice as fast)
 * $x->badd(0) forgot to round $x
 * downgrade and upgrade are valid methods for inheritance
2002-03-03 v1.31 Tels
 * bpow() can handle second arguments beeing non-integer (f.i. 2 ** 0.2)
 * $x->bpow(0.5) optimized to $x->bsqrt(); 
2002-05-19 v1.32 Tels
 * upgrade used badd() instead of bmul() inside bmul()
 * bpow() now uses slower, but more correct way for fractions (this needs work)
2002-06-09 v1.33 Tels
 * import() fixed for older Perls
2002-06-10 v1.34 Tels
 * upgrade used badd() instead of bmul() inside bmul() (again! arg!)
2002-07-07 v1.35 Tels
 * bfround() used accidentily BigInt math; is now about 5.6 times faster for
   small numbers
 * bdiv()/badd() etc skip objectify() if possible and are thus faster
 * doc for accuracy()/precision()
 * $x->bmod() was not modifying $x in place when returning NaN/inf/-inf
 * avoid unecc. calls to objectify() for binary op's
2002-08-13 v1.36 Tels
 * as_hex() and as_bin() work now at least for inf, NaN and integers
 * fixed bsstr() (and thus also numify()) for negative numbers - Ouch!
 * $x->new("0.02"); $x->accuracy($a); $x->bdiv($y,$d) failed to round
   when $d > $a
 * numify() returned '+inf' instead of 'inf'
 * (more) tests for bsstr(), numify(), as_hex(), as_bin
2002-08-20 v1.37 Tels
 * bcmp()/bacmp() upgrade now if requested
2002-09-08 v1.38 Tels
 * fix that bsqrt() would hang for certain inputs. Instead of using Newton's,
   we now rely on the fact that sqrt(x*y) = sqrt(x) * sqrt(y) by setting y to
   100. This removes the while loop entirely and makes it much faster while
   fixing the bug at the same time.
 * $x->bsqrt(0) did needless warn about undef values, and round to 4 digits
   instead of beeing equivalent to $x->bsqrt(undef)
 * ditto for $x->bpow($y,0), $x->blog($base,0) and $x->bdiv($y,0)
 * use File::Spec was needless, since it was required later on again
2002-11-03 v1.39 Tels
 * $x->bpow($y,0), $x->blog($base,0) and $x->bdiv($y,0) were still not doing
    the right thing and no tests caught it *sigh*
 * blog():
   + MUCH faster when $x > 10 or $x < 0.1 (constant time vs.
     time * 10 when doubling/halving $x)
   + also much faster if $x has many digits (like 1/3 or 123**123)
   + for $x < 1 and $x > 0 did not work at all (bacmp vs bcmp)
   + returns now NaN if $base <= 0 or $base == 1
   + does handle other bases than "undef" (aka e) properly now
 * require Math::BigFloat did not work (opposed to BigInt, where it does)
 * _pow() suffered the same bug of bacmp vs bcmp (so 0.2 ** 0.2 failed)
 * removed unused _pow2() routine
 * _find_round_parameters() returns ($x,$a,$p,$r) and not ($a,$p,$r), so
   use it correctly, and also test for $x = NaN afterwards
  (happens when $a and $p were set and thus $x became NaN)
 * bsqrt() failed since v1.63 for values like 0.2, 0.002, 0.00134 etc
 * added broot() method (albeit slow for now)
 * $x->is_one('-') was broken (never returned true for $x == -1)
 * config() can take arguments and set them, croak on wrong ones
 * config(trap_nan => 1) to manipulate former $NaNOK variable
 * config(trap_inf => 1), too
 * trap_nan/trap_inf really croak on any attempt to create an NaN/inf
 * spellings of Bigint => BigInt
 * simplify config() by using SUPER::config()
2003-07-06 v1.39 Tels
 * $x->blog($base) can handle a $base which is a Math::Bigint
 * replace die() with Carp::croak
2003-09-23 v1.40 Tels
 * bstr(): removed unnecc. BigInt math and inlined is_zero() => great speedup
   (10% to factor 6.5 depending on input)
 * replace $self->_one() by $self->bone()
2003-12-11 v1.41 Tels
 * flog(): 0.5, 0.25, 0.125, 2, 4 and 8 were not scaled properly back to
   1, instead they remained 0.5 and 2, respectively. This was a '<' vs.
   '>=' respective '<' vs. '<=' issue. No other values are affected
   (neither getting slower nor faster), but the ones in question (incl.
   their multiples like 20, 80, 0.0125 etc) are now tremendously faster -
   about a factor of 30 to 60! :-)
 * removed some crufty logic from _log_10() and made the special cases of
   2, 10 and 0.1 slightly faster. This also helps log($x,2) and log($x,10).
 * bfac() slightly faster for small arguments
 * downgrading to bigint failed for .2e2 (produced 200 vs. 20)
2003-12-30 v1.42 Tels
 * ffac(inf) is inf, not NaN
 * flog() calculate integer result first, and if it fits, return it
   this makes it much faster in case the result is a perfect integer
 * require (instead of use) Exporter
 * froot() calculates an integer result first, and it if fits, returns it
2004-01-13 v1.43 Tels
 * small fixes in AUTOLOAD
 * delete $x->{_a} vs. $x->{_a} = undef to save memory
2004-03-12 v1.44 Tels
 * bpow() computed -X ** Y wrong for Y that are odd
 * use $HALF instead of 0.5 to speed up broot()
 * use Calc instead of BigInt for parts, that makes it roughly 2x faster
   it also saves memory (419 vs. 767 bytes per (small number) object)
 * bmod() did needlessly test for NaN arguments twice
2004-07-30 v1.45 Tels
 * simple inherit bsub() from BigInt, also fixes bsub() failing under
   $x -= $x - Thanx Peter J. Acklam!
 * bdiv() failed when passed a variable twice (thanx Peter J. Acklam!)
 * bfround() and bround() are about 10% faster when going via Math::BigInt's
   bround() due to constructing a fake BigInt instead of going via ->new()
 * fixed undef warnings in bpow(0,$y) ($y non-integer) (thanx kenny!)
2004-08-13 v1.46 Tels
 * blog(10,10) ($x == $y) returned '1.0000...' instead of '1'
2004-10-10 v1.47 Tels
 * inf/NaN fixes for bpow()
 * eliminate the need for _zeros() in new() (speed-up for GMP et. al.)
 * eliminate _is_zero() in new() (small speed up)
 * added shortcut for simple numbers in new() (speed up)
2005-01-01 v0.48 Tels
 * use new interface to _scale_a() and _scale_p() in BigInt
 * add bneg() and inline is_zero() in it, making it 1.6 times faster
 * replace ref($_[0]) w/ undef when it isn't actually needed. This
   makes some ops (bsstr(), bneg etc) about 2% faster for small numbers
 * use MBI::_register_callback() to get notified of lib changes
 * bgcd()/blcm() never worked, so fix them for integers and add tests

############################################################################## 
Math::BigInt:

2000-11-13 v1.02 Tels
 fixed sub and mul (sort of)
 found out that "$wanted = shift || return bzero()" causes a call to numify,
 testing for undefined fixes this problem (but might waste more time for
 a new(0), will save time on average.
2000-11-14 v1.03 Tels
 x**0 => 1 (instead of x)
 fixed bigintpm to include bpow, binc, bdec, new() test
2000-11-15 v1.04 Tels
 fixed bigintpm to test '++' and '--' properly
 done div, fixed mul/bpow (13 tests remain)
2000-11-16 v1.05 Tels
 8 tests remain
 new copies _all_ fields, not only Math::Bigint ones
2000-11-19 v1.06 Tels
 7 tests remain
 bgcd accepts lists, added blcm
2000-11-20 v1.07 Tels
 objectify fixed to not make copies and work with subclasses
2000-11-22 v1.08 Tels
 fixed all but one test (band bior bxor etc)
2000-11-23 v1.09 Tels
 fixed bug in bmul (and thus bpow) (self multiply works now)
2000-11-24 v1.10 Tels
 finally made it Math::BigInt (w/o trailing 's')
2001-02-14 v1.11 Tels (first release)
 * fixed bug in band(), bxor(), etc that used badd($x, fixed_number_here);
 * since subclasses might not be happy with fixed numbers, make sure we pass
   BigInts all the time if using something like $someclass->badd();
 * fixed bug in band/bxor/bior which destroyed second argument
 * bxor/band/bior work now correctly for subclasses
 * ++ and -- are now a tad (ca 5%) faster
2001-02-16 v1.12 Tels
 * accidentily dropped self-multiply test in bigintpm.t
 * fixed bug in overloading cmp
 * after correcting the overload for 'cmp', I got a lot of test failings and
   finally dicsovered that the bstr()'s return of '[+-][0-9]+' instead of
   Perls ways of '[-]?[0-9]+' breaks string comparisations with numbers :(
   F.i. ok() from Test.pm uses 'eq' and you can not do ok($a,3*3) where $a
   is a BigInt. IMNSHO clearly wrong. And only changing the way cmp is
   overloaded would lead to the curios situation that the following:
   'print "$a eq $b" if $a eq $b;' would print "+3 eq 3", which looks wrong.
   Mark B. said go ahead and change bstr(), so I changed it ;) to drop
   the '+', adapted all the tests, changed the doc, etc.
   BigInts behave now transparently like build-in scalars in integer/string
   context ;o)
2001-02-18 v1.13 Tels
 * got rid of duplicated copy() code in new()
2001-02-21 v1.14 Tels
 * overload +=, -=, *= and /= for about 20-30% more speed if both args have
   roughly same length
 * shortcut in add() makes $x += $y; $x -= $y; for large $x and small $y
   an O(1) case instead of O(N)
 * fixed (non-critical) bug that caused objectify in numify/bool/stringify to
   create scratch objects from undef params.
2001-02-24 v1.15 Tels
 * $x / $x is now a lot faster (more O(1) than O(N))
 * 10 ** $x is now a lot faster (more O(N/5) instead of O(N))
 * overload of **= makes $x **= $y faster
 * 0 ** 0 was NaN, not 1
 * -a % b = +c (was -c) to be compatible with perl
 * added $x->length() and test for it; fixed _digits() (was off by 1)
 * objectify() was not exported, added tests for objectify()
2001-03-09 v1.16 Tels
 * Math::BigInt::badd(4,5) and Math::SomeChildOfBI->badd(4,5) work now
 * '$x = scalar (**|%|+|-|*|\) $object;' failed (was not tested, either)
 * 'if ($x)' is now O(1) instead of O(N) and at least twice as fast
 * fixed nasty bug in _digits that caused <=> after add/sub/mul etc to fail
   if result was between 100001 and 109999, added test for this
 * added test cases for op's that should preserve args (+,+=,abs(), neg() etc)
 * added tests for overloaded 'bool'
 * added test.pl and some examples (prime.pl, bigprimes.pl)
 * tests after "use Math::BigInt :constant" were screwed due to not using eval
 * $x->numify() (for $array[$x] = 0; etc) is much faster now
 * added caveat documentation for $x = -$x; and $x *= string1 operator string2;
2001-03-24 v1.20 Tels
 * added: is_nan()
 * bug in bmod/bdiv, I forgot some cases with negatives. Thanx to Bruce Fields!
 * documented ':constant' and eval() crash on Perl 5.00x
 * documented BigInts behaviour of bmod/bdiv and use integer
2001-03-30 v1.21 Tels
 * bool() works now under 5_005
 * bug in bsub where numbers with at least 6 trailig digits after any op failed
2001-04-05 v1.22 Tels
 * documented Peters OS/390 patch/changes (fix was in for quite some time)
 * fixed bug Math::BigInt->new(Math::BigFloat->new(3));
 * objectify() with other objects than BigInt as further args, copy() etc
 * $x->digit($n) to query fast value of Nth digit
 * as_number()
2001-04-07 v1.23 Tels
 * speling errors in pod
2001-04-23 v1.3 Tels
 * added (compatible to MBF) mantissa(), exponent() & parts() as well as tests
 * _trailing_zeros()
 * fixed as_number() to return copy of BigInt 
 * added bround(), bfround() and support for round_mode() as well as $rnd_mode
 * fixed bug in bdiv() wich left reminder "-0", causing further op's to die()
 * added is_valid to testsuite to see whether invalid objects are created
 * added bsqrt()
 * workaround coredump bug in bool() for v5.6.1
2001-05-08 v1.31 Tels
 * _ between digits now accepted, ' ' no longer valid inside (but at front/end)
 * Exxx is NaN, and no longer produces warning
 * .xxx style numbers are valid input
 * tests for 1E1, 123E-2, 1E2 etc style input to Bigint.pm
 * fixed overload (w/ _swap/copy), subclasses can inherit it easily
 * removed clone()
 * added bsstr()
2001-05-11 v1.32 Tels
 * added accuracy/precision/fallback/round_mode
2001-06-09 v1.33 Tels
 * bround() no longer uses 10 ** $pad and is thus much faster when rounding up
 * fixed and added rounding benchmark (did time bmul instead bround)
 * blsft(),brsft(): can work in different bases, check against invalid
   inputs, more tests, speedup when in base 10
 * _trailing_zeros is 50% faster
 * A/P after each op, tests for it in accuracy.t
 * round() instead of bnorm()
 * $x->accuracy(), $x->precision() actually round $x to the set value
 * tests for is_one()
 * hexadecimal integer input (0xcafebabe etc)
2001-06-13 v1.34 Tels
 * binary integer input (0b01110 etc)
 * fixed: '-0x0' left '-0'
 * added is_inf(), binf() and some support for +-inf in new(), bsstr() etc
 * added tests for is_odd(), is_even(), _set() and is_zero(), is_inf(), bsstr()
2001-06-15 v1.35 Tels
 * added bfloor(), bceil()
 * fixed bior(), bxor(), band() for $x->bxxx(NaN,0), added modify() to them
2001-07-04 v1.36 Tels
 * is_positive(), is_negative()
 * various pod fixes (overlong =item, speling erorrs etc)
 * torn out the bones from under the flesh and moved them to Math::BigInt::Calc
 * added Math::BigInt::Calc, Math::BigInt::Small (and Math::BigInt::BitVect)
 * fixed tests for bacmp() (could never fail)
 * removed internal _set() and tests for it
 * +-inf handling in bcmp(), bpow()
2001-07-15 v1.37 Tels
 * applied Philip Newtons speling and doc patch(s)
 * Benjamin Trott: _split() is faster for numbers that need no splitting
 * Benjamin Trott: don't take shortcut in badd(), or Pari won't work 
 * allow use Math::BigInt lib => 'Pari,BitVect,Foo,Bar';
 * delegate shifting to CALC if possible, otherwise fallback
 * test for self-pow, to see if lib's fail (since BitVect failed for self-pow)
 * _one() => bone()
 * +x / 0 => +inf, -x / 0 => -inf, while 0/0 and +-x % 0 are still NaN
 * tests for bnan() and bone()
 * Math::BigInt::Calc now determines biggest $BASE to use. Default should now
   be 1e7 on most systems, giving 20% to 40% speedups.
2001-07-15 v1.38 Tels
 * test for mul() shortcut
2001-08-02 v1.39 Tels
 * fixed history (duh!)
 * assign return values from $CALC back to $x->{value}
 * fixed +-inf handling in a lot of places and tests for that
 * band(), bxor() and bior() now work with negative inputs
 * remove bint() (Math::BigFloat->bint() just DNDWIM and no sense, either)
2001-08-03 v1.40 Tels
 * bxor(-$x,-$y) was broken (and not tested *sigh*)
 * streamlined bcmp
 * drop leading '+' for inf
 * bxor(), band(), bior() with negative arguments don't get passed to lib
   (makes it work with BitVect, Pari, GMP etc)
2001-08-08 v1.41 Tels
 * fixed inf test (coredumps)
2001-09-03 v1.42 Tels
 * bug in overload section causing performance losses in subclasses
 * call $CALC->import() with list of libs
 * odd numbers never have trailing zeros, so don't convert them to DEC to look
 * as_hex() and as_bin()
 * $x->bmod() did not modify $x, only returned result. Oups.
 * new('inf') produced NaN (was expecting '+inf')
 * exponent(), mantissa() & parts() failed or returned scalars for inf,-inf,NaN
2001-10-05 v1.43 Tels
 * $x->bround($n) is 43 times faster if $n > $x->{_a} (no-op)
 * Heaploads of rounding fixes (and tests)
 * Test for 99999-bug in Calc 
2001-11-04 v1.45 Tels
 * tests run now in subclass, too 
 * bmod() can use _mod in lib
 * lots of tests fixed (assumed wrong base etc) and added
 * bpow() about 10-15% faster for small numbers (like 2 ** 150, 3 * 200 etc)
2001-11-11 v1.46 Tels
 * binc(),bdec() use lib (via _inc(),_dec()) => faster (see BENCHMARK)
 * avoid the unnecc. rounding bsub()/binc()/bdec() (badd() already took care)
 * made bsub() faster by removing the bneg() overhead from it 
2001-11-18 v1.47 Tels
 * added $rnd_mode support for compatibility
 * two 'my $t = ... if ..;' cases to 'my $t; $t = ... if ...;'
 * added overload for %=, |=, &= and ^= for more speed
 * _split(): check for 1e2e3 and reject it
2001-12-06 v1.48 Tels
 * fixed pod in many places
 * bmod: use round(), not bround()
 * bsqrt: use _sqrt() from lib, if possible
 * bsqrt: would hang for certain (most?) inputs
 * bdiv: slow check for 1 || -1 replaced by much faster version
 * bdiv: call _div() only when necc. in list context, otherwise scalar
 * streamlined copy(), _find_round_parameters()
 * removed the EXPORT_OK except for objectify, _swap and bgcd/blcm
 * bzero(), bone(): take additional A and P and store 'em
 * bnan(), binf(): clear A and P 
2002-01-07 v1.49 Tels
 * as_hex() and as_bin() use 16 instead of 8 bits per iteration
 * overload for log() and blog()
 * tricks to make 'require Math::BigInt' and 'use Math::BigInt();' work again
 * use $CALC instead of require for newer Perls (test for $] > 5.006 vs 5.6)
 * bzero()/bone() handling of A & P was broken
 * bround()/bfround() forgot to set A or P for zeros
 * embedded _find_round_parameters into round(), streamlined both versions
 * round() now uses string-add to make it almost twice as fast
 * bnot() did round twice
2002-02-10 v1.50 Tels
 * bfac() and hook for _fac() in libs
 * documented sub-classing and auto-upgrade
 * < 4 test in bsqrt() after the CALC call for more performance
 * added overload for sqrt()
 * added possibility to upgrade via use Math::BigInt upgrade => 'Foo::Bar'
 * Math::Big(Int|Float)->accuracy() clears precision, and vice versa
 * small optimization in bdiv() regarding abs($x) < abs($y)
 * brsft() for negative numbers in base 2 was completely wrong
2002-02-16 v1.51 Tels
 * fixed bfround(-x) (f.i. 0.004->bfround(-2) resulted in 0.01, not 0.00)
 * bfround(x) rounded at wrong place (off by one)
 * calling bfround(x) rounded further and further instead of keeping result
 * blog() upgrades if requested
 * added doc stub for every public function
2002-02-24 v1.52 Tels
 * hooks for _bin(), _bnan(), _bone() and _bzero()
 * =head2 section for accuracy
2002-02-27 v1.53 Tels
 * precisision typo
 * fixed overlong pod =item
 * added downgrade() 
2002-03-03 v1.54 Tels
 * really fixed overlong pod =item
 * downgrade() and upgrade() with undef as argument didn't clear the variable
 * bmul() upgrades if second argument is non-integer 
 * bdiv() upgrades if $x > $y
 * bpow() upgrades if second argument is non-integer
 * objectify disable downgrade (for MBF)
 * new() twice as fast due to shortcut simple numbers, save _split() & _round()
2002-03-17 v1.55 Tels
 * :constant picks up binary/hexadecimal constants
 * Math::BigInt->digit(123) works now
2002-03-17 v1.56 Tels
 * documented config()
 * simplified import() logic a bit
 * changed some isa->($upgrade) => !$isa->($self); 
2002-05-30 v1.57 Tels
 * fixed objectify() to make "perl -Mbigrat -le 'print 1+2/3'" work
 * added bmodpow() and bmodinv() as (not-working yet) stubs
2002-06-09 v1.58 Tels
 * invalid inputs with two dot's (1.2.3 or 1..2 etc) are now really invalid
2002-06-10 v1.59 Tels
 * pod fixes for bmodpow()/bmodinv()
 * fix in as_hex() and as_bin() for older Perls
 * speedups in bpow(), bmodin() and bmodpow()
2002-07-07 v1.60 Tels
 * shortcuts to avoid calls to objectify for add/sub/mul/div/mod/pow/bcmp etc
 * fix overloaded bcmp() so that the obectify()-avoidance kicks in
 * avoid calling round() when BigFloat requested 'no rounding please'
 * bcmp()'s shortcut for comparing x <=> 0, 0 <=> 0, 0 <=> $y was making things
   slower than just handing the compare to Calc. Even more so for Pari et al.
 * $x->acuracy() and $x->precision() returned undef, instead of 0 if
   A/P of $x was 0 and global A/P was undef.
 * $x->bmod() did not modify $x in place when returning NaN/inf/-inf
 * some binary ops (band/bxor/bior/bpow) were not properly rounding the result
   to the requested A/P/R; the same ops also forgot to take $y into account
 * doc for accuracy()/precision()
2002-08-13 v1.61 Tels
 * tests for bsstr()/numify() with negative/special inputs
 * bround() keeps $scale as scalar for speed and less problems
 * fix for trailing newlines in input
 * some doc fixes (especially return values of is_foo() methods)
 * make testsuite so that it will pass under FastCalc easily
2002-08-21 v1.62 Tels
 * bcmp()/bacmp() upgrade now if requested
 * bmodinv() uses an all-positive algorithmn, speeding it up by about 5-8%
   and allowing to implement the same algorithmn in Calc for factor 4 speedup
2002-09-08 v1.63 Tels
 * bsqrt() did not modify $x but returned new object when lib does not have
   a _sqrt() routine (BareCalc, BitVect and Pari are affected, Calc, FastCalc
   and GMP were not)
2002-11-03 v1.64 Tels
 * removed needless "my $c = ...;" statements in binf() and bnan()
 * forgot () around "$x->{_f} & MB_NEVER_ROUND"
 * bsqrt(inf) == inf, not NaN
 * $x->bdiv($x) did not round the resulting 1 properly
 * removed the shortcut testcode in bdiv() (Calc handles this now)
 * added (non-working for now) broot() method
 * changed length() to CORE::length() in two places (thanx Liz!)
 * config() can take arguments and set them, croak on wrong ones
 * config(trap_nan => 1) to manipulate former $NaNOK variable
 * config(trap_inf => 1), too
 * trap_nan/trap_inf really croak on any attempt to create an NaN/inf
 * spellings of Bigint => BigInt
 * _find_rounding_parameters(): set $a to undef if it is 0
2003-07-13 v1.65 Tels
 * document that config() can set certain values
 * replace die() with Carp::croak()
 * remove needless is_zero() check in as_bin() and as_hex(), making them
   faster, especially when under a different lib like GMP.
 * Fixed the infinite recursion in bignum. See http://xrl.us/k6y
 * fix handling of 0e999, 0e-999 etc
2003-09-01 v1.66 Tels
 * document accepted inputs better
 * fix wrong upgrade and undef-parameter handling in broot()
 * implement broot() if lib doesn't have a _root() routine for $y that are
   powers of two and for small $x
 * warn if broot() cannot yet compute proper result
 * remove needless _one(): 3% speedup for binc()
 * remove needless _swap(): 1% (Calc) - 6% (GMP) speedup for overloaded math
2003-12-02 v1.67 Tels
 * overload for cos/sin/exp/atan2 to make cos(Math::BigInt->new(...)) work
 * implemented blog() with a simple and fast "iterative" method
 * use _log_int() in $CALC if possible
 * cache $CALC->can(...) calls in global %CAN hash for speed
 * reorder is_zero() check for band(), bior() and bxor() to speed up the
   case for when the underlying lib has _and(), _ior() and _xor()
 * implement a new way of emulating AND, OR and XOR, this tremendously
    helps if band() et. al. are called with negative arguments
 * try to call _signed_or(), _signed_and() and _signed_xor() in lib
 * is_foobar() methods are slightly faster
 * bnot() is about 12% faster
 * bsqrt(): moved is_zero() || is_one() test out of the way => 28% faster
   for "small" values (Calc and GMP)
 * small change for overload::constant
 * bfac(): do 0 or 1 check only if CALC cannot do _fac() (thus faster)
 * removed a needless _copy in bmod() with megative arguments (slightly faster)
2003-12-26 v1.68 Tels
 * bfac(inf) is inf, not NaN 
 * added alias names: as_int() (as_number()), is_pos(), is_neg() and doc
 * factored out all the emulation code and moved it to Math::BigInt::CalcEmu
 * binary/hexadecimal input was twice as slow as v1.66 due to a typo in v1.67
 * streamlined overload for bolean context (20% faster "... if $x;")
 * round() was missing a croak() in path testing for wrong roundmode
 * badd(): optimize away setting of sign if it is already right
 * bdec() is about 10% faster for negative numbers
 * bpow(): removed some now needless tests for 0 and 1: about 30% faster
   for small numbers
 * streamlined exponent() (parts() benefits from this, too)
2004-01-13 v1.69 Tels
 * bacmp(+-$x,-inf) was wrong (Thanx William T. Morgan!)
 * digit($x,$y) segfaulted under 5.6.1 if $y was a BigInt
 * blog() was missing the modify() check (breaking MBI::Constant)
 * delete $x->{_a} vs. $x->{_a} = undef to save memory
2004-03-12 v1.70 Tels
 * bpow() computed -X ** Y wrong for Y that are odd
 * 0 ** -Y => +inf (was NaN) due to 0 ** -Y => 1/0**Y => 1/0 => +inf
 * fixed bug in perl -Mbignum -le 'print 2 ** 46 * 3' under Bigint::Lite
   leading to "Can't use an undefined value as an ARRAY reference at
   /usr/local/lib/perl5/5.8.2/Math/BigInt/Calc.pm line 462."
 * fixed upgrading of blog() with base = undef (means: base e)
 * make the synopsis actually runnable (Thanx Paul McCarthy)
 * blcm(): handle a list of strings (instead one obj and some strings), too
2004-07-08 v1.71 Tels
 * fixed bsub() failing under $x -= $x; Thanx Peter J. Acklam!
 * _scan_for_nonzero() reuses length/stringform of $x and is thus faster, this
   helps rounding if the number after the roundposition is '5'
2004-07-13 v1.72 Tels
 * no changes
2004-10-10 v1.73 Tels
 * overloading of <<= and >>= makes these ops about 10% faster and fixes the
   problem that "$a <<= 2" would create a different object for $a to point to
 * quite a lot of fixes for NaN/inf handling in bpow() (bmul already did it
   right) - bug report by jeff at thekidders com and Hugo - Thank you!
2005-01-01 v1.74 Tels
 * streamline _scale_a() and _scale_p() for more speed in rounding
 * remove the now unnec. support for MB_NEVER_ROUND and {_f}, this
   makes all ops that call round() a tad faster (one exists is
   removed) and shrinks the codesize a bit
 * streamline bneg(), inline is_zero(): makes it 1.6 times faster
 * replace ref($_[0]) w/ undef when it isn't actually needed. This
   makes some ops (bsstr(), bneg etc) about 2% faster for small numbers
 * restrict low-level math library names to sane chars to avoid
   exploitation of eval()
 * fill_can_cache() accidentily did checks for 'or' & 'xor'
 * inline _fill_can_cache
 * add _register_callback() to notify subclasses of lower math lib changes
 * bgcd() is now about 10% faster
 * is_positive(0) == 0, since 0 is neither positive nor negative
 * streamline bmod() a bit
 * fix blog() constructing arguments (broke Math::BigInt::Constant)

Please send me test-reports, your experiences with this and your ideas - I love
to hear about my work!

Tels <http://bloodgate.com/>