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

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

This lists the complete version history for the rewritten versions.

############################################################################## 
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-01-07 v0.22 Tels

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)

############################################################################## 
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:

2000-02-18 1.00: started work
2000-02-22 1.01: new() and bstr() work now (sort of)
2000-02-24 1.02: add()/sub() should work now
2000-03-06 1.03: layed more foundations (mul() etc)
2000-03-27 1.04: bmul/bdiv/cmp work now, better _norm()
2000-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
2000-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
2000-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
2000-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!)
2000-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
2000-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()
2000-05-09 1.11: bug bcmp() (1e-08 was < 0, aka fractions were broken)
2000-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'
2000-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()
2000-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) 
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-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(); 
 
############################################################################## 
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
 * 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
 *
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()

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

Tels <http://bloodgate.com/>
