Rationals Lib?
dsimcha
dsimcha at yahoo.com
Sat Oct 10 15:50:13 PDT 2009
== Quote from language_fan (foo at bar.com.invalid)'s article
> Sat, 10 Oct 2009 21:29:41 +0000, dsimcha thusly wrote:
> > I guess I could have implemented some of these suggestions, but the idea
> > was for this lib to be very simple (it's only about 300 lines of code so
> > far) and agnostic to the implementation of the integers it's working on
> > top of, with the caveat that, if you use something that's not arbitrary
> > precision, the onus is on you to make sure nothing overflows. If
> > anyone, for example, made a wrapper to the GNU multiprecision lib that
> > looked like a D struct w/ operator overloading, it would be able to plug
> > right into this library. If std.bigint improves, this library will
> > automatically benefit.
> Now that's the most perfect way to test the modularity of the language --
> does it allow implementing a rational library on top of any (arbitrary
> precision) number type, assuming we have a sane interface to work with.
Save for a few small details, yes. Since there seems to be interest I'll clean up
the code and post it somewhere in the next few days. Here are the "few details":
1. To convert to floating-point form, I need to be able to cast the underlying
arbitrary precision integers to machine-native types. There's no standard way to
do this.
2. I need a standard way of constructing any type of integer, whether
machine-native or arbitrary precision, to implement some syntactic sugar features.
Let's say you wanted the number 314 as a rational, with a std.bigint.BigInt as
the underlying integer. Right now you'd have to do:
auto foo = fraction( BigInt(314), BigInt(1));
There's no shortcut yet for when you want a whole number to be represented
internally as a fraction because there's no standard way to construct any
arbitrary integer type with the value 1.
The same problem applies to conversion from floating-point to rational and
comparison between rational and integer.
More information about the Digitalmars-d
mailing list