Mercurial > cpython-lru_cache-weakref
annotate Lib/fractions.py @ 78069:a8aa77458e12 3.2
Add c_size_t and c_ssize_t to the ctypes summary table.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Thu, 12 Jul 2012 20:31:50 +0200 |
| parents | 4c4fe7139c68 |
| children | a2b54b6d9759 |
| 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 | 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) |
