PEP239 (Rational Numbers) Reference Implementation and new issues

Bengt Richter bokr at oz.net
Fri Oct 4 16:28:38 CEST 2002


On 4 Oct 2002 00:45:39 -0700, paul at boddie.net (Paul Boddie) wrote:

>"Chris Gonnerman" <chris.gonnerman at newcenturycomputers.net> wrote in message news:<mailman.1033615625.14473.python-list at python.org>...
>> 
>> But I don't want to see rationals if I haven't asked for
>> them.
>
>[...]
>
>> but would it hurt so much to say 
>> 
>>     1/3R
>> 
>> instead?
>
>How about the use of specially formed rational literals using the
>underscore notation, which I'm sure exists in various other systems?
>For example:
>
>  1_3
>
>The standard operators would produce rational results from rational
>inputs:
>
>  1_3 + 2 == 7_3
>  1_3 - 2 == -5_3
>  1_3 / 2 == 1_6
>  1_3 * 2 == 2_3
>
>Use of floating point values in such operations would either produce
>errors:
>
>  1_3 + 2.5 -> TypeError
Why? All floating point numbers can be viewed as exact rationals
of the form n_<2**e>  with e>=0

 >>> R(1,3)
 1_3
 >>> R(2.5)
 5_2
 >>> R(1.0, 3.0)
 1_3
 >>> import math
 >>> R(math.pi)
 884279719003555_281474976710656

Multiply by big ten power and divide, and you can recognize it

 >>> 884279719003555L*10L**40/281474976710656L
 31415926535897931159979634685441851615905L
 >>> math.pi
 3.1415926535897931

the denominator is 2**48
 >>> 2l**48
 281474976710656L

>
>Or they could coerce the result to floating point (with the usual
>consequences):
>
>  1_3 + 2.5 -> 1.0 / 3.0 + 2.5 == 2.8333333333333335
>
>One would then need to define operators or functions to produce
>rationals from other types:
>
>  rational(1, 3) == 1_3
>  rational(1)    == 1_1
>  rational(1.5)  -> TypeError
 >>> R(1, 3)
 1_3
 >>> R(1)
 1_1
 >>> R(1.5)
 3_2
>
>And certain built-in functions would need changing:
>
>  int(1_3) == 0
>  float(1_3) -> 1.0 / 3.0 == 0.33333333333333331
>
>I'm sure that all this has been discussed over and over again before,
>though.
>
Probably ;-)
Using timbot's fixedpoint.py as a template, it should be relatively easy to
hack together something. Getting all the decisions made is another thing ;-)
Regards,
Bengt Richter



More information about the Python-list mailing list