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/>