Movatterモバイル変換


[0]ホーム

URL:


ANN: Experimental Number Types (Integer, Rational, Floats)

M.-A. Lemburgmal at lemburg.com
Thu Apr 19 15:04:41 EDT 2001


As you all know, Moshe Zadka has been pushing for a new rational numbertype recently (at the conference) and also implemented a proof-of-concept implementation of his rational PEP 239.Since the GNU Multi-Precision Lib (GMP) already has all these toolsproviding what people want most when it comes to numbers (precisionand speed), I thought that wrapping these as Python types wouldbe a good idea. I know that Alex Martelli has been workingon a similar approach, but that project (gmpy) seems to be inactive.Anyway, even though the GMP is available for most Unix platformsand MacOS, there was no relyable port for Windows. This was a show-stopper for me, so I decided to port GMP to Windows, which washarder than I though, but well, it's done now ;-)The wrapper is called mx.Number and provides access to threenumerical types:1. Integer(value)      -- arbitrary precision integers much like Python                          long only faster2. Rational(nom,denom) -- rational numbers with Integers as                          numerator and denominator3. Float(value[,prec]) -- floating point number with at least                          prec bits precisionPrerequisites:--------------* GMP 3.1.1  - Unix:  GMP 3.1.1 must be installed (http://www.swox.com/gmp/)  - Windows: GMP 3.1.1 is included in the download archives for Windows* Python 2.1* Optional: egenix-mx-base package available fromhttp://www.lemburg.com/files/python/* The "egenix-mx-experimental" package which includes mx.Number:  Source:http://www.lemburg.com/files/python/egenix-mx-experimental-0.1.0.zip  RPM:http://www.lemburg.com/files/python/egenix-mx-experimental-0.1.0-1.i386-py2.1.rpm  Windows installer:http://www.lemburg.com/files/python/egenix-mx-experimental-0.1.0.win32-py2.1.exeUsage is simple:----------------from mx.Number import *f = Float(3.141)r1 = Rational(3.141)r2 = Rational(2, 3)i = Integer("1231231231231231231231231")The coercion model will (someday) look like this:                     Float                       ^                       |       --------> Python float      |                ^      |                |      |             Rational      |                ^      |                |Python long ----->  Integer      ^                ^      |                |       --------  Python integerComplex numbers are not integrated into the picture since Ithink that they should not be auto-coerced.Some of these arrows are not implemented yet, others are not shown(e.g. Integer(2) + "3" works as one would expect ;-).Note that this is still a very rough version. Feedback is welcome.Questions:----------* What do you think about this coercion model ? Shouldn't we  have a PEP for this ?* Please try out the rational type and see if it fits your  needs -- the results are sometimes surprising (due to the  IEEE representations of floats); I'm sure this proof of  concept will raise a few more questions regarding the  usefulness of switching to rationals for literals like  1.123.* This implementation also showed that even though the coercion  patches have made integraton of numerical types easier, a full  integration is still hard to achieve. Some issues:  - string formatting cannot be "overridden" to allow formatting    of these new types  - there is no way of providing PyArg_ParseTuple() parser markers    for the types  - there is no way to bind the types to a Python literal, e.g.    by specifying a number literal modifier which is then bound    to the type: 1234L -> long("1234"), 1234.123F -> Float("1234.123"),    2R / 3 -> Rational(2, 3) etc.Comments ?-- Marc-Andre Lemburg______________________________________________________________________Company & Consulting:http://www.egenix.com/Python Pages:http://www.lemburg.com/python/


More information about the Python-listmailing list

[8]ページ先頭

©2009-2025 Movatter.jp