Anything in the review queue?
Don
nospam at nospam.com
Wed Mar 23 02:46:26 PDT 2011
dsimcha wrote:
> On 3/22/2011 1:25 AM, Don wrote:
>>> There are a few approaches we can take from here. One is to define
>>> certain traits that differentiate BigInt from other integrals (e.g.
>>> preferAdditionToMultiplication or whatnot), and then design Rational to
>>> use those traits. Another is of course to specialize the entire
>>> Rational on BigInt. Third would be to specialize certain core routines
>>> (gcd and friends) for BigInt and keep Rational agnostic.
>>
>> You're missing something important here. Rational big integers are a
>> very well defined area of research, with its own set of algorithms.
>> Although you can pretend a BigInt behaves as an int, and make a rational
>> type, the performance will be pathetic, and everyone will laugh at you.
>
> I fully understand this based on your previous posts. I therefore agree
> that Rational doesn't belong in Phobos exactly as-is. I'm trying to
> understand which of the following scenarios is true, though:
>
> Scenario A: Making BigInt efficient would require changes only in a few
> small places, like GCD. If we provide hooks for arbitrary precision
> types to specialize these, and provide specializations for
> std.bigint.BigInt, all will be well.
>
> Scenario B: Making BigInt efficient would have ripple effects all over
> the implementation, require rethinking of every operation, etc., but in
> a way that wouldn't bleed out into the interface. It might make sense
> to get the interface and a generic implementation right first, then
> specialize it to improve performance later.
>
> Scenario C: Making BigInt efficient would have ripple effects for both
> the interface and the implementation. In this case, we probably
> shouldn't provide a generic implementation because the arbitrary
> precision one is much more generally useful and the fixed width one
> would mostly add clutter.
From the BigInt side, the only real change is the addition of gcd and
gcdExtended.
(gcdExtended returns x, y such that a*x + b*y = gcd(a, b) ).
I believe that is the only low-level algorithm which is missing; pretty
much everything else remains unchanged.
However, the other case which is interesting is when BigInt is replaced
with FixedInt!n (maybe someone can come up with a better name for this?)
-- an integer with a length of a fixed number of ints.
Unlike BigInt, this has basically the same semantics as built-in integer
types. In fact, FixedInt!1 == int, FixedInt!2 == long, FixedInt!4 == cent.
This is possibly even more relevant for Rational. I haven't thought much
about the implications though.
> BTW, does BigInt over-allocate initially to allow certain operations
> (like +=) to be done in-place more frequently?
No, it doesn't. As long as it uses copy-on-write, there's no benefit to
doing so.
Reference counting would clearly be superior for FixedInt, but I'm not
at all sure that it would be a win for BigInt. But of course FixedInt
wouldn't need to over-allocate.
Using TempAlloc would have a far greater effect on performance.
More information about the Digitalmars-d
mailing list