annotate Lib/fractions.py @ 79691:05c8928362ee

Merge __next__ method link fixes with 3.3.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 12 Oct 2012 13:46:37 +0300
parents 4c4fe7139c68
children a2b54b6d9759
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Originally contributed by Sjoerd Mullender.
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 # Significantly modified by Jeffrey Yasskin <jyasskin at gmail.com>.
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
4 """Fraction, infinite-precision, real numbers."""
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
60234
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
6 from decimal import Decimal
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 import math
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 import numbers
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 import operator
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
10 import re
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
11 import sys
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
46743
16dddfe0a8cd Forward port r62849.
Raymond Hettinger <python@rcn.com>
parents: 45333
diff changeset
13 __all__ = ['Fraction', 'gcd']
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
44999
7c02182e2979 Merged revisions 60284-60349 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
17 def gcd(a, b):
7c02182e2979 Merged revisions 60284-60349 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
18 """Calculate the Greatest Common Divisor of a and b.
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 Unless b==0, the result will have the same sign as b (so that when
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 b is divided by it, the result comes out positive).
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 """
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 while b:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 a, b = b, a%b
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 return a
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
26
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
27 # Constants related to the hash implementation; hash(x) is based
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
28 # on the reduction of x modulo the prime _PyHASH_MODULUS.
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
29 _PyHASH_MODULUS = sys.hash_info.modulus
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
30 # Value to be used for rationals that reduce to infinity modulo
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
31 # _PyHASH_MODULUS.
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
32 _PyHASH_INF = sys.hash_info.inf
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
33
45134
bdcf40d1b38e Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45082
diff changeset
34 _RATIONAL_FORMAT = re.compile(r"""
bdcf40d1b38e Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45082
diff changeset
35 \A\s* # optional whitespace at the start, then
bdcf40d1b38e Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45082
diff changeset
36 (?P<sign>[-+]?) # an optional sign, then
bdcf40d1b38e Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45082
diff changeset
37 (?=\d|\.\d) # lookahead for digit or .digit
bdcf40d1b38e Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45082
diff changeset
38 (?P<num>\d*) # numerator (possibly empty)
53322
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
39 (?: # followed by
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
40 (?:/(?P<denom>\d+))? # an optional denominator
45134
bdcf40d1b38e Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45082
diff changeset
41 | # or
53322
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
42 (?:\.(?P<decimal>\d*))? # an optional fractional part
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
43 (?:E(?P<exp>[-+]?\d+))? # and optional exponent
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
44 )
45134
bdcf40d1b38e Merged revisions 60481,60485,60489-60520,60523-60527,60530-60533,60535-60538,60540-60551 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45082
diff changeset
45 \s*\Z # and optional whitespace to finish
53322
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
46 """, re.VERBOSE | re.IGNORECASE)
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
47
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
48
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
49 class Fraction(numbers.Rational):
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 """This class implements rational numbers.
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
51
60234
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
52 In the two-argument form of the constructor, Fraction(8, 6) will
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
53 produce a rational number equivalent to 4/3. Both arguments must
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
54 be Rational. The numerator defaults to 0 and the denominator
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
55 defaults to 1 so that Fraction(3) == 3 and Fraction() == 0.
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
56
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
57 Fractions can also be constructed from:
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
58
60234
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
59 - numeric strings similar to those accepted by the
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
60 float constructor (for example, '-2.3' or '1e10')
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
61
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
62 - strings of the form '123/456'
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
63
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
64 - float and Decimal instances
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
65
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
66 - other Rational instances (including integers)
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
67
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 """
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
69
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
70 __slots__ = ('_numerator', '_denominator')
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
71
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
72 # We're immutable, so use __new__ not __init__
53348
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
73 def __new__(cls, numerator=0, denominator=None):
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
74 """Constructs a Rational.
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
75
60234
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
76 Takes a string like '3/2' or '1.5', another Rational instance, a
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
77 numerator/denominator pair, or a float.
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
78
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
79 Examples
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
80 --------
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
81
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
82 >>> Fraction(10, -8)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
83 Fraction(-5, 4)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
84 >>> Fraction(Fraction(1, 7), 5)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
85 Fraction(1, 35)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
86 >>> Fraction(Fraction(1, 7), Fraction(2, 3))
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
87 Fraction(3, 14)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
88 >>> Fraction('314')
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
89 Fraction(314, 1)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
90 >>> Fraction('-35/4')
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
91 Fraction(-35, 4)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
92 >>> Fraction('3.1415') # conversion from numeric string
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
93 Fraction(6283, 2000)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
94 >>> Fraction('-47e-2') # string may include a decimal exponent
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
95 Fraction(-47, 100)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
96 >>> Fraction(1.47) # direct construction from float (exact conversion)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
97 Fraction(6620291452234629, 4503599627370496)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
98 >>> Fraction(2.25)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
99 Fraction(9, 4)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
100 >>> Fraction(Decimal('1.47'))
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
101 Fraction(147, 100)
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
102
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
103 """
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
104 self = super(Fraction, cls).__new__(cls)
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
105
53348
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
106 if denominator is None:
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
107 if isinstance(numerator, numbers.Rational):
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
108 self._numerator = numerator.numerator
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
109 self._denominator = numerator.denominator
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
110 return self
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
111
60234
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
112 elif isinstance(numerator, float):
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
113 # Exact conversion from float
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
114 value = Fraction.from_float(numerator)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
115 self._numerator = value._numerator
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
116 self._denominator = value._denominator
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
117 return self
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
118
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
119 elif isinstance(numerator, Decimal):
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
120 value = Fraction.from_decimal(numerator)
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
121 self._numerator = value._numerator
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
122 self._denominator = value._denominator
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
123 return self
cf80377184ff Merged revisions 79629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 60041
diff changeset
124
53348
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
125 elif isinstance(numerator, str):
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
126 # Handle construction from strings.
53322
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
127 m = _RATIONAL_FORMAT.match(numerator)
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
128 if m is None:
53322
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
129 raise ValueError('Invalid literal for Fraction: %r' %
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
130 numerator)
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
131 numerator = int(m.group('num') or '0')
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
132 denom = m.group('denom')
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
133 if denom:
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
134 denominator = int(denom)
44999
7c02182e2979 Merged revisions 60284-60349 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
135 else:
53322
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
136 denominator = 1
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
137 decimal = m.group('decimal')
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
138 if decimal:
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
139 scale = 10**len(decimal)
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
140 numerator = numerator * scale + int(decimal)
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
141 denominator *= scale
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
142 exp = m.group('exp')
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
143 if exp:
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
144 exp = int(exp)
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
145 if exp >= 0:
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
146 numerator *= 10**exp
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
147 else:
9bf4b3eb0447 Issue #5812: Make Fraction('1e6') valid. The Fraction constructor now
Mark Dickinson <dickinsm@gmail.com>
parents: 50529
diff changeset
148 denominator *= 10**-exp
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
149 if m.group('sign') == '-':
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
150 numerator = -numerator
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
151
53348
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
152 else:
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
153 raise TypeError("argument should be a string "
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
154 "or a Rational instance")
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
155
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
156 elif (isinstance(numerator, numbers.Rational) and
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
157 isinstance(denominator, numbers.Rational)):
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
158 numerator, denominator = (
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
159 numerator.numerator * denominator.denominator,
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
160 denominator.numerator * numerator.denominator
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
161 )
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
162 else:
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
163 raise TypeError("both arguments should be "
59a1fb939577 Merged revisions 71832 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53322
diff changeset
164 "Rational instances")
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
165
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 if denominator == 0:
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
167 raise ZeroDivisionError('Fraction(%s, 0)' % numerator)
44999
7c02182e2979 Merged revisions 60284-60349 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
168 g = gcd(numerator, denominator)
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
169 self._numerator = numerator // g
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
170 self._denominator = denominator // g
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
171 return self
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
172
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 @classmethod
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 def from_float(cls, f):
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
175 """Converts a finite float to a rational number, exactly.
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
176
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
177 Beware that Fraction.from_float(0.3) != Fraction(3, 10).
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
178
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
179 """
48499
de0bf60f1245 Merged revisions 64722,64729,64753,64845-64846,64849,64871,64880-64882,64885,64888,64897,64900-64901,64915,64926-64929,64938-64941,64944,64961,64966,64973 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48494
diff changeset
180 if isinstance(f, numbers.Integral):
50529
73ded94fb8be Manually merge r68096,68189 from 3.0 branch.
Georg Brandl <georg@python.org>
parents: 48499
diff changeset
181 return cls(f)
48499
de0bf60f1245 Merged revisions 64722,64729,64753,64845-64846,64849,64871,64880-64882,64885,64888,64897,64900-64901,64915,64926-64929,64938-64941,64944,64961,64966,64973 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48494
diff changeset
182 elif not isinstance(f, float):
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 raise TypeError("%s.from_float() only takes floats, not %r (%s)" %
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 (cls.__name__, f, type(f).__name__))
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 if math.isnan(f) or math.isinf(f):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 raise TypeError("Cannot convert %r to %s." % (f, cls.__name__))
45026
ebfbaa1051e2 Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44999
diff changeset
187 return cls(*f.as_integer_ratio())
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
188
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
189 @classmethod
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
190 def from_decimal(cls, dec):
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
191 """Converts a finite Decimal instance to a rational number, exactly."""
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
192 from decimal import Decimal
48499
de0bf60f1245 Merged revisions 64722,64729,64753,64845-64846,64849,64871,64880-64882,64885,64888,64897,64900-64901,64915,64926-64929,64938-64941,64944,64961,64966,64973 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48494
diff changeset
193 if isinstance(dec, numbers.Integral):
de0bf60f1245 Merged revisions 64722,64729,64753,64845-64846,64849,64871,64880-64882,64885,64888,64897,64900-64901,64915,64926-64929,64938-64941,64944,64961,64966,64973 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48494
diff changeset
194 dec = Decimal(int(dec))
de0bf60f1245 Merged revisions 64722,64729,64753,64845-64846,64849,64871,64880-64882,64885,64888,64897,64900-64901,64915,64926-64929,64938-64941,64944,64961,64966,64973 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48494
diff changeset
195 elif not isinstance(dec, Decimal):
44767
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
196 raise TypeError(
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
197 "%s.from_decimal() only takes Decimals, not %r (%s)" %
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
198 (cls.__name__, dec, type(dec).__name__))
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
199 if not dec.is_finite():
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
200 # Catches infinities and nans.
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
201 raise TypeError("Cannot convert %s to %s." % (dec, cls.__name__))
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
202 sign, digits, exp = dec.as_tuple()
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
203 digits = int(''.join(map(str, digits)))
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
204 if sign:
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
205 digits = -digits
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
206 if exp >= 0:
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
207 return cls(digits * 10 ** exp)
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
208 else:
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
209 return cls(digits, 10 ** -exp)
a6f9a2ba8962 Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44718
diff changeset
210
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
211 def limit_denominator(self, max_denominator=1000000):
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
212 """Closest Fraction to self with denominator at most max_denominator.
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
213
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
214 >>> Fraction('3.141592653589793').limit_denominator(10)
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
215 Fraction(22, 7)
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
216 >>> Fraction('3.141592653589793').limit_denominator(100)
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
217 Fraction(311, 99)
57406
0984099a9431 Merged revisions 76458 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55324
diff changeset
218 >>> Fraction(4321, 8765).limit_denominator(10000)
0984099a9431 Merged revisions 76458 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55324
diff changeset
219 Fraction(4321, 8765)
44905
c0f048356c36 Merged revisions 60210-60233 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44767
diff changeset
220
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
221 """
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
222 # Algorithm notes: For any real number x, define a *best upper
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
223 # approximation* to x to be a rational number p/q such that:
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
224 #
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
225 # (1) p/q >= x, and
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
226 # (2) if p/q > r/s >= x then s > q, for any rational r/s.
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
227 #
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
228 # Define *best lower approximation* similarly. Then it can be
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
229 # proved that a rational number is a best upper or lower
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
230 # approximation to x if, and only if, it is a convergent or
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
231 # semiconvergent of the (unique shortest) continued fraction
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
232 # associated to x.
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
233 #
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
234 # To find a best rational approximation with denominator <= M,
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
235 # we find the best upper and lower approximations with
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
236 # denominator <= M and take whichever of these is closer to x.
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
237 # In the event of a tie, the bound with smaller denominator is
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
238 # chosen. If both denominators are equal (which can happen
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
239 # only when max_denominator == 1 and self is midway between
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
240 # two integers) the lower bound---i.e., the floor of self, is
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
241 # taken.
44905
c0f048356c36 Merged revisions 60210-60233 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44767
diff changeset
242
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
243 if max_denominator < 1:
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
244 raise ValueError("max_denominator should be at least 1")
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
245 if self._denominator <= max_denominator:
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
246 return Fraction(self)
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
247
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
248 p0, q0, p1, q1 = 0, 1, 1, 0
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
249 n, d = self._numerator, self._denominator
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
250 while True:
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
251 a = n//d
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
252 q2 = q0+a*q1
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
253 if q2 > max_denominator:
44905
c0f048356c36 Merged revisions 60210-60233 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44767
diff changeset
254 break
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
255 p0, q0, p1, q1 = p1, q1, p0+a*p1, q2
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
256 n, d = d, n-a*d
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
257
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
258 k = (max_denominator-q0)//q1
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
259 bound1 = Fraction(p0+k*p1, q0+k*q1)
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
260 bound2 = Fraction(p1, q1)
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
261 if abs(bound2 - self) <= abs(bound1-self):
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
262 return bound2
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
263 else:
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
264 return bound1
44905
c0f048356c36 Merged revisions 60210-60233 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44767
diff changeset
265
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
266 @property
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
267 def numerator(a):
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
268 return a._numerator
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
269
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
270 @property
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
271 def denominator(a):
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
272 return a._denominator
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
273
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 def __repr__(self):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 """repr(self)"""
48412
5f4a8980c1ac Merged revisions 64475,64544-64545,64550,64557-64558,64565,64570,64577,64582-64583,64585,64590,64592-64593,64625,64630,64638,64647,64655-64656,64663-64664 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48410
diff changeset
276 return ('Fraction(%s, %s)' % (self._numerator, self._denominator))
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
277
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 def __str__(self):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 """str(self)"""
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
280 if self._denominator == 1:
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
281 return str(self._numerator)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 else:
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
283 return '%s/%s' % (self._numerator, self._denominator)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
284
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 def _operator_fallbacks(monomorphic_operator, fallback_operator):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 """Generates forward and reverse operators given a purely-rational
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 operator and a function from the operator module.
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
288
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 Use this like:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 __op__, __rop__ = _operator_fallbacks(just_rational_op, operator.op)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
291
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
292 In general, we want to implement the arithmetic operations so
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
293 that mixed-mode operations either call an implementation whose
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
294 author knew about the types of both arguments, or convert both
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
295 to the nearest built in type and do the operation there. In
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
296 Fraction, that means that we define __add__ and __radd__ as:
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
297
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
298 def __add__(self, other):
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
299 # Both types have numerators/denominator attributes,
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
300 # so do the operation directly
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
301 if isinstance(other, (int, Fraction)):
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
302 return Fraction(self.numerator * other.denominator +
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
303 other.numerator * self.denominator,
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
304 self.denominator * other.denominator)
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
305 # float and complex don't have those operations, but we
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
306 # know about those types, so special case them.
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
307 elif isinstance(other, float):
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
308 return float(self) + other
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
309 elif isinstance(other, complex):
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
310 return complex(self) + other
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
311 # Let the other type take over.
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
312 return NotImplemented
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
313
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
314 def __radd__(self, other):
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
315 # radd handles more types than add because there's
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
316 # nothing left to fall back to.
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
317 if isinstance(other, numbers.Rational):
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
318 return Fraction(self.numerator * other.denominator +
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
319 other.numerator * self.denominator,
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
320 self.denominator * other.denominator)
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
321 elif isinstance(other, Real):
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
322 return float(other) + float(self)
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
323 elif isinstance(other, Complex):
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
324 return complex(other) + complex(self)
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
325 return NotImplemented
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
326
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
327
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
328 There are 5 different cases for a mixed-type addition on
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
329 Fraction. I'll refer to all of the above code that doesn't
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
330 refer to Fraction, float, or complex as "boilerplate". 'r'
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
331 will be an instance of Fraction, which is a subtype of
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
332 Rational (r : Fraction <: Rational), and b : B <:
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
333 Complex. The first three involve 'r + b':
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
334
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
335 1. If B <: Fraction, int, float, or complex, we handle
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
336 that specially, and all is well.
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
337 2. If Fraction falls back to the boilerplate code, and it
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
338 were to return a value from __add__, we'd miss the
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
339 possibility that B defines a more intelligent __radd__,
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
340 so the boilerplate should return NotImplemented from
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
341 __add__. In particular, we don't handle Rational
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
342 here, even though we could get an exact answer, in case
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
343 the other type wants to do something special.
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
344 3. If B <: Fraction, Python tries B.__radd__ before
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
345 Fraction.__add__. This is ok, because it was
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
346 implemented with knowledge of Fraction, so it can
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
347 handle those instances before delegating to Real or
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
348 Complex.
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
349
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
350 The next two situations describe 'b + r'. We assume that b
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
351 didn't know about Fraction in its implementation, and that it
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
352 uses similar boilerplate code:
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
353
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
354 4. If B <: Rational, then __radd_ converts both to the
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
355 builtin rational type (hey look, that's us) and
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
356 proceeds.
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
357 5. Otherwise, __radd__ tries to find the nearest common
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
358 base ABC, and fall back to its builtin type. Since this
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
359 class doesn't subclass a concrete type, there's no
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
360 implementation to fall back to, so we need to try as
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
361 hard as possible to return an actual value, or the user
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
362 will get a TypeError.
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45026
diff changeset
363
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 """
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 def forward(a, b):
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
366 if isinstance(b, (int, Fraction)):
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 return monomorphic_operator(a, b)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 elif isinstance(b, float):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 return fallback_operator(float(a), b)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 elif isinstance(b, complex):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
371 return fallback_operator(complex(a), b)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 else:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 return NotImplemented
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 forward.__name__ = '__' + fallback_operator.__name__ + '__'
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
375 forward.__doc__ = monomorphic_operator.__doc__
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
376
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 def reverse(b, a):
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
378 if isinstance(a, numbers.Rational):
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 # Includes ints.
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
380 return monomorphic_operator(a, b)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 elif isinstance(a, numbers.Real):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
382 return fallback_operator(float(a), float(b))
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 elif isinstance(a, numbers.Complex):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
384 return fallback_operator(complex(a), complex(b))
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 else:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 return NotImplemented
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 reverse.__name__ = '__r' + fallback_operator.__name__ + '__'
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 reverse.__doc__ = monomorphic_operator.__doc__
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
389
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 return forward, reverse
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
391
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
392 def _add(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 """a + b"""
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
394 return Fraction(a.numerator * b.denominator +
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 b.numerator * a.denominator,
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 a.denominator * b.denominator)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
397
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 __add__, __radd__ = _operator_fallbacks(_add, operator.add)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
399
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 def _sub(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 """a - b"""
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
402 return Fraction(a.numerator * b.denominator -
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
403 b.numerator * a.denominator,
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 a.denominator * b.denominator)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
405
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
406 __sub__, __rsub__ = _operator_fallbacks(_sub, operator.sub)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
407
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 def _mul(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
409 """a * b"""
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
410 return Fraction(a.numerator * b.numerator, a.denominator * b.denominator)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
411
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 __mul__, __rmul__ = _operator_fallbacks(_mul, operator.mul)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
413
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 def _div(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
415 """a / b"""
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
416 return Fraction(a.numerator * b.denominator,
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 a.denominator * b.numerator)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
418
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 __truediv__, __rtruediv__ = _operator_fallbacks(_div, operator.truediv)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
420
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
421 def __floordiv__(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 """a // b"""
44718
26b61a5df11b Update the py3k version of the rational module to expose only methods needed by
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44699
diff changeset
423 return math.floor(a / b)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
424
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 def __rfloordiv__(b, a):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 """a // b"""
44718
26b61a5df11b Update the py3k version of the rational module to expose only methods needed by
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44699
diff changeset
427 return math.floor(a / b)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
428
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
429 def __mod__(a, b):
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
430 """a % b"""
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 div = a // b
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 return a - b * div
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
433
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 def __rmod__(b, a):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 """a % b"""
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
436 div = a // b
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
437 return a - b * div
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
438
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 def __pow__(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 """a ** b
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
441
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 If b is not an integer, the result will be a float or complex
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
443 since roots are generally irrational. If b is an integer, the
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 result will be rational.
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
445
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 """
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
447 if isinstance(b, numbers.Rational):
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 if b.denominator == 1:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 power = b.numerator
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
450 if power >= 0:
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
451 return Fraction(a._numerator ** power,
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
452 a._denominator ** power)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
453 else:
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
454 return Fraction(a._denominator ** -power,
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
455 a._numerator ** -power)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 else:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 # A fractional power will generally produce an
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 # irrational number.
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
459 return float(a) ** float(b)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 else:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
461 return float(a) ** b
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
462
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 def __rpow__(b, a):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 """a ** b"""
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
465 if b._denominator == 1 and b._numerator >= 0:
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 # If a is an int, keep it that way if possible.
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
467 return a ** b._numerator
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
468
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
469 if isinstance(a, numbers.Rational):
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
470 return Fraction(a.numerator, a.denominator) ** b
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
471
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
472 if b._denominator == 1:
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
473 return a ** b._numerator
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
474
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
475 return a ** float(b)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
476
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 def __pos__(a):
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
478 """+a: Coerces a subclass instance to Fraction"""
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
479 return Fraction(a._numerator, a._denominator)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
480
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
481 def __neg__(a):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
482 """-a"""
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
483 return Fraction(-a._numerator, a._denominator)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
484
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
485 def __abs__(a):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
486 """abs(a)"""
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
487 return Fraction(abs(a._numerator), a._denominator)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
488
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
489 def __trunc__(a):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
490 """trunc(a)"""
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
491 if a._numerator < 0:
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
492 return -(-a._numerator // a._denominator)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
493 else:
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
494 return a._numerator // a._denominator
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
495
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
496 def __floor__(a):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
497 """Will be math.floor(a) in 3.0."""
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
498 return a.numerator // a.denominator
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
499
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
500 def __ceil__(a):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
501 """Will be math.ceil(a) in 3.0."""
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
502 # The negations cleverly convince floordiv to return the ceiling.
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 return -(-a.numerator // a.denominator)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
504
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
505 def __round__(self, ndigits=None):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
506 """Will be round(self, ndigits) in 3.0.
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
507
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
508 Rounds half toward even.
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
509 """
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
510 if ndigits is None:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 floor, remainder = divmod(self.numerator, self.denominator)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
512 if remainder * 2 < self.denominator:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
513 return floor
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
514 elif remainder * 2 > self.denominator:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
515 return floor + 1
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
516 # Deal with the half case:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
517 elif floor % 2 == 0:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
518 return floor
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
519 else:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
520 return floor + 1
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 shift = 10**abs(ndigits)
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
522 # See _operator_fallbacks.forward to check that the results of
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
523 # these operations will always be Fraction and therefore have
44718
26b61a5df11b Update the py3k version of the rational module to expose only methods needed by
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44699
diff changeset
524 # round().
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
525 if ndigits > 0:
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
526 return Fraction(round(self * shift), shift)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
527 else:
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
528 return Fraction(round(self / shift) * shift)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
529
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
530 def __hash__(self):
66185
4c4fe7139c68 Make Fraction(-1).__hash__() return -2 rather than -1 (see issue 10356).
Mark Dickinson <dickinsm@gmail.com>
parents: 61873
diff changeset
531 """hash(self)"""
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
532
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
533 # XXX since this method is expensive, consider caching the result
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
534
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
535 # In order to make sure that the hash of a Fraction agrees
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
536 # with the hash of a numerically equal integer, float or
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
537 # Decimal instance, we follow the rules for numeric hashes
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
538 # outlined in the documentation. (See library docs, 'Built-in
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
539 # Types').
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
540
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
541 # dinv is the inverse of self._denominator modulo the prime
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
542 # _PyHASH_MODULUS, or 0 if self._denominator is divisible by
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
543 # _PyHASH_MODULUS.
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
544 dinv = pow(self._denominator, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
545 if not dinv:
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
546 hash_ = _PyHASH_INF
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
547 else:
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 60234
diff changeset
548 hash_ = abs(self._numerator) * dinv % _PyHASH_MODULUS
66185
4c4fe7139c68 Make Fraction(-1).__hash__() return -2 rather than -1 (see issue 10356).
Mark Dickinson <dickinsm@gmail.com>
parents: 61873
diff changeset
549 result = hash_ if self >= 0 else -hash_
4c4fe7139c68 Make Fraction(-1).__hash__() return -2 rather than -1 (see issue 10356).
Mark Dickinson <dickinsm@gmail.com>
parents: 61873
diff changeset
550 return -2 if result == -1 else result
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
551
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
552 def __eq__(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
553 """a == b"""
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
554 if isinstance(b, numbers.Rational):
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
555 return (a._numerator == b.numerator and
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
556 a._denominator == b.denominator)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
557 if isinstance(b, numbers.Complex) and b.imag == 0:
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
558 b = b.real
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
559 if isinstance(b, float):
55324
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
560 if math.isnan(b) or math.isinf(b):
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
561 # comparisons with an infinity or nan should behave in
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
562 # the same way for any finite a, so treat a as zero.
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
563 return 0.0 == b
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
564 else:
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
565 return a == a.from_float(b)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
566 else:
55324
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
567 # Since a doesn't know how to compare with b, let's give b
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
568 # a chance to compare itself with a.
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
569 return NotImplemented
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
570
55324
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
571 def _richcmp(self, other, op):
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
572 """Helper for comparison operators, for internal use only.
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
573
55324
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
574 Implement comparison between a Rational instance `self`, and
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
575 either another Rational instance or a float `other`. If
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
576 `other` is not a Rational instance or a float, return
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
577 NotImplemented. `op` should be one of the six standard
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
578 comparison operators.
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
579
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
580 """
55324
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
581 # convert other to a Rational instance where reasonable.
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
582 if isinstance(other, numbers.Rational):
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
583 return op(self._numerator * other.denominator,
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
584 self._denominator * other.numerator)
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
585 if isinstance(other, float):
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
586 if math.isnan(other) or math.isinf(other):
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
587 return op(0.0, other)
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
588 else:
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
589 return op(self, self.from_float(other))
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
590 else:
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 return NotImplemented
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
592
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
593 def __lt__(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
594 """a < b"""
55324
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
595 return a._richcmp(b, operator.lt)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
596
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
597 def __gt__(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
598 """a > b"""
55324
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
599 return a._richcmp(b, operator.gt)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
600
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 def __le__(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
602 """a <= b"""
55324
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
603 return a._richcmp(b, operator.le)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
604
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
605 def __ge__(a, b):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
606 """a >= b"""
55324
a19eb9637ff7 Merged revisions 74078 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 53348
diff changeset
607 return a._richcmp(b, operator.ge)
44699
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
608
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
609 def __bool__(a):
6f049ca55e06 Merged revisions 59952-59984 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
610 """a != 0"""
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
611 return a._numerator != 0
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
612
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
613 # support for pickling, copy, and deepcopy
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
614
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
615 def __reduce__(self):
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
616 return (self.__class__, (str(self),))
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
617
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
618 def __copy__(self):
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
619 if type(self) == Fraction:
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
620 return self # I'm immutable; therefore I am my own clone
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
621 return self.__class__(self._numerator, self._denominator)
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
622
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
623 def __deepcopy__(self, memo):
45278
e67050d62adf Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60706,60708-60712,60714-60724 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45145
diff changeset
624 if type(self) == Fraction:
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44905
diff changeset
625 return self # My components are also immutable
45333
e70f56cf6972 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45278
diff changeset
626 return self.__class__(self._numerator, self._denominator)