This file contains all the changes and bugfixes from the original version of BigInt/BigFloat to the rewritten one. For what has changed in the latest version see NEW and for a complete list of changes see the file CHANGES. v1.82: general: + It is subsequent faster than the original in many places + Use more than 16 bit at a time, greater BASELEN for 64 bit systems + overload for things like += + special operations like binc() + many optimizations and shortcuts in normal operations + Can use Math::BigInt lib => 'name'; for Pari, GMP, Bit::Vector or others + regression test suite greatly enhanced to cover more problematic cases + added example scripts (prime.pl, bigprimes.pl, hailstone.pl) + documentation fixed and greatly enhanced + BigInt is sub-classable with very little effort, see M::S or M::BF + subclasses of Math::BigInt know all the same methods, so that you can call $x->some_method() without having to know which type of class $x is + added infinity handling + much better NaN handling caveats: + bstr() and stringify now drop the leading '+' (to make overloaded cmp work as expected when cmp'aring to scalars and other objects (read: bugfix) + due to the dropping of '+' the string sort order has changed. It is now compatible to the way perl sorts it's strings. + spaces are no longer allowed in a number (but may precede or follow it) !! You can always make a subclass and change all these things quite easily !! input: + underscores are now valid between any two digits (in hex/binary input, too) + integers of the form 1E2, 1.23E2, 2.00 etc now valid for BigInt.pm, too + hexadecimal numbers of the form 0xabcdefABCDEF0123456789 + binary numbers of the form 0b01010101101000001000100101 + octal numbers can be input via from_oct() output: + as_hex(), as_bin() and as_oct() for easier conversation between bases bugs and buglets fixed over Mark's original: + 0**0 gave NaN instead of 1 + -1**y gave -1 instead of +1 for even y + fsqrt() gave slightly wrong results (like for fsqrt(9)) + +x/0 is now +inf, -x/0 is -inf (both were NaN), as well as other inf cases + mod/div for negative numbers were incompatible to Perl's way + added P. Prymmer's OS/390 '/1e5 vs *1e-5' patch w/o the performance snag + incorporated all the patches to the core modules by John Peacock + BigFloat::bxxx() works as well as BigFloat::fxxx() + Math::BigInt->new(10) / Math::BigFloat->new(2) returned NaN (ditto for other subclasses of Math::BigInt) + $a = new Math::BigInt; creates now a +0, while "" still gives a NaN This suppresses all warnings on undef arguments. Wether this is better... + import() would always use "Math::BigInt" and clash with Exporter + use Math::BigInt qw(bneg); $a = bneg('1234'); etc did not work at all + $x->xxx() now modifies $x in all cases of modifiers and actually returns the same $x (e.g. not a plain scalar or a different reference). All testing routines leave $x alone. bpow(), bmod(), fround(), ffround() etc were broken in this regard. accuracy and precision: + there is now support for both accuracy (significant digits) and precision (fixed number of digits after decimal point), which by default is off + objects/numbers now can have a local accuracy/precision internal fixes: + uses a blessed hash ref instead scalar ref (easier subclassable) + my instead of local + use strict and -w + s/$[/0/ (after all, $[ = 1; in main does not effect this package) + $# partially removed ($#y is scalar @y -1, $#$y is scalar @$y-1 - ugh!) + added LICENSE section and file new stuff: + MBF: :constant works now + MBI: :constant picks up binary and hexadecimal constants + brsft()/blsft() also can do other bases than 2 + bacmp (acmp), because needed for more efficient add() + bzero(), bnan(), bone(), binf() + binc(), bdec(), bfac() + is_zero(), is_nan(), is_one(), is_odd(), is_even(), is_inf(), is_int() + digit(), length(), copy() + as_number() (alias: as_int()), as_hex(), as_bin() + is_positive(), is_negative() (alias: is_pos() and is_neg()) + mantissa(), exponent(), parts(), sign() + bgcd() accepts now lists, blcm() (also accepts lists) + flog()/blog() for overloading of log() + fexp()/bexp() for overloading of exp() + round(accuracy,precision,mode) round to accuracy/precision using mode + MBF: fpow(), fmod(), fdiv() in list context (Thanx J. Peacock) + fpow() can now handle non-integer arguments, like in fpow(2.1 ** 0.2) + MBI: bsqrt() + bmodpow(), bmodinv() (Thanx John Borwick) + bfloor(), bceil(), broot() + CORE cos()/sin()/exp()/atan2() now work when passed BigInts or BigFloats Please send me test-reports, your experiences with this and your ideas - I love to hear about my work! Tels