patch in Python?
Fernando Perez
fperez at pizero.colorado.edu
Wed Oct 2 20:58:34 CEST 2002
On Wed, 2 Oct 2002, Gerhard Häring wrote:
> > - How does this compare to gmpy?
>
> No idea. It doesn't have rationals, which GPM has (not sure about gmpy).
> Btw. I think mxNumber from MAL is the GMP wrapper that has the most
> momentum nowadays. His aim is a similar one: NUMERIC support for his
> mxODBC library.
Great. I'll have to look at mxNumber when I get around to working on this
problem. It would be great if the Numpy support was in already, but if
needed that's something I could work on.
> > - And http://www.nersc.gov/~dhbailey/mpdist/mpdist.html? This one is supposed
> > to be first rate.
>
> These are written in Fortran and C++, it seems. See above. In my tries
> to wrap MAPM I have found, however, that creating a new Python number
> type is relatively easy. So if these are worth wrapping, I think it
> should be a matter of days, rather than weeks.
This one is a strong candidate b/c the algorithms for extended (_not_
arbitrary) precision have been very carefully tuned.
> > I'd love to have the ability not only to define extended/arbitrary precision
> > scalars, but especially to have them carry over to Numeric. One could then
> > develop a difficult algorithm in arbitrary precision and then move it over to
> > only extended (or even normal) precision once everything is working reliably.
>
> Yeah, this sounds like a neat idea.
>
> One "problem" I currently have is this:
>
> Under MAPM, certain operations (division, exponentiation, ...) require
> an additional parameter for the precision. My current API is this:
>
> module mapm:
> def set_default_div_precision(n)
> def set_default_pow_precision(n)
>
> class MAPM:
> ...
> def __div__(self, other, precision=None)
> def __pow__(self, other, precision=None)
>
> But under normal operation, such as in:
>
> a = mapm.MAPM("27.34")
> b = mapm.MAPM("3.17")
> c = a / b
>
> you can't give the precision operator to __div__, so you'd have to set
> the precision before with something like:
>
> mapm.set_default_div_precision(10)
>
> alternatively, you can do without the "/" operator:
>
> c = a.__div__(b, 10)
>
> but this feels clumsy.
>
> To put it short: do you have any suggestion for a better API wrt.
> precision?
Well, you could extend your MAPM class so that _each_ number in it carries
a precision flag with it. Operations would then be done with the precision
of the lower of the two operands. Pseudocode:
class MAPM:
def __init__(self,data,precision=16):
...
Then,
a = mapm.MAPM("27.34",32)
b = mapm.MAPM("3.17",48)
c = a/b # c would be a mapm number with 32 digits.
You could have an overall flag for warnings, so that anytime that there is
a loss of precision (like in the above case) a warning is printed.
Cheers,
f.
More information about the Python-list
mailing list