Mercurial > cpython-lru_cache-weakref
annotate Lib/decimal.py @ 79691:05c8928362ee
Merge __next__ method link fixes with 3.3.
| author | Ezio Melotti <ezio.melotti@gmail.com> |
|---|---|
| date | Fri, 12 Oct 2012 13:46:37 +0300 |
| parents | 52aaa9295cc4 |
| children | 29becac5dd9b 7ada0faded9b |
| rev | line source |
|---|---|
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1 # Copyright (c) 2004 Python Software Foundation. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2 # All rights reserved. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4 # Written by Eric Price <eprice at tjhsst.edu> |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5 # and Facundo Batista <facundo at taniquetil.com.ar> |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6 # and Raymond Hettinger <python at rcn.com> |
| 32456 | 7 # and Aahz <aahz at pobox.com> |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
8 # and Tim Peters |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
9 |
|
51655
51db18084ecb
Removed message about compatibility with 2.3.
Facundo Batista <facundobatista@gmail.com>
parents:
51297
diff
changeset
|
10 # This module should be kept in sync with the latest updates of the |
|
51db18084ecb
Removed message about compatibility with 2.3.
Facundo Batista <facundobatista@gmail.com>
parents:
51297
diff
changeset
|
11 # IBM specification as it evolves. Those updates will be treated |
|
33198
017227e47c3d
Establish policies with respect to 2.3 compatibilty and treated spec
Raymond Hettinger <python@rcn.com>
parents:
33157
diff
changeset
|
12 # as bug fixes (deviation from the spec is a compatibility, usability |
|
017227e47c3d
Establish policies with respect to 2.3 compatibilty and treated spec
Raymond Hettinger <python@rcn.com>
parents:
33157
diff
changeset
|
13 # bug) and will be backported. At this point the spec is stabilizing |
|
017227e47c3d
Establish policies with respect to 2.3 compatibilty and treated spec
Raymond Hettinger <python@rcn.com>
parents:
33157
diff
changeset
|
14 # and the updates are becoming fewer, smaller, and less significant. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
15 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
16 """ |
|
51655
51db18084ecb
Removed message about compatibility with 2.3.
Facundo Batista <facundobatista@gmail.com>
parents:
51297
diff
changeset
|
17 This is an implementation of decimal floating point arithmetic based on |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
18 the General Decimal Arithmetic Specification: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
19 |
|
53299
696dd2281841
Update links and version info.
Raymond Hettinger <python@rcn.com>
parents:
52201
diff
changeset
|
20 http://speleotrove.com/decimal/decarith.html |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
21 |
|
32489
ab0a2b74ddfd
Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents:
32487
diff
changeset
|
22 and IEEE standard 854-1987: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
23 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
24 www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
25 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
26 Decimal floating point has finite precision with arbitrarily large bounds. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
27 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
28 The purpose of this module is to support arithmetic using familiar |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
29 "schoolhouse" rules and to avoid some of the tricky representation |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
30 issues associated with binary floating point. The package is especially |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
31 useful for financial applications or for contexts where users have |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
32 expectations that are at odds with binary floating point (for instance, |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
33 in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead |
|
62300
44cac5c565b7
Fix mild type confusion in decimal module docstring.
Mark Dickinson <dickinsm@gmail.com>
parents:
62244
diff
changeset
|
34 of 0.0; Decimal('1.00') % Decimal('0.1') returns the expected |
|
44cac5c565b7
Fix mild type confusion in decimal module docstring.
Mark Dickinson <dickinsm@gmail.com>
parents:
62244
diff
changeset
|
35 Decimal('0.00')). |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
36 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
37 Here are some examples of using the decimal module: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
38 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
39 >>> from decimal import * |
|
32529
2476a8334286
Tim gets his default traps.
Raymond Hettinger <python@rcn.com>
parents:
32528
diff
changeset
|
40 >>> setcontext(ExtendedContext) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
41 >>> Decimal(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:
45307
diff
changeset
|
42 Decimal('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:
45307
diff
changeset
|
43 >>> Decimal('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:
45307
diff
changeset
|
44 Decimal('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:
45307
diff
changeset
|
45 >>> Decimal('-.0123') |
|
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:
45307
diff
changeset
|
46 Decimal('-0.0123') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
47 >>> Decimal(123456) |
|
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:
45307
diff
changeset
|
48 Decimal('123456') |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
49 >>> Decimal('123.45e12345678') |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
50 Decimal('1.2345E+12345680') |
|
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:
45307
diff
changeset
|
51 >>> Decimal('1.33') + Decimal('1.27') |
|
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:
45307
diff
changeset
|
52 Decimal('2.60') |
|
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:
45307
diff
changeset
|
53 >>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41') |
|
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:
45307
diff
changeset
|
54 Decimal('-2.20') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
55 >>> dig = Decimal(1) |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
56 >>> print(dig / Decimal(3)) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
57 0.333333333 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
58 >>> getcontext().prec = 18 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
59 >>> print(dig / Decimal(3)) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
60 0.333333333333333333 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
61 >>> print(dig.sqrt()) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
62 1 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
63 >>> print(Decimal(3).sqrt()) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
64 1.73205080756887729 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
65 >>> print(Decimal(3) ** 123) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
66 4.85192780976896427E+58 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
67 >>> inf = Decimal(1) / Decimal(0) |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
68 >>> print(inf) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
69 Infinity |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
70 >>> neginf = Decimal(-1) / Decimal(0) |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
71 >>> print(neginf) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
72 -Infinity |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
73 >>> print(neginf + inf) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
74 NaN |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
75 >>> print(neginf * inf) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
76 -Infinity |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
77 >>> print(dig / 0) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
78 Infinity |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
79 >>> getcontext().traps[DivisionByZero] = 1 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
80 >>> print(dig / 0) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
81 Traceback (most recent call last): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
82 ... |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
83 ... |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
84 ... |
|
39690
0cb9e57ec406
Inspired by SF patch #860326, make the exception formatting by
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
85 decimal.DivisionByZero: x / 0 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
86 >>> c = Context() |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
87 >>> c.traps[InvalidOperation] = 0 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
88 >>> print(c.flags[InvalidOperation]) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
89 0 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
90 >>> c.divide(Decimal(0), Decimal(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:
45307
diff
changeset
|
91 Decimal('NaN') |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
92 >>> c.traps[InvalidOperation] = 1 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
93 >>> print(c.flags[InvalidOperation]) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
94 1 |
| 32560 | 95 >>> c.flags[InvalidOperation] = 0 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
96 >>> print(c.flags[InvalidOperation]) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
97 0 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
98 >>> print(c.divide(Decimal(0), Decimal(0))) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
99 Traceback (most recent call last): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
100 ... |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
101 ... |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
102 ... |
|
39690
0cb9e57ec406
Inspired by SF patch #860326, make the exception formatting by
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
103 decimal.InvalidOperation: 0 / 0 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
104 >>> print(c.flags[InvalidOperation]) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
105 1 |
| 32560 | 106 >>> c.flags[InvalidOperation] = 0 |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
107 >>> c.traps[InvalidOperation] = 0 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
108 >>> print(c.divide(Decimal(0), Decimal(0))) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
109 NaN |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
110 >>> print(c.flags[InvalidOperation]) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
111 1 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
112 >>> |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
113 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
114 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
115 __all__ = [ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
116 # Two major classes |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
117 'Decimal', 'Context', |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
118 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
119 # Contexts |
| 32482 | 120 'DefaultContext', 'BasicContext', 'ExtendedContext', |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
121 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
122 # Exceptions |
|
32561
6f351b1bcf53
* Update the test suite to reflect that ConversionSyntax was no longer
Raymond Hettinger <python@rcn.com>
parents:
32560
diff
changeset
|
123 'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero', |
|
6f351b1bcf53
* Update the test suite to reflect that ConversionSyntax was no longer
Raymond Hettinger <python@rcn.com>
parents:
32560
diff
changeset
|
124 'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow', |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
125 'FloatOperation', |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
126 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
127 # Constants for use in setting up contexts |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
128 'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING', |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
129 'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP', |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
130 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
131 # Functions for manipulating contexts |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
132 'setcontext', 'getcontext', 'localcontext', |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
133 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
134 # Limits for the C version for compatibility |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
135 'MAX_PREC', 'MAX_EMAX', 'MIN_EMIN', 'MIN_ETINY', |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
136 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
137 # C version: compile time choice that enables the thread local context |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
138 'HAVE_THREADS' |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
139 ] |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
140 |
|
53299
696dd2281841
Update links and version info.
Raymond Hettinger <python@rcn.com>
parents:
52201
diff
changeset
|
141 __version__ = '1.70' # Highest version of the spec this complies with |
|
66575
693f7430c3ca
Add link to specification.
Raymond Hettinger <python@rcn.com>
parents:
66506
diff
changeset
|
142 # See http://speleotrove.com/decimal/ |
|
53299
696dd2281841
Update links and version info.
Raymond Hettinger <python@rcn.com>
parents:
52201
diff
changeset
|
143 |
|
35035
c55899863b9c
Minor namespace clean-up.
Raymond Hettinger <python@rcn.com>
parents:
34812
diff
changeset
|
144 import copy as _copy |
|
50499
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
145 import math as _math |
|
51297
5b713045ea90
Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents:
51029
diff
changeset
|
146 import numbers as _numbers |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
147 import sys |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
148 |
|
44643
d8e4342c145e
Merged revisions 59883-59920 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44604
diff
changeset
|
149 try: |
|
d8e4342c145e
Merged revisions 59883-59920 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44604
diff
changeset
|
150 from collections import namedtuple as _namedtuple |
|
d8e4342c145e
Merged revisions 59883-59920 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44604
diff
changeset
|
151 DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent') |
|
d8e4342c145e
Merged revisions 59883-59920 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44604
diff
changeset
|
152 except ImportError: |
|
d8e4342c145e
Merged revisions 59883-59920 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44604
diff
changeset
|
153 DecimalTuple = lambda *args: args |
|
d8e4342c145e
Merged revisions 59883-59920 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44604
diff
changeset
|
154 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
155 # Rounding |
|
32489
ab0a2b74ddfd
Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents:
32487
diff
changeset
|
156 ROUND_DOWN = 'ROUND_DOWN' |
|
ab0a2b74ddfd
Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents:
32487
diff
changeset
|
157 ROUND_HALF_UP = 'ROUND_HALF_UP' |
|
ab0a2b74ddfd
Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents:
32487
diff
changeset
|
158 ROUND_HALF_EVEN = 'ROUND_HALF_EVEN' |
|
ab0a2b74ddfd
Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents:
32487
diff
changeset
|
159 ROUND_CEILING = 'ROUND_CEILING' |
|
ab0a2b74ddfd
Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents:
32487
diff
changeset
|
160 ROUND_FLOOR = 'ROUND_FLOOR' |
|
ab0a2b74ddfd
Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents:
32487
diff
changeset
|
161 ROUND_UP = 'ROUND_UP' |
|
ab0a2b74ddfd
Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents:
32487
diff
changeset
|
162 ROUND_HALF_DOWN = 'ROUND_HALF_DOWN' |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
163 ROUND_05UP = 'ROUND_05UP' |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
164 |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
165 # Compatibility with the C version |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
166 HAVE_THREADS = True |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
167 if sys.maxsize == 2**63-1: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
168 MAX_PREC = 999999999999999999 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
169 MAX_EMAX = 999999999999999999 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
170 MIN_EMIN = -999999999999999999 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
171 else: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
172 MAX_PREC = 425000000 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
173 MAX_EMAX = 425000000 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
174 MIN_EMIN = -425000000 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
175 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
176 MIN_ETINY = MIN_EMIN - (MAX_PREC-1) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
177 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
178 # Errors |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
179 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
180 class DecimalException(ArithmeticError): |
| 32560 | 181 """Base exception class. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
182 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
183 Used exceptions derive from this. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
184 If an exception derives from another exception besides this (such as |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
185 Underflow (Inexact, Rounded, Subnormal) that indicates that it is only |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
186 called if the others are present. This isn't actually used for |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
187 anything, though. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
188 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
189 handle -- Called when context._raise_error is called and the |
|
61746
49d7de9d7b1a
Merged revisions 81352 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61214
diff
changeset
|
190 trap_enabler is not set. First argument is self, second is the |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
191 context. More arguments can be given, those being after |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
192 the explanation in _raise_error (For example, |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
193 context._raise_error(NewError, '(-x)!', self._sign) would |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
194 call NewError().handle(context, self._sign).) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
195 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
196 To define a new exception, it should be sufficient to have it derive |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
197 from DecimalException. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
198 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
199 def handle(self, context, *args): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
200 pass |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
201 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
202 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
203 class Clamped(DecimalException): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
204 """Exponent of a 0 changed to fit bounds. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
205 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
206 This occurs and signals clamped if the exponent of a result has been |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
207 altered in order to fit the constraints of a specific concrete |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
208 representation. This may occur when the exponent of a zero result would |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
209 be outside the bounds of a representation, or when a large normal |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
210 number would have an encoded exponent that cannot be represented. In |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
211 this latter case, the exponent is reduced to fit and the corresponding |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
212 number of zero digits are appended to the coefficient ("fold-down"). |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
213 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
214 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
215 class InvalidOperation(DecimalException): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
216 """An invalid operation was performed. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
217 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
218 Various bad things cause this: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
219 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
220 Something creates a signaling NaN |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
221 -INF + INF |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
222 0 * (+-)INF |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
223 (+-)INF / (+-)INF |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
224 x % 0 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
225 (+-)INF % x |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
226 x._rescale( non-integer ) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
227 sqrt(-x) , x > 0 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
228 0 ** 0 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
229 x ** (non-integer) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
230 x ** (+-)INF |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
231 An operand is invalid |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
232 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
233 The result of the operation after these is a quiet positive NaN, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
234 except when the cause is a signaling NaN, in which case the result is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
235 also a quiet NaN, but with the original sign, and an optional |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
236 diagnostic information. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
237 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
238 def handle(self, context, *args): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
239 if args: |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
240 ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True) |
|
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
241 return ans._fix_nan(context) |
|
50473
d367be543f6c
Merged revisions 68184 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50115
diff
changeset
|
242 return _NaN |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
243 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
244 class ConversionSyntax(InvalidOperation): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
245 """Trying to convert badly formed string. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
246 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
247 This occurs and signals invalid-operation if an string is being |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
248 converted to a number and it does not conform to the numeric string |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
249 syntax. The result is [0,qNaN]. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
250 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
251 def handle(self, context, *args): |
|
50473
d367be543f6c
Merged revisions 68184 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50115
diff
changeset
|
252 return _NaN |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
253 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
254 class DivisionByZero(DecimalException, ZeroDivisionError): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
255 """Division by 0. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
256 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
257 This occurs and signals division-by-zero if division of a finite number |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
258 by zero was attempted (during a divide-integer or divide operation, or a |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
259 power operation with negative right-hand operand), and the dividend was |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
260 not zero. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
261 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
262 The result of the operation is [sign,inf], where sign is the exclusive |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
263 or of the signs of the operands for divide, or is 1 for an odd power of |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
264 -0, for power. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
265 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
266 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
267 def handle(self, context, sign, *args): |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
268 return _SignedInfinity[sign] |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
269 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
270 class DivisionImpossible(InvalidOperation): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
271 """Cannot perform the division adequately. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
272 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
273 This occurs and signals invalid-operation if the integer result of a |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
274 divide-integer or remainder operation had too many digits (would be |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
275 longer than precision). The result is [0,qNaN]. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
276 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
277 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
278 def handle(self, context, *args): |
|
50473
d367be543f6c
Merged revisions 68184 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50115
diff
changeset
|
279 return _NaN |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
280 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
281 class DivisionUndefined(InvalidOperation, ZeroDivisionError): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
282 """Undefined result of division. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
283 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
284 This occurs and signals invalid-operation if division by zero was |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
285 attempted (during a divide-integer, divide, or remainder operation), and |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
286 the dividend is also zero. The result is [0,qNaN]. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
287 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
288 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
289 def handle(self, context, *args): |
|
50473
d367be543f6c
Merged revisions 68184 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50115
diff
changeset
|
290 return _NaN |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
291 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
292 class Inexact(DecimalException): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
293 """Had to round, losing information. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
294 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
295 This occurs and signals inexact whenever the result of an operation is |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
296 not exact (that is, it needed to be rounded and any discarded digits |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
297 were non-zero), or if an overflow or underflow condition occurs. The |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
298 result in all cases is unchanged. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
299 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
300 The inexact signal may be tested (or trapped) to determine if a given |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
301 operation (or sequence of operations) was inexact. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
302 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
303 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
304 class InvalidContext(InvalidOperation): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
305 """Invalid context. Unknown rounding, for example. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
306 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
307 This occurs and signals invalid-operation if an invalid context was |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
308 detected during an operation. This can occur if contexts are not checked |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
309 on creation and either the precision exceeds the capability of the |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
310 underlying concrete representation or an unknown or unsupported rounding |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
311 was specified. These aspects of the context need only be checked when |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
312 the values are required to be used. The result is [0,qNaN]. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
313 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
314 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
315 def handle(self, context, *args): |
|
50473
d367be543f6c
Merged revisions 68184 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50115
diff
changeset
|
316 return _NaN |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
317 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
318 class Rounded(DecimalException): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
319 """Number got rounded (not necessarily changed during rounding). |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
320 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
321 This occurs and signals rounded whenever the result of an operation is |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
322 rounded (that is, some zero or non-zero digits were discarded from the |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
323 coefficient), or if an overflow or underflow condition occurs. The |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
324 result in all cases is unchanged. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
325 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
326 The rounded signal may be tested (or trapped) to determine if a given |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
327 operation (or sequence of operations) caused a loss of precision. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
328 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
329 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
330 class Subnormal(DecimalException): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
331 """Exponent < Emin before rounding. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
332 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
333 This occurs and signals subnormal whenever the result of a conversion or |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
334 operation is subnormal (that is, its adjusted exponent is less than |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
335 Emin, before any rounding). The result in all cases is unchanged. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
336 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
337 The subnormal signal may be tested (or trapped) to determine if a given |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
338 or operation (or sequence of operations) yielded a subnormal result. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
339 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
340 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
341 class Overflow(Inexact, Rounded): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
342 """Numerical overflow. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
343 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
344 This occurs and signals overflow if the adjusted exponent of a result |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
345 (from a conversion or from an operation that is not an attempt to divide |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
346 by zero), after rounding, would be greater than the largest value that |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
347 can be handled by the implementation (the value Emax). |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
348 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
349 The result depends on the rounding mode: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
350 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
351 For round-half-up and round-half-even (and for round-half-down and |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
352 round-up, if implemented), the result of the operation is [sign,inf], |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
353 where sign is the sign of the intermediate result. For round-down, the |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
354 result is the largest finite number that can be represented in the |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
355 current precision, with the sign of the intermediate result. For |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
356 round-ceiling, the result is the same as for round-down if the sign of |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
357 the intermediate result is 1, or is [0,inf] otherwise. For round-floor, |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
358 the result is the same as for round-down if the sign of the intermediate |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
359 result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
360 will also be raised. |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
361 """ |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
362 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
363 def handle(self, context, sign, *args): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
364 if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN, |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
365 ROUND_HALF_DOWN, ROUND_UP): |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
366 return _SignedInfinity[sign] |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
367 if sign == 0: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
368 if context.rounding == ROUND_CEILING: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
369 return _SignedInfinity[sign] |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
370 return _dec_from_triple(sign, '9'*context.prec, |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
371 context.Emax-context.prec+1) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
372 if sign == 1: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
373 if context.rounding == ROUND_FLOOR: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
374 return _SignedInfinity[sign] |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
375 return _dec_from_triple(sign, '9'*context.prec, |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
376 context.Emax-context.prec+1) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
377 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
378 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
379 class Underflow(Inexact, Rounded, Subnormal): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
380 """Numerical underflow with result rounded to 0. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
381 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
382 This occurs and signals underflow if a result is inexact and the |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
383 adjusted exponent of the result would be smaller (more negative) than |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
384 the smallest value that can be handled by the implementation (the value |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
385 Emin). That is, the result is both inexact and subnormal. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
386 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
387 The result after an underflow will be a subnormal number rounded, if |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
388 necessary, so that its exponent is not less than Etiny. This may result |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
389 in 0 with the sign of the intermediate result and an exponent of Etiny. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
390 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
391 In all cases, Inexact, Rounded, and Subnormal will also be raised. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
392 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
393 |
|
75899
94009b75a09d
Use the same exception hierarchy as decimal.py. FloatOperation now also
Stefan Krah <skrah@bytereef.org>
parents:
75850
diff
changeset
|
394 class FloatOperation(DecimalException, TypeError): |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
395 """Enable stricter semantics for mixing floats and Decimals. |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
396 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
397 If the signal is not trapped (default), mixing floats and Decimals is |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
398 permitted in the Decimal() constructor, context.create_decimal() and |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
399 all comparison operators. Both conversion and comparisons are exact. |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
400 Any occurrence of a mixed operation is silently recorded by setting |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
401 FloatOperation in the context flags. Explicit conversions with |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
402 Decimal.from_float() or context.create_decimal_from_float() do not |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
403 set the flag. |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
404 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
405 Otherwise (the signal is trapped), only equality comparisons and explicit |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
406 conversions are silent. All other mixed operations raise FloatOperation. |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
407 """ |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
408 |
| 32560 | 409 # List of public traps and flags |
|
32666
c13d911ae05b
* Rename "Signals" to "_signals" making it non-public.
Raymond Hettinger <python@rcn.com>
parents:
32576
diff
changeset
|
410 _signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded, |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
411 Underflow, InvalidOperation, Subnormal, FloatOperation] |
| 32560 | 412 |
| 413 # Map conditions (per the spec) to signals | |
| 414 _condition_map = {ConversionSyntax:InvalidOperation, | |
| 415 DivisionImpossible:InvalidOperation, | |
| 416 DivisionUndefined:InvalidOperation, | |
| 417 InvalidContext:InvalidOperation} | |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
418 |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
419 # Valid rounding modes |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
420 _rounding_modes = (ROUND_DOWN, ROUND_HALF_UP, ROUND_HALF_EVEN, ROUND_CEILING, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
421 ROUND_FLOOR, ROUND_UP, ROUND_HALF_DOWN, ROUND_05UP) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
422 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
423 ##### Context Functions ################################################## |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
424 |
|
32675
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
425 # The getcontext() and setcontext() function manage access to a thread-local |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
426 # current context. Py2.4 offers direct support for thread locals. If that |
|
47674
8f61ae01130f
Fix last traces of old threading API.
Georg Brandl <georg@python.org>
parents:
46789
diff
changeset
|
427 # is not available, use threading.current_thread() which is slower but will |
| 34184 | 428 # work for older Pythons. If threads are not part of the build, create a |
| 429 # mock threading object with threading.local() returning the module namespace. | |
| 430 | |
| 431 try: | |
| 432 import threading | |
| 433 except ImportError: | |
| 434 # Python was compiled without threads; create a mock object instead | |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
435 class MockThreading(object): |
| 34184 | 436 def local(self, sys=sys): |
| 437 return sys.modules[__name__] | |
| 438 threading = MockThreading() | |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
439 del MockThreading |
|
32675
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
440 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
441 try: |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
442 threading.local |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
443 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
444 except AttributeError: |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
445 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
446 # To fix reloading, force it to create a new context |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
447 # Old contexts have different exceptions in their dicts, making problems. |
|
47674
8f61ae01130f
Fix last traces of old threading API.
Georg Brandl <georg@python.org>
parents:
46789
diff
changeset
|
448 if hasattr(threading.current_thread(), '__decimal_context__'): |
|
8f61ae01130f
Fix last traces of old threading API.
Georg Brandl <georg@python.org>
parents:
46789
diff
changeset
|
449 del threading.current_thread().__decimal_context__ |
|
32675
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
450 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
451 def setcontext(context): |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
452 """Set this thread's context to context.""" |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
453 if context in (DefaultContext, BasicContext, ExtendedContext): |
|
33044
2749334d71a4
* Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents:
32980
diff
changeset
|
454 context = context.copy() |
|
32980
e89ef0bfa1ff
SF bug #1002530: test_decimal fails if repeated
Raymond Hettinger <python@rcn.com>
parents:
32675
diff
changeset
|
455 context.clear_flags() |
|
47674
8f61ae01130f
Fix last traces of old threading API.
Georg Brandl <georg@python.org>
parents:
46789
diff
changeset
|
456 threading.current_thread().__decimal_context__ = context |
|
32675
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
457 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
458 def getcontext(): |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
459 """Returns this thread's context. |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
460 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
461 If this thread does not yet have a context, returns |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
462 a new context and sets this thread's context. |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
463 New contexts are copies of DefaultContext. |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
464 """ |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
465 try: |
|
47674
8f61ae01130f
Fix last traces of old threading API.
Georg Brandl <georg@python.org>
parents:
46789
diff
changeset
|
466 return threading.current_thread().__decimal_context__ |
|
32675
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
467 except AttributeError: |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
468 context = Context() |
|
47674
8f61ae01130f
Fix last traces of old threading API.
Georg Brandl <georg@python.org>
parents:
46789
diff
changeset
|
469 threading.current_thread().__decimal_context__ = context |
|
32675
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
470 return context |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
471 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
472 else: |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
473 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
474 local = threading.local() |
|
33044
2749334d71a4
* Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents:
32980
diff
changeset
|
475 if hasattr(local, '__decimal_context__'): |
|
2749334d71a4
* Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents:
32980
diff
changeset
|
476 del local.__decimal_context__ |
|
32675
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
477 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
478 def getcontext(_local=local): |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
479 """Returns this thread's context. |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
480 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
481 If this thread does not yet have a context, returns |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
482 a new context and sets this thread's context. |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
483 New contexts are copies of DefaultContext. |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
484 """ |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
485 try: |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
486 return _local.__decimal_context__ |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
487 except AttributeError: |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
488 context = Context() |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
489 _local.__decimal_context__ = context |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
490 return context |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
491 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
492 def setcontext(context, _local=local): |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
493 """Set this thread's context to context.""" |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
494 if context in (DefaultContext, BasicContext, ExtendedContext): |
|
33044
2749334d71a4
* Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents:
32980
diff
changeset
|
495 context = context.copy() |
|
32980
e89ef0bfa1ff
SF bug #1002530: test_decimal fails if repeated
Raymond Hettinger <python@rcn.com>
parents:
32675
diff
changeset
|
496 context.clear_flags() |
|
32675
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
497 _local.__decimal_context__ = context |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
498 |
|
949473fa4828
Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents:
32674
diff
changeset
|
499 del threading, local # Don't contaminate the namespace |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
500 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
501 def localcontext(ctx=None): |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
502 """Return a context manager for a copy of the supplied context |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
503 |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
504 Uses a copy of the current context if no context is specified |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
505 The returned context manager creates a local decimal context |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
506 in a with statement: |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
507 def sin(x): |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
508 with localcontext() as ctx: |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
509 ctx.prec += 2 |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
510 # Rest of sin calculation algorithm |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
511 # uses a precision 2 greater than normal |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
512 return +s # Convert result to normal precision |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
513 |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
514 def sin(x): |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
515 with localcontext(ExtendedContext): |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
516 # Rest of sin calculation algorithm |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
517 # uses the Extended Context from the |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
518 # General Decimal Arithmetic Specification |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
519 return +s # Convert result to normal context |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
520 |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46650
diff
changeset
|
521 >>> setcontext(DefaultContext) |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
522 >>> print(getcontext().prec) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
523 28 |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
524 >>> with localcontext(): |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
525 ... ctx = getcontext() |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40785
diff
changeset
|
526 ... ctx.prec += 2 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
527 ... print(ctx.prec) |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
528 ... |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
529 30 |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
530 >>> with localcontext(ExtendedContext): |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
531 ... print(getcontext().prec) |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
532 ... |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
533 9 |
|
40785
22760d53d4da
Fix a bunch of doctests with the -d option of refactor.py.
Guido van Rossum <guido@python.org>
parents:
40644
diff
changeset
|
534 >>> print(getcontext().prec) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
535 28 |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
536 """ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
537 if ctx is None: ctx = getcontext() |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
538 return _ContextManager(ctx) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
539 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
540 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
541 ##### Decimal class ####################################################### |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
542 |
|
50930
5a041d9a51cd
Issue 4998: Decimal should not subclass or register with numbers.Real.
Raymond Hettinger <python@rcn.com>
parents:
50602
diff
changeset
|
543 # Do not subclass Decimal from numbers.Real and do not register it as such |
|
5a041d9a51cd
Issue 4998: Decimal should not subclass or register with numbers.Real.
Raymond Hettinger <python@rcn.com>
parents:
50602
diff
changeset
|
544 # (because Decimals are not interoperable with floats). See the notes in |
|
5a041d9a51cd
Issue 4998: Decimal should not subclass or register with numbers.Real.
Raymond Hettinger <python@rcn.com>
parents:
50602
diff
changeset
|
545 # numbers.py for more detail. |
|
5a041d9a51cd
Issue 4998: Decimal should not subclass or register with numbers.Real.
Raymond Hettinger <python@rcn.com>
parents:
50602
diff
changeset
|
546 |
|
5a041d9a51cd
Issue 4998: Decimal should not subclass or register with numbers.Real.
Raymond Hettinger <python@rcn.com>
parents:
50602
diff
changeset
|
547 class Decimal(object): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
548 """Floating point class for decimal arithmetic.""" |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
549 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
550 __slots__ = ('_exp','_int','_sign', '_is_special') |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
551 # Generally, the value of the Decimal instance is given by |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
552 # (-1)**_sign * _int * 10**_exp |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
553 # Special values are signified by _is_special == True |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
554 |
| 33695 | 555 # We're immutable, so use __new__ not __init__ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
556 def __new__(cls, value="0", context=None): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
557 """Create a decimal point instance. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
558 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
559 >>> Decimal('3.14') # string input |
|
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:
45307
diff
changeset
|
560 Decimal('3.14') |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
561 >>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent) |
|
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:
45307
diff
changeset
|
562 Decimal('3.14') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
563 >>> Decimal(314) # int |
|
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:
45307
diff
changeset
|
564 Decimal('314') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
565 >>> Decimal(Decimal(314)) # another decimal instance |
|
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:
45307
diff
changeset
|
566 Decimal('314') |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
567 >>> Decimal(' 3.14 \\n') # leading and trailing whitespace okay |
|
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:
45307
diff
changeset
|
568 Decimal('3.14') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
569 """ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
570 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
571 # Note that the coefficient, self._int, is actually stored as |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
572 # a string rather than as a tuple of digits. This speeds up |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
573 # the "digits to integer" and "integer to digits" conversions |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
574 # that are used in almost every arithmetic operation on |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
575 # Decimals. This is an internal detail: the as_tuple function |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
576 # and the Decimal constructor still deal with tuples of |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
577 # digits. |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
578 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
579 self = object.__new__(cls) |
|
44070
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
580 |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
581 # From a string |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
582 # REs insist on real strings, so we can too. |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
583 if isinstance(value, str): |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
584 m = _parser(value.strip()) |
|
44070
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
585 if m is None: |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
586 if context is None: |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
587 context = getcontext() |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
588 return context._raise_error(ConversionSyntax, |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
589 "Invalid literal for Decimal: %r" % value) |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
590 |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
591 if m.group('sign') == "-": |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
592 self._sign = 1 |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
593 else: |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
594 self._sign = 0 |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
595 intpart = m.group('int') |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
596 if intpart is not None: |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
597 # finite number |
|
55517
88255cb4534d
Merged revisions 74279 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53299
diff
changeset
|
598 fracpart = m.group('frac') or '' |
|
44070
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
599 exp = int(m.group('exp') or '0') |
|
55517
88255cb4534d
Merged revisions 74279 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53299
diff
changeset
|
600 self._int = str(int(intpart+fracpart)) |
|
88255cb4534d
Merged revisions 74279 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53299
diff
changeset
|
601 self._exp = exp - len(fracpart) |
|
44070
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
602 self._is_special = False |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
603 else: |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
604 diag = m.group('diag') |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
605 if diag is not None: |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
606 # NaN |
|
55517
88255cb4534d
Merged revisions 74279 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53299
diff
changeset
|
607 self._int = str(int(diag or '0')).lstrip('0') |
|
44070
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
608 if m.group('signal'): |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
609 self._exp = 'N' |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
610 else: |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
611 self._exp = 'n' |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
612 else: |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
613 # infinity |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
614 self._int = '0' |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
615 self._exp = 'F' |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
616 self._is_special = True |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
617 return self |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
618 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
619 # From an integer |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
620 if isinstance(value, int): |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
621 if value >= 0: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
622 self._sign = 0 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
623 else: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
624 self._sign = 1 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
625 self._exp = 0 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
626 self._int = str(abs(value)) |
|
44070
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
627 self._is_special = False |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
628 return self |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
629 |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
630 # From another decimal |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
631 if isinstance(value, Decimal): |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
632 self._exp = value._exp |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
633 self._sign = value._sign |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
634 self._int = value._int |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
635 self._is_special = value._is_special |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
636 return self |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
637 |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
638 # From an internal working value |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
639 if isinstance(value, _WorkRep): |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
640 self._sign = value.sign |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
641 self._int = str(value.int) |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
642 self._exp = int(value.exp) |
|
f564405c8104
Merged revisions 59234-59238 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
643 self._is_special = False |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
644 return self |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
645 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
646 # tuple/list conversion (possibly from as_tuple()) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
647 if isinstance(value, (list,tuple)): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
648 if len(value) != 3: |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
649 raise ValueError('Invalid tuple size in creation of Decimal ' |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
650 'from list or tuple. The list or tuple ' |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
651 'should have exactly three elements.') |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
652 # process sign. The isinstance test rejects floats |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
653 if not (isinstance(value[0], int) and value[0] in (0,1)): |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
654 raise ValueError("Invalid sign. The first value in the tuple " |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
655 "should be an integer; either 0 for a " |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
656 "positive number or 1 for a negative number.") |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
657 self._sign = value[0] |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
658 if value[2] == 'F': |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
659 # infinity: value[1] is ignored |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
660 self._int = '0' |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
661 self._exp = value[2] |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
662 self._is_special = True |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
663 else: |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
664 # process and validate the digits in value[1] |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
665 digits = [] |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
666 for digit in value[1]: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
667 if isinstance(digit, int) and 0 <= digit <= 9: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
668 # skip leading zeros |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
669 if digits or digit != 0: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
670 digits.append(digit) |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
671 else: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
672 raise ValueError("The second value in the tuple must " |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
673 "be composed of integers in the range " |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
674 "0 through 9.") |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
675 if value[2] in ('n', 'N'): |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
676 # NaN: digits form the diagnostic |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
677 self._int = ''.join(map(str, digits)) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
678 self._exp = value[2] |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
679 self._is_special = True |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
680 elif isinstance(value[2], int): |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
681 # finite number: digits give the coefficient |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
682 self._int = ''.join(map(str, digits or [0])) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
683 self._exp = value[2] |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
684 self._is_special = False |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
685 else: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
686 raise ValueError("The third value in the tuple must " |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
687 "be an integer, or one of the " |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
688 "strings 'F', 'n', 'N'.") |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
689 return self |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
690 |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
691 if isinstance(value, float): |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
692 if context is None: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
693 context = getcontext() |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
694 context._raise_error(FloatOperation, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
695 "strict semantics for mixing floats and Decimals are " |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
696 "enabled") |
|
60166
d1101aa984c0
Issue 8257: Decimal constructor to accept float argument.
Raymond Hettinger <python@rcn.com>
parents:
58936
diff
changeset
|
697 value = Decimal.from_float(value) |
|
d1101aa984c0
Issue 8257: Decimal constructor to accept float argument.
Raymond Hettinger <python@rcn.com>
parents:
58936
diff
changeset
|
698 self._exp = value._exp |
|
d1101aa984c0
Issue 8257: Decimal constructor to accept float argument.
Raymond Hettinger <python@rcn.com>
parents:
58936
diff
changeset
|
699 self._sign = value._sign |
|
d1101aa984c0
Issue 8257: Decimal constructor to accept float argument.
Raymond Hettinger <python@rcn.com>
parents:
58936
diff
changeset
|
700 self._int = value._int |
|
d1101aa984c0
Issue 8257: Decimal constructor to accept float argument.
Raymond Hettinger <python@rcn.com>
parents:
58936
diff
changeset
|
701 self._is_special = value._is_special |
|
d1101aa984c0
Issue 8257: Decimal constructor to accept float argument.
Raymond Hettinger <python@rcn.com>
parents:
58936
diff
changeset
|
702 return self |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
703 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
704 raise TypeError("Cannot convert %r to Decimal" % value) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
705 |
|
50597
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
706 # @classmethod, but @decorator is not valid Python 2.3 syntax, so |
|
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
707 # don't use it (see notes on Py2.3 compatibility at top of file) |
|
50499
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
708 def from_float(cls, f): |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
709 """Converts a float to a decimal number, exactly. |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
710 |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
711 Note that Decimal.from_float(0.1) is not the same as Decimal('0.1'). |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
712 Since 0.1 is not exactly representable in binary floating point, the |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
713 value is stored as the nearest representable value which is |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
714 0x1.999999999999ap-4. The exact equivalent of the value in decimal |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
715 is 0.1000000000000000055511151231257827021181583404541015625. |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
716 |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
717 >>> Decimal.from_float(0.1) |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
718 Decimal('0.1000000000000000055511151231257827021181583404541015625') |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
719 >>> Decimal.from_float(float('nan')) |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
720 Decimal('NaN') |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
721 >>> Decimal.from_float(float('inf')) |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
722 Decimal('Infinity') |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
723 >>> Decimal.from_float(-float('inf')) |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
724 Decimal('-Infinity') |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
725 >>> Decimal.from_float(-0.0) |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
726 Decimal('-0') |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
727 |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
728 """ |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
729 if isinstance(f, int): # handle integer inputs |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
730 return cls(f) |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
731 if not isinstance(f, float): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
732 raise TypeError("argument must be int or float.") |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
733 if _math.isinf(f) or _math.isnan(f): |
|
50499
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
734 return cls(repr(f)) |
|
50597
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
735 if _math.copysign(1.0, f) == 1.0: |
|
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
736 sign = 0 |
|
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
737 else: |
|
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
738 sign = 1 |
|
50499
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
739 n, d = abs(f).as_integer_ratio() |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
740 k = d.bit_length() - 1 |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
741 result = _dec_from_triple(sign, str(n*5**k), -k) |
|
50597
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
742 if cls is Decimal: |
|
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
743 return result |
|
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
744 else: |
|
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
745 return cls(result) |
|
40ba2a1253fa
Merged revisions 68314 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50499
diff
changeset
|
746 from_float = classmethod(from_float) |
|
50499
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
747 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
748 def _isnan(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
749 """Returns whether the number is not actually one. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
750 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
751 0 if a number |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
752 1 if NaN |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
753 2 if sNaN |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
754 """ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
755 if self._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
756 exp = self._exp |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
757 if exp == 'n': |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
758 return 1 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
759 elif exp == 'N': |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
760 return 2 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
761 return 0 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
762 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
763 def _isinfinity(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
764 """Returns whether the number is infinite |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
765 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
766 0 if finite or not a number |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
767 1 if +INF |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
768 -1 if -INF |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
769 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
770 if self._exp == 'F': |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
771 if self._sign: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
772 return -1 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
773 return 1 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
774 return 0 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
775 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
776 def _check_nans(self, other=None, context=None): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
777 """Returns whether the number is not actually one. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
778 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
779 if self, other are sNaN, signal |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
780 if self, other are NaN return nan |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
781 return 0 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
782 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
783 Done before operations. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
784 """ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
785 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
786 self_is_nan = self._isnan() |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
787 if other is None: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
788 other_is_nan = False |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
789 else: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
790 other_is_nan = other._isnan() |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
791 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
792 if self_is_nan or other_is_nan: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
793 if context is None: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
794 context = getcontext() |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
795 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
796 if self_is_nan == 2: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
797 return context._raise_error(InvalidOperation, 'sNaN', |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
798 self) |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
799 if other_is_nan == 2: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
800 return context._raise_error(InvalidOperation, 'sNaN', |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
801 other) |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
802 if self_is_nan: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
803 return self._fix_nan(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
804 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
805 return other._fix_nan(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
806 return 0 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
807 |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
808 def _compare_check_nans(self, other, context): |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
809 """Version of _check_nans used for the signaling comparisons |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
810 compare_signal, __le__, __lt__, __ge__, __gt__. |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
811 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
812 Signal InvalidOperation if either self or other is a (quiet |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
813 or signaling) NaN. Signaling NaNs take precedence over quiet |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
814 NaNs. |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
815 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
816 Return 0 if neither operand is a NaN. |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
817 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
818 """ |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
819 if context is None: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
820 context = getcontext() |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
821 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
822 if self._is_special or other._is_special: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
823 if self.is_snan(): |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
824 return context._raise_error(InvalidOperation, |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
825 'comparison involving sNaN', |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
826 self) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
827 elif other.is_snan(): |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
828 return context._raise_error(InvalidOperation, |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
829 'comparison involving sNaN', |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
830 other) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
831 elif self.is_qnan(): |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
832 return context._raise_error(InvalidOperation, |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
833 'comparison involving NaN', |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
834 self) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
835 elif other.is_qnan(): |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
836 return context._raise_error(InvalidOperation, |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
837 'comparison involving NaN', |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
838 other) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
839 return 0 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
840 |
|
40401
88133417dfd0
- patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents:
39690
diff
changeset
|
841 def __bool__(self): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
842 """Return True if self is nonzero; otherwise return False. |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
843 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
844 NaNs and infinities are considered nonzero. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
845 """ |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
846 return self._is_special or self._int != '0' |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
847 |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
848 def _cmp(self, other): |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
849 """Compare the two non-NaN decimal instances self and other. |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
850 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
851 Returns -1 if self < other, 0 if self == other and 1 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
852 if self > other. This routine is for internal use only.""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
853 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
854 if self._is_special or other._is_special: |
|
51029
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
855 self_inf = self._isinfinity() |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
856 other_inf = other._isinfinity() |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
857 if self_inf == other_inf: |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
858 return 0 |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
859 elif self_inf < other_inf: |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
860 return -1 |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
861 else: |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
862 return 1 |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
863 |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
864 # check for zeros; Decimal('0') == Decimal('-0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
865 if not self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
866 if not other: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
867 return 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
868 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
869 return -((-1)**other._sign) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
870 if not other: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
871 return (-1)**self._sign |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
872 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
873 # If different signs, neg one is less |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
874 if other._sign < self._sign: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
875 return -1 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
876 if self._sign < other._sign: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
877 return 1 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
878 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
879 self_adjusted = self.adjusted() |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
880 other_adjusted = other.adjusted() |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
881 if self_adjusted == other_adjusted: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
882 self_padded = self._int + '0'*(self._exp - other._exp) |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
883 other_padded = other._int + '0'*(other._exp - self._exp) |
|
51029
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
884 if self_padded == other_padded: |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
885 return 0 |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
886 elif self_padded < other_padded: |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
887 return -(-1)**self._sign |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
888 else: |
|
fd8af46d3615
Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50930
diff
changeset
|
889 return (-1)**self._sign |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
890 elif self_adjusted > other_adjusted: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
891 return (-1)**self._sign |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
892 else: # self_adjusted < other_adjusted |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
893 return -((-1)**self._sign) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
894 |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
895 # Note: The Decimal standard doesn't cover rich comparisons for |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
896 # Decimals. In particular, the specification is silent on the |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
897 # subject of what should happen for a comparison involving a NaN. |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
898 # We take the following approach: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
899 # |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
900 # == comparisons involving a quiet NaN always return False |
|
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
901 # != comparisons involving a quiet NaN always return True |
|
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
902 # == or != comparisons involving a signaling NaN signal |
|
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
903 # InvalidOperation, and return False or True as above if the |
|
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
904 # InvalidOperation is not trapped. |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
905 # <, >, <= and >= comparisons involving a (quiet or signaling) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
906 # NaN signal InvalidOperation, and return False if the |
|
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:
45244
diff
changeset
|
907 # InvalidOperation is not trapped. |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
908 # |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
909 # This behavior is designed to conform as closely as possible to |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
910 # that specified by IEEE 754. |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
911 |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
912 def __eq__(self, other, context=None): |
|
62241
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
913 self, other = _convert_for_comparison(self, other, equality_op=True) |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
914 if other is NotImplemented: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
915 return other |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
916 if self._check_nans(other, context): |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
917 return False |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
918 return self._cmp(other) == 0 |
|
32505
191796b7a054
* Add __eq__ and __ne__ so that things like list.index() work properly
Raymond Hettinger <python@rcn.com>
parents:
32499
diff
changeset
|
919 |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
920 def __ne__(self, other, context=None): |
|
62241
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
921 self, other = _convert_for_comparison(self, other, equality_op=True) |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
922 if other is NotImplemented: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
923 return other |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
924 if self._check_nans(other, context): |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
925 return True |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
926 return self._cmp(other) != 0 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
927 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
928 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
929 def __lt__(self, other, context=None): |
|
62241
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
930 self, other = _convert_for_comparison(self, other) |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
931 if other is NotImplemented: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
932 return other |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
933 ans = self._compare_check_nans(other, context) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
934 if ans: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
935 return False |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
936 return self._cmp(other) < 0 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
937 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
938 def __le__(self, other, context=None): |
|
62241
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
939 self, other = _convert_for_comparison(self, other) |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
940 if other is NotImplemented: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
941 return other |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
942 ans = self._compare_check_nans(other, context) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
943 if ans: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
944 return False |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
945 return self._cmp(other) <= 0 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
946 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
947 def __gt__(self, other, context=None): |
|
62241
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
948 self, other = _convert_for_comparison(self, other) |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
949 if other is NotImplemented: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
950 return other |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
951 ans = self._compare_check_nans(other, context) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
952 if ans: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
953 return False |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
954 return self._cmp(other) > 0 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
955 |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
956 def __ge__(self, other, context=None): |
|
62241
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
957 self, other = _convert_for_comparison(self, other) |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
958 if other is NotImplemented: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
959 return other |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
960 ans = self._compare_check_nans(other, context) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
961 if ans: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
962 return False |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
963 return self._cmp(other) >= 0 |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
38453
diff
changeset
|
964 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
965 def compare(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
966 """Compares one to another. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
967 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
968 -1 => a < b |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
969 0 => a = b |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
970 1 => a > b |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
971 NaN => one is NaN |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
972 Like __cmp__, but returns Decimal instances. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
973 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
974 other = _convert_other(other, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
975 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
976 # Compare(NaN, NaN) = NaN |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
977 if (self._is_special or other and other._is_special): |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
978 ans = self._check_nans(other, context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
979 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
980 return ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
981 |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
982 return Decimal(self._cmp(other)) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
983 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
984 def __hash__(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
985 """x.__hash__() <==> hash(x)""" |
|
61873
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
986 |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
987 # In order to make sure that the hash of a Decimal instance |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
988 # agrees with the hash of a numerically equal integer, float |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
989 # or Fraction, we follow the rules for numeric hashes outlined |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
990 # in the documentation. (See library docs, 'Built-in Types'). |
|
34758
50509ee96364
Bug #1163325: "special" decimals aren't hashable
Raymond Hettinger <python@rcn.com>
parents:
34638
diff
changeset
|
991 if self._is_special: |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
992 if self.is_snan(): |
| 66346 | 993 raise TypeError('Cannot hash a signaling NaN value.') |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
994 elif self.is_nan(): |
|
61873
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
995 return _PyHASH_NAN |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
996 else: |
|
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
997 if self._sign: |
|
61873
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
998 return -_PyHASH_INF |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
999 else: |
|
61873
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
1000 return _PyHASH_INF |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
1001 |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
1002 if self._exp >= 0: |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
1003 exp_hash = pow(10, self._exp, _PyHASH_MODULUS) |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
1004 else: |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
1005 exp_hash = pow(_PyHASH_10INV, -self._exp, _PyHASH_MODULUS) |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
1006 hash_ = int(self._int) * exp_hash % _PyHASH_MODULUS |
|
66215
c9fb30fd1f0a
Issue #10356: Decimal(-1).__hash__() should equal hash(Decimal(-1)).
Stefan Krah <stefan@bytereef.org>
parents:
62869
diff
changeset
|
1007 ans = hash_ if self >= 0 else -hash_ |
|
c9fb30fd1f0a
Issue #10356: Decimal(-1).__hash__() should equal hash(Decimal(-1)).
Stefan Krah <stefan@bytereef.org>
parents:
62869
diff
changeset
|
1008 return -2 if ans == -1 else ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1009 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1010 def as_tuple(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1011 """Represents the number as a triple tuple. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1012 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1013 To show the internals exactly as they are. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1014 """ |
|
44643
d8e4342c145e
Merged revisions 59883-59920 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44604
diff
changeset
|
1015 return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1016 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1017 def __repr__(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1018 """Represents the number as an instance of Decimal.""" |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1019 # Invariant: eval(repr(d)) == d |
|
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:
45307
diff
changeset
|
1020 return "Decimal('%s')" % str(self) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1021 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1022 def __str__(self, eng=False, context=None): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1023 """Return string representation of the number in scientific notation. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1024 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1025 Captures all of the information in the underlying representation. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1026 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1027 |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1028 sign = ['', '-'][self._sign] |
|
35113
adf189eb4f58
Apply the _is_special guard.
Raymond Hettinger <python@rcn.com>
parents:
35035
diff
changeset
|
1029 if self._is_special: |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1030 if self._exp == 'F': |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1031 return sign + 'Infinity' |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1032 elif self._exp == 'n': |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1033 return sign + 'NaN' + self._int |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1034 else: # self._exp == 'N' |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1035 return sign + 'sNaN' + self._int |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1036 |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1037 # number of digits of self._int to left of decimal point |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1038 leftdigits = self._exp + len(self._int) |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1039 |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1040 # dotplace is number of digits of self._int to the left of the |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1041 # decimal point in the mantissa of the output string (that is, |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1042 # after adjusting the exponent) |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1043 if self._exp <= 0 and leftdigits > -6: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1044 # no exponent required |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1045 dotplace = leftdigits |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1046 elif not eng: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1047 # usual scientific notation: 1 digit on left of the point |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1048 dotplace = 1 |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1049 elif self._int == '0': |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1050 # engineering notation, zero |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1051 dotplace = (leftdigits + 1) % 3 - 1 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1052 else: |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1053 # engineering notation, nonzero |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1054 dotplace = (leftdigits - 1) % 3 + 1 |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1055 |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1056 if dotplace <= 0: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1057 intpart = '0' |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1058 fracpart = '.' + '0'*(-dotplace) + self._int |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1059 elif dotplace >= len(self._int): |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1060 intpart = self._int+'0'*(dotplace-len(self._int)) |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1061 fracpart = '' |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1062 else: |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1063 intpart = self._int[:dotplace] |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1064 fracpart = '.' + self._int[dotplace:] |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1065 if leftdigits == dotplace: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1066 exp = '' |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1067 else: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1068 if context is None: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1069 context = getcontext() |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1070 exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace) |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1071 |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1072 return sign + intpart + fracpart + exp |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1073 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1074 def to_eng_string(self, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1075 """Convert to engineering-type string. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1076 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1077 Engineering notation has an exponent which is a multiple of 3, so there |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1078 are up to 3 digits left of the decimal place. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1079 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1080 Same rules for when in exponential and when as a value as in __str__. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1081 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1082 return self.__str__(eng=True, context=context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1083 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1084 def __neg__(self, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1085 """Returns a copy with the sign switched. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1086 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1087 Rounds, if it has reason. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1088 """ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1089 if self._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1090 ans = self._check_nans(context=context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1091 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1092 return ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1093 |
|
68395
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1094 if context is None: |
|
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1095 context = getcontext() |
|
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1096 |
|
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1097 if not self and context.rounding != ROUND_FLOOR: |
|
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1098 # -Decimal('0') is Decimal('0'), not Decimal('-0'), except |
|
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1099 # in ROUND_FLOOR rounding mode. |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
1100 ans = self.copy_abs() |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1101 else: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1102 ans = self.copy_negate() |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1103 |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1104 return ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1105 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1106 def __pos__(self, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1107 """Returns a copy, unless it is a sNaN. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1108 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1109 Rounds the number (if more then precision digits) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1110 """ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1111 if self._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1112 ans = self._check_nans(context=context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1113 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1114 return ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1115 |
|
68395
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1116 if context is None: |
|
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1117 context = getcontext() |
|
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1118 |
|
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1119 if not self and context.rounding != ROUND_FLOOR: |
|
1c4be28cda5b
Issue 11131: Fix sign of zero result on decimal.Decimal plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents:
62870
diff
changeset
|
1120 # + (-0) = 0, except in ROUND_FLOOR rounding mode. |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
1121 ans = self.copy_abs() |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1122 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1123 ans = Decimal(self) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1124 |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1125 return ans._fix(context) |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1126 |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1127 def __abs__(self, round=True, context=None): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1128 """Returns the absolute value of self. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1129 |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1130 If the keyword argument 'round' is false, do not round. The |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1131 expression self.__abs__(round=False) is equivalent to |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1132 self.copy_abs(). |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1133 """ |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1134 if not round: |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1135 return self.copy_abs() |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1136 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1137 if self._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1138 ans = self._check_nans(context=context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1139 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1140 return ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1141 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1142 if self._sign: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1143 ans = self.__neg__(context=context) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1144 else: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1145 ans = self.__pos__(context=context) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1146 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1147 return ans |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1148 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1149 def __add__(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1150 """Returns self + other. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1151 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1152 -INF + INF (or the reverse) cause InvalidOperation errors. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1153 """ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1154 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1155 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1156 return other |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1157 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1158 if context is None: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1159 context = getcontext() |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1160 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1161 if self._is_special or other._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1162 ans = self._check_nans(other, context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1163 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1164 return ans |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1165 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1166 if self._isinfinity(): |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1167 # If both INF, same sign => same as both, opposite => error. |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1168 if self._sign != other._sign and other._isinfinity(): |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1169 return context._raise_error(InvalidOperation, '-INF + INF') |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1170 return Decimal(self) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1171 if other._isinfinity(): |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1172 return Decimal(other) # Can't both be infinity here |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1173 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1174 exp = min(self._exp, other._exp) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1175 negativezero = 0 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1176 if context.rounding == ROUND_FLOOR and self._sign != other._sign: |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1177 # If the answer is 0, the sign should be negative, in this case. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1178 negativezero = 1 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1179 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1180 if not self and not other: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1181 sign = min(self._sign, other._sign) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1182 if negativezero: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1183 sign = 1 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1184 ans = _dec_from_triple(sign, '0', exp) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1185 ans = ans._fix(context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1186 return ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1187 if not self: |
|
33845
032f342efcd2
Very few little improvements.
Facundo Batista <facundobatista@gmail.com>
parents:
33803
diff
changeset
|
1188 exp = max(exp, other._exp - context.prec-1) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1189 ans = other._rescale(exp, context.rounding) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1190 ans = ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1191 return ans |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1192 if not other: |
|
33845
032f342efcd2
Very few little improvements.
Facundo Batista <facundobatista@gmail.com>
parents:
33803
diff
changeset
|
1193 exp = max(exp, self._exp - context.prec-1) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1194 ans = self._rescale(exp, context.rounding) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1195 ans = ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1196 return ans |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1197 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1198 op1 = _WorkRep(self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1199 op2 = _WorkRep(other) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1200 op1, op2 = _normalize(op1, op2, context.prec) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1201 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1202 result = _WorkRep() |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1203 if op1.sign != op2.sign: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1204 # Equal and opposite |
| 33851 | 1205 if op1.int == op2.int: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1206 ans = _dec_from_triple(negativezero, '0', exp) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1207 ans = ans._fix(context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1208 return ans |
| 33851 | 1209 if op1.int < op2.int: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1210 op1, op2 = op2, op1 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1211 # OK, now abs(op1) > abs(op2) |
| 33851 | 1212 if op1.sign == 1: |
| 1213 result.sign = 1 | |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1214 op1.sign, op2.sign = op2.sign, op1.sign |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1215 else: |
| 33851 | 1216 result.sign = 0 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1217 # So we know the sign, and op1 > 0. |
| 33851 | 1218 elif op1.sign == 1: |
| 1219 result.sign = 1 | |
| 1220 op1.sign, op2.sign = (0, 0) | |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1221 else: |
| 33851 | 1222 result.sign = 0 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1223 # Now, op1 > abs(op2) > 0 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1224 |
| 33851 | 1225 if op2.sign == 0: |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1226 result.int = op1.int + op2.int |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1227 else: |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1228 result.int = op1.int - op2.int |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1229 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1230 result.exp = op1.exp |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1231 ans = Decimal(result) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1232 ans = ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1233 return ans |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1234 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1235 __radd__ = __add__ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1236 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1237 def __sub__(self, other, context=None): |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1238 """Return self - other""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1239 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1240 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1241 return other |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1242 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1243 if self._is_special or other._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1244 ans = self._check_nans(other, context=context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1245 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1246 return ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1247 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1248 # self - other is computed as self + other.copy_negate() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1249 return self.__add__(other.copy_negate(), context=context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1250 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1251 def __rsub__(self, other, context=None): |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1252 """Return other - self""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1253 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1254 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1255 return other |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1256 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1257 return other.__sub__(self, context=context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1258 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1259 def __mul__(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1260 """Return self * other. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1261 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1262 (+-) INF * 0 (or its reverse) raise InvalidOperation. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1263 """ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1264 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1265 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1266 return other |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1267 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1268 if context is None: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1269 context = getcontext() |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1270 |
|
32561
6f351b1bcf53
* Update the test suite to reflect that ConversionSyntax was no longer
Raymond Hettinger <python@rcn.com>
parents:
32560
diff
changeset
|
1271 resultsign = self._sign ^ other._sign |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1272 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1273 if self._is_special or other._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1274 ans = self._check_nans(other, context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1275 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1276 return ans |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1277 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1278 if self._isinfinity(): |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1279 if not other: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1280 return context._raise_error(InvalidOperation, '(+-)INF * 0') |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
1281 return _SignedInfinity[resultsign] |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1282 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1283 if other._isinfinity(): |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1284 if not self: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1285 return context._raise_error(InvalidOperation, '0 * (+-)INF') |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
1286 return _SignedInfinity[resultsign] |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1287 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1288 resultexp = self._exp + other._exp |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1289 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1290 # Special case for multiplying by zero |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1291 if not self or not other: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1292 ans = _dec_from_triple(resultsign, '0', resultexp) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1293 # Fixing in case the exponent is out of bounds |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1294 ans = ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1295 return ans |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1296 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1297 # Special case for multiplying by power of 10 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1298 if self._int == '1': |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1299 ans = _dec_from_triple(resultsign, other._int, resultexp) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1300 ans = ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1301 return ans |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1302 if other._int == '1': |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1303 ans = _dec_from_triple(resultsign, self._int, resultexp) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1304 ans = ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1305 return ans |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1306 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1307 op1 = _WorkRep(self) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1308 op2 = _WorkRep(other) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1309 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1310 ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1311 ans = ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1312 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1313 return ans |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1314 __rmul__ = __mul__ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1315 |
|
37191
4bfe8afe8f65
Get rid of remnants of integer division
Neal Norwitz <nnorwitz@gmail.com>
parents:
36926
diff
changeset
|
1316 def __truediv__(self, other, context=None): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1317 """Return self / other.""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1318 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1319 if other is NotImplemented: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1320 return NotImplemented |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1321 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1322 if context is None: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1323 context = getcontext() |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1324 |
|
32561
6f351b1bcf53
* Update the test suite to reflect that ConversionSyntax was no longer
Raymond Hettinger <python@rcn.com>
parents:
32560
diff
changeset
|
1325 sign = self._sign ^ other._sign |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1326 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1327 if self._is_special or other._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1328 ans = self._check_nans(other, context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1329 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1330 return ans |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1331 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1332 if self._isinfinity() and other._isinfinity(): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1333 return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF') |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1334 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1335 if self._isinfinity(): |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
1336 return _SignedInfinity[sign] |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1337 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1338 if other._isinfinity(): |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1339 context._raise_error(Clamped, 'Division by infinity') |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1340 return _dec_from_triple(sign, '0', context.Etiny()) |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1341 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1342 # Special cases for zeroes |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1343 if not other: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1344 if not self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1345 return context._raise_error(DivisionUndefined, '0 / 0') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1346 return context._raise_error(DivisionByZero, 'x / 0', sign) |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1347 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1348 if not self: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1349 exp = self._exp - other._exp |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1350 coeff = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1351 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1352 # OK, so neither = 0, INF or NaN |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1353 shift = len(other._int) - len(self._int) + context.prec + 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1354 exp = self._exp - other._exp - shift |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1355 op1 = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1356 op2 = _WorkRep(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1357 if shift >= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1358 coeff, remainder = divmod(op1.int * 10**shift, op2.int) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1359 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1360 coeff, remainder = divmod(op1.int, op2.int * 10**-shift) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1361 if remainder: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1362 # result is not exact; adjust to ensure correct rounding |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1363 if coeff % 5 == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1364 coeff += 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1365 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1366 # result is exact; get as close to ideal exponent as possible |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1367 ideal_exp = self._exp - other._exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1368 while exp < ideal_exp and coeff % 10 == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1369 coeff //= 10 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1370 exp += 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1371 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1372 ans = _dec_from_triple(sign, str(coeff), exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1373 return ans._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1374 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1375 def _divide(self, other, context): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1376 """Return (self // other, self % other), to context.prec precision. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1377 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1378 Assumes that neither self nor other is a NaN, that self is not |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1379 infinite and that other is nonzero. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1380 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1381 sign = self._sign ^ other._sign |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1382 if other._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1383 ideal_exp = self._exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1384 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1385 ideal_exp = min(self._exp, other._exp) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1386 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1387 expdiff = self.adjusted() - other.adjusted() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1388 if not self or other._isinfinity() or expdiff <= -2: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1389 return (_dec_from_triple(sign, '0', 0), |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1390 self._rescale(ideal_exp, context.rounding)) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1391 if expdiff <= context.prec: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1392 op1 = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1393 op2 = _WorkRep(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1394 if op1.exp >= op2.exp: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1395 op1.int *= 10**(op1.exp - op2.exp) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1396 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1397 op2.int *= 10**(op2.exp - op1.exp) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1398 q, r = divmod(op1.int, op2.int) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1399 if q < 10**context.prec: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1400 return (_dec_from_triple(sign, str(q), 0), |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1401 _dec_from_triple(self._sign, str(r), ideal_exp)) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1402 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1403 # Here the quotient is too large to be representable |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1404 ans = context._raise_error(DivisionImpossible, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1405 'quotient too large in //, % or divmod') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1406 return ans, ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1407 |
|
37191
4bfe8afe8f65
Get rid of remnants of integer division
Neal Norwitz <nnorwitz@gmail.com>
parents:
36926
diff
changeset
|
1408 def __rtruediv__(self, other, context=None): |
|
4bfe8afe8f65
Get rid of remnants of integer division
Neal Norwitz <nnorwitz@gmail.com>
parents:
36926
diff
changeset
|
1409 """Swaps self/other and returns __truediv__.""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1410 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1411 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1412 return other |
|
37191
4bfe8afe8f65
Get rid of remnants of integer division
Neal Norwitz <nnorwitz@gmail.com>
parents:
36926
diff
changeset
|
1413 return other.__truediv__(self, context=context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1414 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1415 def __divmod__(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1416 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1417 Return (self // other, self % other) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1418 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1419 other = _convert_other(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1420 if other is NotImplemented: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1421 return other |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1422 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1423 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1424 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1425 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1426 ans = self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1427 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1428 return (ans, ans) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1429 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1430 sign = self._sign ^ other._sign |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1431 if self._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1432 if other._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1433 ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1434 return ans, ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1435 else: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
1436 return (_SignedInfinity[sign], |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1437 context._raise_error(InvalidOperation, 'INF % x')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1438 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1439 if not other: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1440 if not self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1441 ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1442 return ans, ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1443 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1444 return (context._raise_error(DivisionByZero, 'x // 0', sign), |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1445 context._raise_error(InvalidOperation, 'x % 0')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1446 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1447 quotient, remainder = self._divide(other, context) |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1448 remainder = remainder._fix(context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1449 return quotient, remainder |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1450 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1451 def __rdivmod__(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1452 """Swaps self/other and returns __divmod__.""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1453 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1454 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1455 return other |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1456 return other.__divmod__(self, context=context) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1457 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1458 def __mod__(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1459 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1460 self % other |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1461 """ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1462 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1463 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1464 return other |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1465 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1466 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1467 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1468 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1469 ans = self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1470 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1471 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1472 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1473 if self._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1474 return context._raise_error(InvalidOperation, 'INF % x') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1475 elif not other: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1476 if self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1477 return context._raise_error(InvalidOperation, 'x % 0') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1478 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1479 return context._raise_error(DivisionUndefined, '0 % 0') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1480 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1481 remainder = self._divide(other, context)[1] |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
1482 remainder = remainder._fix(context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1483 return remainder |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1484 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1485 def __rmod__(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1486 """Swaps self/other and returns __mod__.""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1487 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1488 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1489 return other |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1490 return other.__mod__(self, context=context) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1491 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1492 def remainder_near(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1493 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1494 Remainder nearest to 0- abs(remainder-near) <= other/2 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1495 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1496 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1497 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1498 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1499 other = _convert_other(other, raiseit=True) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1500 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1501 ans = self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1502 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1503 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1504 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1505 # self == +/-infinity -> InvalidOperation |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1506 if self._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1507 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1508 'remainder_near(infinity, x)') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1509 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1510 # other == 0 -> either InvalidOperation or DivisionUndefined |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1511 if not other: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1512 if self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1513 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1514 'remainder_near(x, 0)') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1515 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1516 return context._raise_error(DivisionUndefined, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1517 'remainder_near(0, 0)') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1518 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1519 # other = +/-infinity -> remainder = self |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1520 if other._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1521 ans = Decimal(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1522 return ans._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1523 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1524 # self = 0 -> remainder = self, with ideal exponent |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1525 ideal_exponent = min(self._exp, other._exp) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1526 if not self: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1527 ans = _dec_from_triple(self._sign, '0', ideal_exponent) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1528 return ans._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1529 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1530 # catch most cases of large or small quotient |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1531 expdiff = self.adjusted() - other.adjusted() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1532 if expdiff >= context.prec + 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1533 # expdiff >= prec+1 => abs(self/other) > 10**prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1534 return context._raise_error(DivisionImpossible) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1535 if expdiff <= -2: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1536 # expdiff <= -2 => abs(self/other) < 0.1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1537 ans = self._rescale(ideal_exponent, context.rounding) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1538 return ans._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1539 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1540 # adjust both arguments to have the same exponent, then divide |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1541 op1 = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1542 op2 = _WorkRep(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1543 if op1.exp >= op2.exp: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1544 op1.int *= 10**(op1.exp - op2.exp) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1545 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1546 op2.int *= 10**(op2.exp - op1.exp) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1547 q, r = divmod(op1.int, op2.int) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1548 # remainder is r*10**ideal_exponent; other is +/-op2.int * |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1549 # 10**ideal_exponent. Apply correction to ensure that |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1550 # abs(remainder) <= abs(other)/2 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1551 if 2*r + (q&1) > op2.int: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1552 r -= op2.int |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1553 q += 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1554 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1555 if q >= 10**context.prec: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1556 return context._raise_error(DivisionImpossible) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1557 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1558 # result has same sign as self unless r is negative |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1559 sign = self._sign |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1560 if r < 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1561 sign = 1-sign |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1562 r = -r |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1563 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1564 ans = _dec_from_triple(sign, str(r), ideal_exponent) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1565 return ans._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1566 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1567 def __floordiv__(self, other, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1568 """self // other""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1569 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1570 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1571 return other |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1572 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1573 if context is None: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1574 context = getcontext() |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1575 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1576 ans = self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1577 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1578 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1579 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1580 if self._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1581 if other._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1582 return context._raise_error(InvalidOperation, 'INF // INF') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1583 else: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
1584 return _SignedInfinity[self._sign ^ other._sign] |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1585 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1586 if not other: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1587 if self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1588 return context._raise_error(DivisionByZero, 'x // 0', |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1589 self._sign ^ other._sign) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1590 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1591 return context._raise_error(DivisionUndefined, '0 // 0') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1592 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1593 return self._divide(other, context)[0] |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1594 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1595 def __rfloordiv__(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1596 """Swaps self/other and returns __floordiv__.""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1597 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1598 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
1599 return other |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1600 return other.__floordiv__(self, context=context) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1601 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1602 def __float__(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1603 """Float representation.""" |
|
78749
a931e44ffbe1
Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents:
69314
diff
changeset
|
1604 if self._isnan(): |
|
a931e44ffbe1
Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents:
69314
diff
changeset
|
1605 if self.is_snan(): |
|
a931e44ffbe1
Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents:
69314
diff
changeset
|
1606 raise ValueError("Cannot convert signaling NaN to float") |
|
a931e44ffbe1
Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents:
69314
diff
changeset
|
1607 s = "-nan" if self._sign else "nan" |
|
a931e44ffbe1
Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents:
69314
diff
changeset
|
1608 else: |
|
a931e44ffbe1
Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents:
69314
diff
changeset
|
1609 s = str(self) |
|
a931e44ffbe1
Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents:
69314
diff
changeset
|
1610 return float(s) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1611 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1612 def __int__(self): |
|
34638
4a0c202ee789
Fix small grammatical error in a docstring.
Brett Cannon <bcannon@gmail.com>
parents:
34545
diff
changeset
|
1613 """Converts self to an int, truncating if necessary.""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1614 if self._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1615 if self._isnan(): |
|
55888
dd6a9bc39946
Merged revisions 74709 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55876
diff
changeset
|
1616 raise ValueError("Cannot convert NaN to integer") |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1617 elif self._isinfinity(): |
|
55888
dd6a9bc39946
Merged revisions 74709 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55876
diff
changeset
|
1618 raise OverflowError("Cannot convert infinity to integer") |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1619 s = (-1)**self._sign |
|
34023
a8ff6ed856e8
SF bug #1071588 coercing decimal to int doesn't work between -1 and 1
Raymond Hettinger <python@rcn.com>
parents:
33851
diff
changeset
|
1620 if self._exp >= 0: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1621 return s*int(self._int)*10**self._exp |
|
34023
a8ff6ed856e8
SF bug #1071588 coercing decimal to int doesn't work between -1 and 1
Raymond Hettinger <python@rcn.com>
parents:
33851
diff
changeset
|
1622 else: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1623 return s*int(self._int[:self._exp] or '0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1624 |
|
44943
6547be11f443
Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
1625 __trunc__ = __int__ |
|
6547be11f443
Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
1626 |
|
45307
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1627 def real(self): |
|
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1628 return self |
|
50602
5436e534da6e
Merged revisions 68317-68318 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50597
diff
changeset
|
1629 real = property(real) |
|
5436e534da6e
Merged revisions 68317-68318 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50597
diff
changeset
|
1630 |
|
45307
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1631 def imag(self): |
|
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1632 return Decimal(0) |
|
50602
5436e534da6e
Merged revisions 68317-68318 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50597
diff
changeset
|
1633 imag = property(imag) |
|
45307
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1634 |
|
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1635 def conjugate(self): |
|
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1636 return self |
|
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1637 |
|
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1638 def __complex__(self): |
|
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1639 return complex(float(self)) |
|
f1205121e848
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,60735-60751 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45278
diff
changeset
|
1640 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1641 def _fix_nan(self, context): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1642 """Decapitate the payload of a NaN to fit the context""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1643 payload = self._int |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1644 |
|
61864
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
1645 # maximum length of payload is precision if clamp=0, |
|
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
1646 # precision-1 if clamp=1. |
|
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
1647 max_payload_len = context.prec - context.clamp |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1648 if len(payload) > max_payload_len: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1649 payload = payload[len(payload)-max_payload_len:].lstrip('0') |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1650 return _dec_from_triple(self._sign, payload, self._exp, True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1651 return Decimal(self) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1652 |
| 33695 | 1653 def _fix(self, context): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1654 """Round if it is necessary to keep self within prec precision. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1655 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1656 Rounds and fixes the exponent. Does not raise on a sNaN. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1657 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1658 Arguments: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1659 self - Decimal instance |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1660 context - context used. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1661 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1662 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1663 if self._is_special: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1664 if self._isnan(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1665 # decapitate payload if necessary |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1666 return self._fix_nan(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1667 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1668 # self is +/-Infinity; return unaltered |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1669 return Decimal(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1670 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1671 # if self is zero then exponent should be between Etiny and |
|
61864
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
1672 # Emax if clamp==0, and between Etiny and Etop if clamp==1. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1673 Etiny = context.Etiny() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1674 Etop = context.Etop() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1675 if not self: |
|
61864
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
1676 exp_max = [context.Emax, Etop][context.clamp] |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1677 new_exp = min(max(self._exp, Etiny), exp_max) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1678 if new_exp != self._exp: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1679 context._raise_error(Clamped) |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1680 return _dec_from_triple(self._sign, '0', new_exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1681 else: |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1682 return Decimal(self) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
1683 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1684 # exp_min is the smallest allowable exponent of the result, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1685 # equal to max(self.adjusted()-context.prec+1, Etiny) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1686 exp_min = len(self._int) + self._exp - context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1687 if exp_min > Etop: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1688 # overflow: exp_min > Etop iff self.adjusted() > Emax |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1689 ans = context._raise_error(Overflow, 'above Emax', self._sign) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1690 context._raise_error(Inexact) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1691 context._raise_error(Rounded) |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1692 return ans |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1693 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1694 self_is_subnormal = exp_min < Etiny |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1695 if self_is_subnormal: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1696 exp_min = Etiny |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1697 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1698 # round if self has too many digits |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1699 if self._exp < exp_min: |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1700 digits = len(self._int) + self._exp - exp_min |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1701 if digits < 0: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1702 self = _dec_from_triple(self._sign, '1', exp_min-1) |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1703 digits = 0 |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1704 rounding_method = self._pick_rounding_function[context.rounding] |
|
69314
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1705 changed = rounding_method(self, digits) |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1706 coeff = self._int[:digits] or '0' |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1707 if changed > 0: |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1708 coeff = str(int(coeff)+1) |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1709 if len(coeff) > context.prec: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1710 coeff = coeff[:-1] |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1711 exp_min += 1 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1712 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1713 # check whether the rounding pushed the exponent out of range |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1714 if exp_min > Etop: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1715 ans = context._raise_error(Overflow, 'above Emax', self._sign) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1716 else: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1717 ans = _dec_from_triple(self._sign, coeff, exp_min) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1718 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1719 # raise the appropriate signals, taking care to respect |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1720 # the precedence described in the specification |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1721 if changed and self_is_subnormal: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1722 context._raise_error(Underflow) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1723 if self_is_subnormal: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1724 context._raise_error(Subnormal) |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1725 if changed: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1726 context._raise_error(Inexact) |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1727 context._raise_error(Rounded) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1728 if not ans: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1729 # raise Clamped on underflow to 0 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1730 context._raise_error(Clamped) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1731 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1732 |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1733 if self_is_subnormal: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1734 context._raise_error(Subnormal) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
1735 |
|
61864
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
1736 # fold down if clamp == 1 and self has too few digits |
|
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
1737 if context.clamp == 1 and self._exp > Etop: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1738 context._raise_error(Clamped) |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1739 self_padded = self._int + '0'*(self._exp - Etop) |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1740 return _dec_from_triple(self._sign, self_padded, Etop) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1741 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1742 # here self was representable to begin with; return unchanged |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1743 return Decimal(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1744 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1745 # for each of the rounding functions below: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1746 # self is a finite, nonzero Decimal |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1747 # prec is an integer satisfying 0 <= prec < len(self._int) |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1748 # |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1749 # each function returns either -1, 0, or 1, as follows: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1750 # 1 indicates that self should be rounded up (away from zero) |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1751 # 0 indicates that self should be truncated, and that all the |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1752 # digits to be truncated are zeros (so the value is unchanged) |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1753 # -1 indicates that there are nonzero digits to be truncated |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1754 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1755 def _round_down(self, prec): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1756 """Also known as round-towards-0, truncate.""" |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1757 if _all_zeros(self._int, prec): |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1758 return 0 |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1759 else: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1760 return -1 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1761 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1762 def _round_up(self, prec): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1763 """Rounds away from 0.""" |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1764 return -self._round_down(prec) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1765 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1766 def _round_half_up(self, prec): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1767 """Rounds 5 up (away from 0)""" |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
1768 if self._int[prec] in '56789': |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1769 return 1 |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1770 elif _all_zeros(self._int, prec): |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1771 return 0 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1772 else: |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1773 return -1 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1774 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1775 def _round_half_down(self, prec): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1776 """Round 5 down""" |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1777 if _exact_half(self._int, prec): |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1778 return -1 |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1779 else: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1780 return self._round_half_up(prec) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1781 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1782 def _round_half_even(self, prec): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1783 """Round 5 to even, rest to nearest.""" |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1784 if _exact_half(self._int, prec) and \ |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1785 (prec == 0 or self._int[prec-1] in '02468'): |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1786 return -1 |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1787 else: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1788 return self._round_half_up(prec) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1789 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1790 def _round_ceiling(self, prec): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1791 """Rounds up (not away from 0 if negative.)""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1792 if self._sign: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1793 return self._round_down(prec) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1794 else: |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1795 return -self._round_down(prec) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1796 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1797 def _round_floor(self, prec): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1798 """Rounds down (not towards 0 if negative)""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1799 if not self._sign: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1800 return self._round_down(prec) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1801 else: |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1802 return -self._round_down(prec) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1803 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1804 def _round_05up(self, prec): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1805 """Round down unless digit prec-1 is 0 or 5.""" |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1806 if prec and self._int[prec-1] not in '05': |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1807 return self._round_down(prec) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1808 else: |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
1809 return -self._round_down(prec) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1810 |
|
69314
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1811 _pick_rounding_function = dict( |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1812 ROUND_DOWN = _round_down, |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1813 ROUND_UP = _round_up, |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1814 ROUND_HALF_UP = _round_half_up, |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1815 ROUND_HALF_DOWN = _round_half_down, |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1816 ROUND_HALF_EVEN = _round_half_even, |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1817 ROUND_CEILING = _round_ceiling, |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1818 ROUND_FLOOR = _round_floor, |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1819 ROUND_05UP = _round_05up, |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1820 ) |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
1821 |
|
46789
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1822 def __round__(self, n=None): |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1823 """Round self to the nearest integer, or to a given precision. |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1824 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1825 If only one argument is supplied, round a finite Decimal |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1826 instance self to the nearest integer. If self is infinite or |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1827 a NaN then a Python exception is raised. If self is finite |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1828 and lies exactly halfway between two integers then it is |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1829 rounded to the integer with even last digit. |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1830 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1831 >>> round(Decimal('123.456')) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1832 123 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1833 >>> round(Decimal('-456.789')) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1834 -457 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1835 >>> round(Decimal('-3.0')) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1836 -3 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1837 >>> round(Decimal('2.5')) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1838 2 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1839 >>> round(Decimal('3.5')) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1840 4 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1841 >>> round(Decimal('Inf')) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1842 Traceback (most recent call last): |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1843 ... |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1844 OverflowError: cannot round an infinity |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1845 >>> round(Decimal('NaN')) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1846 Traceback (most recent call last): |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1847 ... |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1848 ValueError: cannot round a NaN |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1849 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1850 If a second argument n is supplied, self is rounded to n |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1851 decimal places using the rounding mode for the current |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1852 context. |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1853 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1854 For an integer n, round(self, -n) is exactly equivalent to |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1855 self.quantize(Decimal('1En')). |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1856 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1857 >>> round(Decimal('123.456'), 0) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1858 Decimal('123') |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1859 >>> round(Decimal('123.456'), 2) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1860 Decimal('123.46') |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1861 >>> round(Decimal('123.456'), -2) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1862 Decimal('1E+2') |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1863 >>> round(Decimal('-Infinity'), 37) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1864 Decimal('NaN') |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1865 >>> round(Decimal('sNaN123'), 0) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1866 Decimal('NaN123') |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1867 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1868 """ |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1869 if n is not None: |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1870 # two-argument form: use the equivalent quantize call |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1871 if not isinstance(n, int): |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1872 raise TypeError('Second argument to round should be integral') |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1873 exp = _dec_from_triple(0, '1', -n) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1874 return self.quantize(exp) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1875 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1876 # one-argument form |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1877 if self._is_special: |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1878 if self.is_nan(): |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1879 raise ValueError("cannot round a NaN") |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1880 else: |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1881 raise OverflowError("cannot round an infinity") |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1882 return int(self._rescale(0, ROUND_HALF_EVEN)) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1883 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1884 def __floor__(self): |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1885 """Return the floor of self, as an integer. |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1886 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1887 For a finite Decimal instance self, return the greatest |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1888 integer n such that n <= self. If self is infinite or a NaN |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1889 then a Python exception is raised. |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1890 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1891 """ |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1892 if self._is_special: |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1893 if self.is_nan(): |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1894 raise ValueError("cannot round a NaN") |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1895 else: |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1896 raise OverflowError("cannot round an infinity") |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1897 return int(self._rescale(0, ROUND_FLOOR)) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1898 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1899 def __ceil__(self): |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1900 """Return the ceiling of self, as an integer. |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1901 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1902 For a finite Decimal instance self, return the least integer n |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1903 such that n >= self. If self is infinite or a NaN then a |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1904 Python exception is raised. |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1905 |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1906 """ |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1907 if self._is_special: |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1908 if self.is_nan(): |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1909 raise ValueError("cannot round a NaN") |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1910 else: |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1911 raise OverflowError("cannot round an infinity") |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1912 return int(self._rescale(0, ROUND_CEILING)) |
|
3955c502cfa3
Issue 2748: fix __ceil__, __floor__ and __round__ magic methods in
Mark Dickinson <dickinsm@gmail.com>
parents:
46664
diff
changeset
|
1913 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1914 def fma(self, other, third, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1915 """Fused multiply-add. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1916 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1917 Returns self*other+third with no rounding of the intermediate |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1918 product self*other. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1919 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1920 self and other are multiplied together, with no rounding of |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1921 the result. The third operand is then added to the result, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1922 and a single final rounding is performed. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1923 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1924 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1925 other = _convert_other(other, raiseit=True) |
|
70271
825b4278a055
Issue #12079: Decimal(0).fma(Decimal('inf'), 'not a number') should give a TypeError, not a Decimal.InvalidOperation
Mark Dickinson <mdickinson@enthought.com>
parents:
69314
diff
changeset
|
1926 third = _convert_other(third, raiseit=True) |
|
44155
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1927 |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1928 # compute product; raise InvalidOperation if either operand is |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1929 # a signaling NaN or if the product is zero times infinity. |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1930 if self._is_special or other._is_special: |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1931 if context is None: |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1932 context = getcontext() |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1933 if self._exp == 'N': |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
1934 return context._raise_error(InvalidOperation, 'sNaN', self) |
|
44155
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1935 if other._exp == 'N': |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
1936 return context._raise_error(InvalidOperation, 'sNaN', other) |
|
44155
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1937 if self._exp == 'n': |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1938 product = self |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1939 elif other._exp == 'n': |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1940 product = other |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1941 elif self._exp == 'F': |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1942 if not other: |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1943 return context._raise_error(InvalidOperation, |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1944 'INF * 0 in fma') |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
1945 product = _SignedInfinity[self._sign ^ other._sign] |
|
44155
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1946 elif other._exp == 'F': |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1947 if not self: |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1948 return context._raise_error(InvalidOperation, |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1949 '0 * INF in fma') |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
1950 product = _SignedInfinity[self._sign ^ other._sign] |
|
44155
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1951 else: |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1952 product = _dec_from_triple(self._sign ^ other._sign, |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1953 str(int(self._int) * int(other._int)), |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1954 self._exp + other._exp) |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1955 |
|
1a2a6df0fbe0
Merged revisions 59323-59332 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44129
diff
changeset
|
1956 return product.__add__(third, context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1957 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1958 def _power_modulo(self, other, modulo, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1959 """Three argument version of __pow__""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1960 |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
1961 other = _convert_other(other) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
1962 if other is NotImplemented: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
1963 return other |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
1964 modulo = _convert_other(modulo) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
1965 if modulo is NotImplemented: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
1966 return modulo |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1967 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1968 if context is None: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1969 context = getcontext() |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
1970 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1971 # deal with NaNs: if there are any sNaNs then first one wins, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1972 # (i.e. behaviour for NaNs is identical to that of fma) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1973 self_is_nan = self._isnan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1974 other_is_nan = other._isnan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1975 modulo_is_nan = modulo._isnan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1976 if self_is_nan or other_is_nan or modulo_is_nan: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1977 if self_is_nan == 2: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1978 return context._raise_error(InvalidOperation, 'sNaN', |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
1979 self) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1980 if other_is_nan == 2: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1981 return context._raise_error(InvalidOperation, 'sNaN', |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
1982 other) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1983 if modulo_is_nan == 2: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1984 return context._raise_error(InvalidOperation, 'sNaN', |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
1985 modulo) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1986 if self_is_nan: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1987 return self._fix_nan(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1988 if other_is_nan: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1989 return other._fix_nan(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1990 return modulo._fix_nan(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1991 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1992 # check inputs: we apply same restrictions as Python's pow() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1993 if not (self._isinteger() and |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1994 other._isinteger() and |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1995 modulo._isinteger()): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1996 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1997 'pow() 3rd argument not allowed ' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1998 'unless all arguments are integers') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
1999 if other < 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2000 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2001 'pow() 2nd argument cannot be ' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2002 'negative when 3rd argument specified') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2003 if not modulo: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2004 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2005 'pow() 3rd argument cannot be 0') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2006 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2007 # additional restriction for decimal: the modulus must be less |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2008 # than 10**prec in absolute value |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2009 if modulo.adjusted() >= context.prec: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2010 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2011 'insufficient precision: pow() 3rd ' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2012 'argument must not have more than ' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2013 'precision digits') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2014 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2015 # define 0**0 == NaN, for consistency with two-argument pow |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2016 # (even though it hurts!) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2017 if not other and not self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2018 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2019 'at least one of pow() 1st argument ' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2020 'and 2nd argument must be nonzero ;' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2021 '0**0 is not defined') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2022 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2023 # compute sign of result |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2024 if other._iseven(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2025 sign = 0 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2026 else: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2027 sign = self._sign |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2028 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2029 # convert modulo to a Python integer, and self and other to |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2030 # Decimal integers (i.e. force their exponents to be >= 0) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2031 modulo = abs(int(modulo)) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2032 base = _WorkRep(self.to_integral_value()) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2033 exponent = _WorkRep(other.to_integral_value()) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2034 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2035 # compute result using integer pow() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2036 base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2037 for i in range(exponent.exp): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2038 base = pow(base, 10, modulo) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2039 base = pow(base, exponent.int, modulo) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2040 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2041 return _dec_from_triple(sign, str(base), 0) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2042 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2043 def _power_exact(self, other, p): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2044 """Attempt to compute self**other exactly. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2045 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2046 Given Decimals self and other and an integer p, attempt to |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2047 compute an exact result for the power self**other, with p |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2048 digits of precision. Return None if self**other is not |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2049 exactly representable in p digits. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2050 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2051 Assumes that elimination of special cases has already been |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2052 performed: self and other must both be nonspecial; self must |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2053 be positive and not numerically equal to 1; other must be |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2054 nonzero. For efficiency, other._exp should not be too large, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2055 so that 10**abs(other._exp) is a feasible calculation.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2056 |
|
70636
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2057 # In the comments below, we write x for the value of self and y for the |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2058 # value of other. Write x = xc*10**xe and abs(y) = yc*10**ye, with xc |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2059 # and yc positive integers not divisible by 10. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2060 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2061 # The main purpose of this method is to identify the *failure* |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2062 # of x**y to be exactly representable with as little effort as |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2063 # possible. So we look for cheap and easy tests that |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2064 # eliminate the possibility of x**y being exact. Only if all |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2065 # these tests are passed do we go on to actually compute x**y. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2066 |
|
70636
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2067 # Here's the main idea. Express y as a rational number m/n, with m and |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2068 # n relatively prime and n>0. Then for x**y to be exactly |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2069 # representable (at *any* precision), xc must be the nth power of a |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2070 # positive integer and xe must be divisible by n. If y is negative |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2071 # then additionally xc must be a power of either 2 or 5, hence a power |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2072 # of 2**n or 5**n. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2073 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2074 # There's a limit to how small |y| can be: if y=m/n as above |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2075 # then: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2076 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2077 # (1) if xc != 1 then for the result to be representable we |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2078 # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2079 # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <= |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2080 # 2**(1/|y|), hence xc**|y| < 2 and the result is not |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2081 # representable. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2082 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2083 # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2084 # |y| < 1/|xe| then the result is not representable. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2085 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2086 # Note that since x is not equal to 1, at least one of (1) and |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2087 # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) < |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2088 # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2089 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2090 # There's also a limit to how large y can be, at least if it's |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2091 # positive: the normalized result will have coefficient xc**y, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2092 # so if it's representable then xc**y < 10**p, and y < |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2093 # p/log10(xc). Hence if y*log10(xc) >= p then the result is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2094 # not exactly representable. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2095 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2096 # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2097 # so |y| < 1/xe and the result is not representable. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2098 # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y| |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2099 # < 1/nbits(xc). |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2100 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2101 x = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2102 xc, xe = x.int, x.exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2103 while xc % 10 == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2104 xc //= 10 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2105 xe += 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2106 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2107 y = _WorkRep(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2108 yc, ye = y.int, y.exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2109 while yc % 10 == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2110 yc //= 10 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2111 ye += 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2112 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2113 # case where xc == 1: result is 10**(xe*y), with xe*y |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2114 # required to be an integer |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2115 if xc == 1: |
|
62866
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2116 xe *= yc |
|
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2117 # result is now 10**(xe * 10**ye); xe * 10**ye must be integral |
|
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2118 while xe % 10 == 0: |
|
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2119 xe //= 10 |
|
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2120 ye += 1 |
|
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2121 if ye < 0: |
|
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2122 return None |
|
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2123 exponent = xe * 10**ye |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2124 if y.sign == 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2125 exponent = -exponent |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2126 # if other is a nonnegative integer, use ideal exponent |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2127 if other._isinteger() and other._sign == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2128 ideal_exponent = self._exp*int(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2129 zeros = min(exponent-ideal_exponent, p-1) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2130 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2131 zeros = 0 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2132 return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2133 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2134 # case where y is negative: xc must be either a power |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2135 # of 2 or a power of 5. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2136 if y.sign == 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2137 last_digit = xc % 10 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2138 if last_digit in (2,4,6,8): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2139 # quick test for power of 2 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2140 if xc & -xc != xc: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2141 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2142 # now xc is a power of 2; e is its exponent |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2143 e = _nbits(xc)-1 |
|
70636
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2144 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2145 # We now have: |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2146 # |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2147 # x = 2**e * 10**xe, e > 0, and y < 0. |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2148 # |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2149 # The exact result is: |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2150 # |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2151 # x**y = 5**(-e*y) * 10**(e*y + xe*y) |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2152 # |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2153 # provided that both e*y and xe*y are integers. Note that if |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2154 # 5**(-e*y) >= 10**p, then the result can't be expressed |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2155 # exactly with p digits of precision. |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2156 # |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2157 # Using the above, we can guard against large values of ye. |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2158 # 93/65 is an upper bound for log(10)/log(5), so if |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2159 # |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2160 # ye >= len(str(93*p//65)) |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2161 # |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2162 # then |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2163 # |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2164 # -e*y >= -y >= 10**ye > 93*p/65 > p*log(10)/log(5), |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2165 # |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2166 # so 5**(-e*y) >= 10**p, and the coefficient of the result |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2167 # can't be expressed in p digits. |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2168 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2169 # emax >= largest e such that 5**e < 10**p. |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2170 emax = p*93//65 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2171 if ye >= len(str(emax)): |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2172 return None |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2173 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2174 # Find -e*y and -xe*y; both must be integers |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2175 e = _decimal_lshift_exact(e * yc, ye) |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2176 xe = _decimal_lshift_exact(xe * yc, ye) |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2177 if e is None or xe is None: |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2178 return None |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2179 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2180 if e > emax: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2181 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2182 xc = 5**e |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2183 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2184 elif last_digit == 5: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2185 # e >= log_5(xc) if xc is a power of 5; we have |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2186 # equality all the way up to xc=5**2658 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2187 e = _nbits(xc)*28//65 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2188 xc, remainder = divmod(5**e, xc) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2189 if remainder: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2190 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2191 while xc % 5 == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2192 xc //= 5 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2193 e -= 1 |
|
70636
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2194 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2195 # Guard against large values of ye, using the same logic as in |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2196 # the 'xc is a power of 2' branch. 10/3 is an upper bound for |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2197 # log(10)/log(2). |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2198 emax = p*10//3 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2199 if ye >= len(str(emax)): |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2200 return None |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2201 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2202 e = _decimal_lshift_exact(e * yc, ye) |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2203 xe = _decimal_lshift_exact(xe * yc, ye) |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2204 if e is None or xe is None: |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2205 return None |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2206 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
2207 if e > emax: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2208 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2209 xc = 2**e |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2210 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2211 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2212 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2213 if xc >= 10**p: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2214 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2215 xe = -e-xe |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2216 return _dec_from_triple(0, str(xc), xe) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2217 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2218 # now y is positive; find m and n such that y = m/n |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2219 if ye >= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2220 m, n = yc*10**ye, 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2221 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2222 if xe != 0 and len(str(abs(yc*xe))) <= -ye: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2223 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2224 xc_bits = _nbits(xc) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2225 if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2226 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2227 m, n = yc, 10**(-ye) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2228 while m % 2 == n % 2 == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2229 m //= 2 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2230 n //= 2 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2231 while m % 5 == n % 5 == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2232 m //= 5 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2233 n //= 5 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2234 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2235 # compute nth root of xc*10**xe |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2236 if n > 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2237 # if 1 < xc < 2**n then xc isn't an nth power |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2238 if xc != 1 and xc_bits <= n: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2239 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2240 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2241 xe, rem = divmod(xe, n) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2242 if rem != 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2243 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2244 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2245 # compute nth root of xc using Newton's method |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2246 a = 1 << -(-_nbits(xc)//n) # initial estimate |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2247 while True: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2248 q, r = divmod(xc, a**(n-1)) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2249 if a <= q: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2250 break |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2251 else: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2252 a = (a*(n-1) + q)//n |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2253 if not (a == q and r == 0): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2254 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2255 xc = a |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2256 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2257 # now xc*10**xe is the nth root of the original xc*10**xe |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2258 # compute mth power of xc*10**xe |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2259 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2260 # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m > |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2261 # 10**p and the result is not representable. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2262 if xc > 1 and m > p*100//_log10_lb(xc): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2263 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2264 xc = xc**m |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2265 xe *= m |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2266 if xc > 10**p: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2267 return None |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2268 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2269 # by this point the result *is* exactly representable |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2270 # adjust the exponent to get as close as possible to the ideal |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2271 # exponent, if necessary |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2272 str_xc = str(xc) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2273 if other._isinteger() and other._sign == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2274 ideal_exponent = self._exp*int(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2275 zeros = min(xe-ideal_exponent, p-len(str_xc)) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2276 else: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2277 zeros = 0 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2278 return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2279 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2280 def __pow__(self, other, modulo=None, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2281 """Return self ** other [ % modulo]. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2282 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2283 With two arguments, compute self**other. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2284 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2285 With three arguments, compute (self**other) % modulo. For the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2286 three argument form, the following restrictions on the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2287 arguments hold: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2288 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2289 - all three arguments must be integral |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2290 - other must be nonnegative |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2291 - either self or other (or both) must be nonzero |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2292 - modulo must be nonzero and must have at most p digits, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2293 where p is the context precision. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2294 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2295 If any of these restrictions is violated the InvalidOperation |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2296 flag is raised. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2297 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2298 The result of pow(self, other, modulo) is identical to the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2299 result that would be obtained by computing (self**other) % |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2300 modulo with unbounded precision, but is computed more |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2301 efficiently. It is always exact. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2302 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2303 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2304 if modulo is not None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2305 return self._power_modulo(other, modulo, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2306 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2307 other = _convert_other(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2308 if other is NotImplemented: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2309 return other |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2310 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2311 if context is None: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2312 context = getcontext() |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2313 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2314 # either argument is a NaN => result is NaN |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2315 ans = self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2316 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2317 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2318 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2319 # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2320 if not other: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2321 if not self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2322 return context._raise_error(InvalidOperation, '0 ** 0') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2323 else: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2324 return _One |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2325 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2326 # result has sign 1 iff self._sign is 1 and other is an odd integer |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2327 result_sign = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2328 if self._sign == 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2329 if other._isinteger(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2330 if not other._iseven(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2331 result_sign = 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2332 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2333 # -ve**noninteger = NaN |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2334 # (-0)**noninteger = 0**noninteger |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2335 if self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2336 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2337 'x ** y with x negative and y not an integer') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2338 # negate self, without doing any unwanted rounding |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2339 self = self.copy_negate() |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2340 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2341 # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2342 if not self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2343 if other._sign == 0: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2344 return _dec_from_triple(result_sign, '0', 0) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2345 else: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2346 return _SignedInfinity[result_sign] |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2347 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2348 # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2349 if self._isinfinity(): |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2350 if other._sign == 0: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2351 return _SignedInfinity[result_sign] |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2352 else: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2353 return _dec_from_triple(result_sign, '0', 0) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2354 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2355 # 1**other = 1, but the choice of exponent and the flags |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2356 # depend on the exponent of self, and on whether other is a |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2357 # positive integer, a negative integer, or neither |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2358 if self == _One: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2359 if other._isinteger(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2360 # exp = max(self._exp*max(int(other), 0), |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2361 # 1-context.prec) but evaluating int(other) directly |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2362 # is dangerous until we know other is small (other |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2363 # could be 1e999999999) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2364 if other._sign == 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2365 multiplier = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2366 elif other > context.prec: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2367 multiplier = context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2368 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2369 multiplier = int(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2370 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2371 exp = self._exp * multiplier |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2372 if exp < 1-context.prec: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2373 exp = 1-context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2374 context._raise_error(Rounded) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2375 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2376 context._raise_error(Inexact) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2377 context._raise_error(Rounded) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2378 exp = 1-context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2379 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2380 return _dec_from_triple(result_sign, '1'+'0'*-exp, exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2381 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2382 # compute adjusted exponent of self |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2383 self_adj = self.adjusted() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2384 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2385 # self ** infinity is infinity if self > 1, 0 if self < 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2386 # self ** -infinity is infinity if self < 1, 0 if self > 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2387 if other._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2388 if (other._sign == 0) == (self_adj < 0): |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2389 return _dec_from_triple(result_sign, '0', 0) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2390 else: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2391 return _SignedInfinity[result_sign] |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2392 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2393 # from here on, the result always goes through the call |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2394 # to _fix at the end of this function. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2395 ans = None |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2396 exact = False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2397 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2398 # crude test to catch cases of extreme overflow/underflow. If |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2399 # log10(self)*other >= 10**bound and bound >= len(str(Emax)) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2400 # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2401 # self**other >= 10**(Emax+1), so overflow occurs. The test |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2402 # for underflow is similar. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2403 bound = self._log10_exp_bound() + other.adjusted() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2404 if (self_adj >= 0) == (other._sign == 0): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2405 # self > 1 and other +ve, or self < 1 and other -ve |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2406 # possibility of overflow |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2407 if bound >= len(str(context.Emax)): |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2408 ans = _dec_from_triple(result_sign, '1', context.Emax+1) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2409 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2410 # self > 1 and other -ve, or self < 1 and other +ve |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2411 # possibility of underflow to 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2412 Etiny = context.Etiny() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2413 if bound >= len(str(-Etiny)): |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2414 ans = _dec_from_triple(result_sign, '1', Etiny-1) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2415 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2416 # try for an exact result with precision +1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2417 if ans is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2418 ans = self._power_exact(other, context.prec + 1) |
|
62866
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2419 if ans is not None: |
|
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2420 if result_sign == 1: |
|
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2421 ans = _dec_from_triple(1, ans._int, ans._exp) |
|
b044625322e3
Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
61746
diff
changeset
|
2422 exact = True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2423 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2424 # usual case: inexact result, x**y computed directly as exp(y*log(x)) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2425 if ans is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2426 p = context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2427 x = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2428 xc, xe = x.int, x.exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2429 y = _WorkRep(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2430 yc, ye = y.int, y.exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2431 if y.sign == 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2432 yc = -yc |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2433 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2434 # compute correctly rounded result: start with precision +3, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2435 # then increase precision until result is unambiguously roundable |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2436 extra = 3 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2437 while True: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2438 coeff, exp = _dpower(xc, xe, yc, ye, p+extra) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2439 if coeff % (5*10**(len(str(coeff))-p-1)): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2440 break |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2441 extra += 3 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2442 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2443 ans = _dec_from_triple(result_sign, str(coeff), exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2444 |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2445 # unlike exp, ln and log10, the power function respects the |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2446 # rounding mode; no need to switch to ROUND_HALF_EVEN here |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2447 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2448 # There's a difficulty here when 'other' is not an integer and |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2449 # the result is exact. In this case, the specification |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2450 # requires that the Inexact flag be raised (in spite of |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2451 # exactness), but since the result is exact _fix won't do this |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2452 # for us. (Correspondingly, the Underflow signal should also |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2453 # be raised for subnormal results.) We can't directly raise |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2454 # these signals either before or after calling _fix, since |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2455 # that would violate the precedence for signals. So we wrap |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2456 # the ._fix call in a temporary context, and reraise |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2457 # afterwards. |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2458 if exact and not other._isinteger(): |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2459 # pad with zeros up to length context.prec+1 if necessary; this |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2460 # ensures that the Rounded signal will be raised. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2461 if len(ans._int) <= context.prec: |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2462 expdiff = context.prec + 1 - len(ans._int) |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2463 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff, |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2464 ans._exp-expdiff) |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2465 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2466 # create a copy of the current context, with cleared flags/traps |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2467 newcontext = context.copy() |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2468 newcontext.clear_flags() |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2469 for exception in _signals: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2470 newcontext.traps[exception] = 0 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2471 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2472 # round in the new context |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2473 ans = ans._fix(newcontext) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2474 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2475 # raise Inexact, and if necessary, Underflow |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2476 newcontext._raise_error(Inexact) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2477 if newcontext.flags[Subnormal]: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2478 newcontext._raise_error(Underflow) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2479 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2480 # propagate signals to the original context; _fix could |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2481 # have raised any of Overflow, Underflow, Subnormal, |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2482 # Inexact, Rounded, Clamped. Overflow needs the correct |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2483 # arguments. Note that the order of the exceptions is |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2484 # important here. |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2485 if newcontext.flags[Overflow]: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2486 context._raise_error(Overflow, 'above Emax', ans._sign) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2487 for exception in Underflow, Subnormal, Inexact, Rounded, Clamped: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2488 if newcontext.flags[exception]: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2489 context._raise_error(exception) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2490 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2491 else: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2492 ans = ans._fix(context) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2493 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2494 return ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2495 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2496 def __rpow__(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2497 """Swaps self/other and returns __pow__.""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2498 other = _convert_other(other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
2499 if other is NotImplemented: |
|
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
2500 return other |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2501 return other.__pow__(self, context=context) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2502 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2503 def normalize(self, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2504 """Normalize- strip trailing 0s, change anything equal to 0 to 0e0""" |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2505 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2506 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2507 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2508 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2509 if self._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2510 ans = self._check_nans(context=context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2511 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2512 return ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2513 |
| 33695 | 2514 dup = self._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2515 if dup._isinfinity(): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2516 return dup |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2517 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2518 if not dup: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2519 return _dec_from_triple(dup._sign, '0', 0) |
|
61864
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
2520 exp_max = [context.Emax, context.Etop()][context.clamp] |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2521 end = len(dup._int) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2522 exp = dup._exp |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2523 while dup._int[end-1] == '0' and exp < exp_max: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2524 exp += 1 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2525 end -= 1 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2526 return _dec_from_triple(dup._sign, dup._int[:end], exp) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2527 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2528 def quantize(self, exp, rounding=None, context=None, watchexp=True): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2529 """Quantize self so its exponent is the same as that of exp. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2530 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2531 Similar to self._rescale(exp._exp) but with error checking. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2532 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2533 exp = _convert_other(exp, raiseit=True) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2534 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2535 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2536 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2537 if rounding is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2538 rounding = context.rounding |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2539 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2540 if self._is_special or exp._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2541 ans = self._check_nans(exp, context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2542 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2543 return ans |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2544 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2545 if exp._isinfinity() or self._isinfinity(): |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2546 if exp._isinfinity() and self._isinfinity(): |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2547 return Decimal(self) # if both are inf, it is OK |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2548 return context._raise_error(InvalidOperation, |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2549 'quantize with one INF') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2550 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2551 # if we're not watching exponents, do a simple rescale |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2552 if not watchexp: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2553 ans = self._rescale(exp._exp, rounding) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2554 # raise Inexact and Rounded where appropriate |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2555 if ans._exp > self._exp: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2556 context._raise_error(Rounded) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2557 if ans != self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2558 context._raise_error(Inexact) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2559 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2560 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2561 # exp._exp should be between Etiny and Emax |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2562 if not (context.Etiny() <= exp._exp <= context.Emax): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2563 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2564 'target exponent out of bounds in quantize') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2565 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2566 if not self: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2567 ans = _dec_from_triple(self._sign, '0', exp._exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2568 return ans._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2569 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2570 self_adjusted = self.adjusted() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2571 if self_adjusted > context.Emax: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2572 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2573 'exponent of quantize result too large for current context') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2574 if self_adjusted - exp._exp + 1 > context.prec: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2575 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2576 'quantize result has too many digits for current context') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2577 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2578 ans = self._rescale(exp._exp, rounding) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2579 if ans.adjusted() > context.Emax: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2580 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2581 'exponent of quantize result too large for current context') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2582 if len(ans._int) > context.prec: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2583 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2584 'quantize result has too many digits for current context') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2585 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2586 # raise appropriate flags |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2587 if ans and ans.adjusted() < context.Emin: |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2588 context._raise_error(Subnormal) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2589 if ans._exp > self._exp: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2590 if ans != self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2591 context._raise_error(Inexact) |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2592 context._raise_error(Rounded) |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2593 |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2594 # call to fix takes care of any necessary folddown, and |
|
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2595 # signals Clamped if necessary |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2596 ans = ans._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2597 return ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2598 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2599 def same_quantum(self, other): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
2600 """Return True if self and other have the same exponent; otherwise |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
2601 return False. |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
2602 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
2603 If either operand is a special value, the following rules are used: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
2604 * return True if both operands are infinities |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
2605 * return True if both operands are NaNs |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
2606 * otherwise, return False. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2607 """ |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
2608 other = _convert_other(other, raiseit=True) |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2609 if self._is_special or other._is_special: |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
2610 return (self.is_nan() and other.is_nan() or |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
2611 self.is_infinite() and other.is_infinite()) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2612 return self._exp == other._exp |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2613 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2614 def _rescale(self, exp, rounding): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2615 """Rescale self so that the exponent is exp, either by padding with zeros |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2616 or by truncating digits, using the given rounding mode. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2617 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2618 Specials are returned without change. This operation is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2619 quiet: it raises no flags, and uses no information from the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2620 context. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2621 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2622 exp = exp to scale to (an integer) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2623 rounding = rounding mode |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2624 """ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2625 if self._is_special: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2626 return Decimal(self) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2627 if not self: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2628 return _dec_from_triple(self._sign, '0', exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2629 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2630 if self._exp >= exp: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2631 # pad answer with zeros if necessary |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2632 return _dec_from_triple(self._sign, |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2633 self._int + '0'*(self._exp - exp), exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2634 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2635 # too many digits; round and lose data. If self.adjusted() < |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2636 # exp-1, replace self by 10**(exp-1) before rounding |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2637 digits = len(self._int) + self._exp - exp |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2638 if digits < 0: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2639 self = _dec_from_triple(self._sign, '1', exp-1) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2640 digits = 0 |
|
69314
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
2641 this_function = self._pick_rounding_function[rounding] |
|
f5d5f3f4c081
Issue #11830: Remove unnecessary introspection code in the decimal module.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68489
diff
changeset
|
2642 changed = this_function(self, digits) |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
2643 coeff = self._int[:digits] or '0' |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
2644 if changed == 1: |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
2645 coeff = str(int(coeff)+1) |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
2646 return _dec_from_triple(self._sign, coeff, exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2647 |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2648 def _round(self, places, rounding): |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2649 """Round a nonzero, nonspecial Decimal to a fixed number of |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2650 significant figures, using the given rounding mode. |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2651 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2652 Infinities, NaNs and zeros are returned unaltered. |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2653 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2654 This operation is quiet: it raises no flags, and uses no |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2655 information from the context. |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2656 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2657 """ |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2658 if places <= 0: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2659 raise ValueError("argument should be at least 1 in _round") |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2660 if self._is_special or not self: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2661 return Decimal(self) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2662 ans = self._rescale(self.adjusted()+1-places, rounding) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2663 # it can happen that the rescale alters the adjusted exponent; |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2664 # for example when rounding 99.97 to 3 significant figures. |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2665 # When this happens we end up with an extra 0 at the end of |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2666 # the number; a second rescale fixes this. |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2667 if ans.adjusted() != self.adjusted(): |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2668 ans = ans._rescale(ans.adjusted()+1-places, rounding) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2669 return ans |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
2670 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2671 def to_integral_exact(self, rounding=None, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2672 """Rounds to a nearby integer. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2673 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2674 If no rounding mode is specified, take the rounding mode from |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2675 the context. This method raises the Rounded and Inexact flags |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2676 when appropriate. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2677 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2678 See also: to_integral_value, which does exactly the same as |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2679 this method except that it doesn't raise Inexact or Rounded. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2680 """ |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2681 if self._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2682 ans = self._check_nans(context=context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2683 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2684 return ans |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2685 return Decimal(self) |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2686 if self._exp >= 0: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2687 return Decimal(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2688 if not self: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2689 return _dec_from_triple(self._sign, '0', 0) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2690 if context is None: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2691 context = getcontext() |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2692 if rounding is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2693 rounding = context.rounding |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2694 ans = self._rescale(0, rounding) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2695 if ans != self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2696 context._raise_error(Inexact) |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
2697 context._raise_error(Rounded) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2698 return ans |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2699 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2700 def to_integral_value(self, rounding=None, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2701 """Rounds to the nearest integer, without raising inexact, rounded.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2702 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2703 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2704 if rounding is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2705 rounding = context.rounding |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2706 if self._is_special: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2707 ans = self._check_nans(context=context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2708 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2709 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2710 return Decimal(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2711 if self._exp >= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2712 return Decimal(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2713 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2714 return self._rescale(0, rounding) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2715 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2716 # the method name changed, but we provide also the old one, for compatibility |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2717 to_integral = to_integral_value |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2718 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2719 def sqrt(self, context=None): |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2720 """Return the square root of self.""" |
|
46111
2bcbd3882eee
Merged revisions 61892,61900 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45774
diff
changeset
|
2721 if context is None: |
|
2bcbd3882eee
Merged revisions 61892,61900 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45774
diff
changeset
|
2722 context = getcontext() |
|
2bcbd3882eee
Merged revisions 61892,61900 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45774
diff
changeset
|
2723 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2724 if self._is_special: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2725 ans = self._check_nans(context=context) |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2726 if ans: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2727 return ans |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2728 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2729 if self._isinfinity() and self._sign == 0: |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2730 return Decimal(self) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2731 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2732 if not self: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2733 # exponent = self._exp // 2. sqrt(-0) = -0 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2734 ans = _dec_from_triple(self._sign, '0', self._exp // 2) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2735 return ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2736 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2737 if self._sign == 1: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2738 return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0') |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2739 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2740 # At this point self represents a positive number. Let p be |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2741 # the desired precision and express self in the form c*100**e |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2742 # with c a positive real number and e an integer, c and e |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2743 # being chosen so that 100**(p-1) <= c < 100**p. Then the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2744 # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2745 # <= sqrt(c) < 10**p, so the closest representable Decimal at |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2746 # precision p is n*10**e where n = round_half_even(sqrt(c)), |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2747 # the closest integer to sqrt(c) with the even integer chosen |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2748 # in the case of a tie. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2749 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2750 # To ensure correct rounding in all cases, we use the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2751 # following trick: we compute the square root to an extra |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2752 # place (precision p+1 instead of precision p), rounding down. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2753 # Then, if the result is inexact and its last digit is 0 or 5, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2754 # we increase the last digit to 1 or 6 respectively; if it's |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2755 # exact we leave the last digit alone. Now the final round to |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2756 # p places (or fewer in the case of underflow) will round |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2757 # correctly and raise the appropriate flags. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2758 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2759 # use an extra digit of precision |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2760 prec = context.prec+1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2761 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2762 # write argument in the form c*100**e where e = self._exp//2 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2763 # is the 'ideal' exponent, to be used if the square root is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2764 # exactly representable. l is the number of 'digits' of c in |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2765 # base 100, so that 100**(l-1) <= c < 100**l. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2766 op = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2767 e = op.exp >> 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2768 if op.exp & 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2769 c = op.int * 10 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2770 l = (len(self._int) >> 1) + 1 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2771 else: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2772 c = op.int |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2773 l = len(self._int)+1 >> 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2774 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2775 # rescale so that c has exactly prec base 100 'digits' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2776 shift = prec-l |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2777 if shift >= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2778 c *= 100**shift |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2779 exact = True |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2780 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2781 c, remainder = divmod(c, 100**-shift) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2782 exact = not remainder |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2783 e -= shift |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2784 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2785 # find n = floor(sqrt(c)) using Newton's method |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2786 n = 10**prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2787 while True: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2788 q = c//n |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2789 if n <= q: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2790 break |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2791 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2792 n = n + q >> 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2793 exact = exact and n*n == c |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2794 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2795 if exact: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2796 # result is exact; rescale to use ideal exponent e |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2797 if shift >= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2798 # assert n % 10**shift == 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2799 n //= 10**shift |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2800 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2801 n *= 10**-shift |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2802 e += shift |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2803 else: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2804 # result is not exact; fix last digit as described above |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2805 if n % 5 == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2806 n += 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2807 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2808 ans = _dec_from_triple(0, str(n), e) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2809 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2810 # round, and fit to current context |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2811 context = context._shallow_copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2812 rounding = context._set_rounding(ROUND_HALF_EVEN) |
| 33695 | 2813 ans = ans._fix(context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2814 context.rounding = rounding |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2815 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2816 return ans |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2817 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2818 def max(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2819 """Returns the larger value. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2820 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2821 Like max(self, other) except if one is not a number, returns |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2822 NaN (and signals if one is sNaN). Also rounds. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2823 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2824 other = _convert_other(other, raiseit=True) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2825 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2826 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2827 context = getcontext() |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2828 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2829 if self._is_special or other._is_special: |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2830 # If one operand is a quiet NaN and the other is number, then the |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2831 # number is always returned |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2832 sn = self._isnan() |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2833 on = other._isnan() |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2834 if sn or on: |
|
50115
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
2835 if on == 1 and sn == 0: |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
2836 return self._fix(context) |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
2837 if sn == 1 and on == 0: |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
2838 return other._fix(context) |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2839 return self._check_nans(other, context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2840 |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
2841 c = self._cmp(other) |
|
33157
b2f427db228b
Revise max() and min() to comply with the 8/2/2004 update to the specification
Raymond Hettinger <python@rcn.com>
parents:
33044
diff
changeset
|
2842 if c == 0: |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2843 # If both operands are finite and equal in numerical value |
|
33157
b2f427db228b
Revise max() and min() to comply with the 8/2/2004 update to the specification
Raymond Hettinger <python@rcn.com>
parents:
33044
diff
changeset
|
2844 # then an ordering is applied: |
|
b2f427db228b
Revise max() and min() to comply with the 8/2/2004 update to the specification
Raymond Hettinger <python@rcn.com>
parents:
33044
diff
changeset
|
2845 # |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2846 # If the signs differ then max returns the operand with the |
|
33157
b2f427db228b
Revise max() and min() to comply with the 8/2/2004 update to the specification
Raymond Hettinger <python@rcn.com>
parents:
33044
diff
changeset
|
2847 # positive sign and min returns the operand with the negative sign |
|
b2f427db228b
Revise max() and min() to comply with the 8/2/2004 update to the specification
Raymond Hettinger <python@rcn.com>
parents:
33044
diff
changeset
|
2848 # |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2849 # If the signs are the same then the exponent is used to select |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2850 # the result. This is exactly the ordering used in compare_total. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2851 c = self.compare_total(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2852 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2853 if c == -1: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2854 ans = other |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2855 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2856 ans = self |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2857 |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
2858 return ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2859 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2860 def min(self, other, context=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2861 """Returns the smaller value. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2862 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2863 Like min(self, other) except if one is not a number, returns |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2864 NaN (and signals if one is sNaN). Also rounds. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2865 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2866 other = _convert_other(other, raiseit=True) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2867 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2868 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2869 context = getcontext() |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2870 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2871 if self._is_special or other._is_special: |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2872 # If one operand is a quiet NaN and the other is number, then the |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2873 # number is always returned |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2874 sn = self._isnan() |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2875 on = other._isnan() |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2876 if sn or on: |
|
50115
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
2877 if on == 1 and sn == 0: |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
2878 return self._fix(context) |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
2879 if sn == 1 and on == 0: |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
2880 return other._fix(context) |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2881 return self._check_nans(other, context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2882 |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
2883 c = self._cmp(other) |
|
33157
b2f427db228b
Revise max() and min() to comply with the 8/2/2004 update to the specification
Raymond Hettinger <python@rcn.com>
parents:
33044
diff
changeset
|
2884 if c == 0: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2885 c = self.compare_total(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2886 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2887 if c == -1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2888 ans = self |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2889 else: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2890 ans = other |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
2891 |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
2892 return ans._fix(context) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2893 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2894 def _isinteger(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2895 """Returns whether self is an integer""" |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2896 if self._is_special: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2897 return False |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2898 if self._exp >= 0: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2899 return True |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2900 rest = self._int[self._exp:] |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2901 return rest == '0'*len(rest) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2902 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2903 def _iseven(self): |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2904 """Returns True if self is even. Assumes self is an integer.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2905 if not self or self._exp > 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2906 return True |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
2907 return self._int[-1+self._exp] in '02468' |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2908 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2909 def adjusted(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2910 """Return the adjusted exponent of self""" |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2911 try: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2912 return self._exp + len(self._int) - 1 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2913 # If NaN or Infinity, self._exp is string |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2914 except TypeError: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2915 return 0 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
2916 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2917 def canonical(self, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2918 """Returns the same Decimal object. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2919 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2920 As we do not have different encodings for the same number, the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2921 received object already is in its canonical form. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2922 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2923 return self |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2924 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2925 def compare_signal(self, other, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2926 """Compares self to the other operand numerically. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2927 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2928 It's pretty much like compare(), but all NaNs signal, with signaling |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2929 NaNs taking precedence over quiet NaNs. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2930 """ |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
2931 other = _convert_other(other, raiseit = True) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
2932 ans = self._compare_check_nans(other, context) |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
2933 if ans: |
|
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
2934 return ans |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2935 return self.compare(other, context=context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2936 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2937 def compare_total(self, other): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2938 """Compares self to other using the abstract representations. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2939 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2940 This is not like the standard compare, which use their numerical |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2941 value. Note that a total ordering is defined for all possible abstract |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2942 representations. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2943 """ |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
2944 other = _convert_other(other, raiseit=True) |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
2945 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2946 # if one is negative and the other is positive, it's easy |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2947 if self._sign and not other._sign: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2948 return _NegativeOne |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2949 if not self._sign and other._sign: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2950 return _One |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2951 sign = self._sign |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2952 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2953 # let's handle both NaN types |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2954 self_nan = self._isnan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2955 other_nan = other._isnan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2956 if self_nan or other_nan: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2957 if self_nan == other_nan: |
|
55743
094a6f158641
Merged revisions 74566 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55517
diff
changeset
|
2958 # compare payloads as though they're integers |
|
094a6f158641
Merged revisions 74566 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55517
diff
changeset
|
2959 self_key = len(self._int), self._int |
|
094a6f158641
Merged revisions 74566 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55517
diff
changeset
|
2960 other_key = len(other._int), other._int |
|
094a6f158641
Merged revisions 74566 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55517
diff
changeset
|
2961 if self_key < other_key: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2962 if sign: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2963 return _One |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2964 else: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2965 return _NegativeOne |
|
55743
094a6f158641
Merged revisions 74566 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55517
diff
changeset
|
2966 if self_key > other_key: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2967 if sign: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2968 return _NegativeOne |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2969 else: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2970 return _One |
|
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2971 return _Zero |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2972 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2973 if sign: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2974 if self_nan == 1: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2975 return _NegativeOne |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2976 if other_nan == 1: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2977 return _One |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2978 if self_nan == 2: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2979 return _NegativeOne |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2980 if other_nan == 2: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2981 return _One |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2982 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2983 if self_nan == 1: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2984 return _One |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2985 if other_nan == 1: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2986 return _NegativeOne |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2987 if self_nan == 2: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2988 return _One |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2989 if other_nan == 2: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2990 return _NegativeOne |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2991 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2992 if self < other: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2993 return _NegativeOne |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2994 if self > other: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2995 return _One |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2996 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2997 if self._exp < other._exp: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
2998 if sign: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
2999 return _One |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3000 else: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3001 return _NegativeOne |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3002 if self._exp > other._exp: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3003 if sign: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3004 return _NegativeOne |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3005 else: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3006 return _One |
|
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3007 return _Zero |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3008 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3009 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3010 def compare_total_mag(self, other): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3011 """Compares self to other using abstract repr., ignoring sign. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3012 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3013 Like compare_total, but with operand's sign ignored and assumed to be 0. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3014 """ |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3015 other = _convert_other(other, raiseit=True) |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3016 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3017 s = self.copy_abs() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3018 o = other.copy_abs() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3019 return s.compare_total(o) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3020 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3021 def copy_abs(self): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3022 """Returns a copy with the sign set to 0. """ |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3023 return _dec_from_triple(0, self._int, self._exp, self._is_special) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3024 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3025 def copy_negate(self): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3026 """Returns a copy with the sign inverted.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3027 if self._sign: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3028 return _dec_from_triple(0, self._int, self._exp, self._is_special) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3029 else: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3030 return _dec_from_triple(1, self._int, self._exp, self._is_special) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3031 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3032 def copy_sign(self, other): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3033 """Returns self with the sign of other.""" |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
3034 other = _convert_other(other, raiseit=True) |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3035 return _dec_from_triple(other._sign, self._int, |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3036 self._exp, self._is_special) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3037 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3038 def exp(self, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3039 """Returns e ** self.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3040 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3041 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3042 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3043 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3044 # exp(NaN) = NaN |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3045 ans = self._check_nans(context=context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3046 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3047 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3048 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3049 # exp(-Infinity) = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3050 if self._isinfinity() == -1: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3051 return _Zero |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3052 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3053 # exp(0) = 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3054 if not self: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3055 return _One |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3056 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3057 # exp(Infinity) = Infinity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3058 if self._isinfinity() == 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3059 return Decimal(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3060 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3061 # the result is now guaranteed to be inexact (the true |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3062 # mathematical result is transcendental). There's no need to |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3063 # raise Rounded and Inexact here---they'll always be raised as |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3064 # a result of the call to _fix. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3065 p = context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3066 adj = self.adjusted() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3067 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3068 # we only need to do any computation for quite a small range |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3069 # of adjusted exponents---for example, -29 <= adj <= 10 for |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3070 # the default context. For smaller exponent the result is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3071 # indistinguishable from 1 at the given precision, while for |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3072 # larger exponent the result either overflows or underflows. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3073 if self._sign == 0 and adj > len(str((context.Emax+1)*3)): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3074 # overflow |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3075 ans = _dec_from_triple(0, '1', context.Emax+1) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3076 elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3077 # underflow to 0 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3078 ans = _dec_from_triple(0, '1', context.Etiny()-1) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3079 elif self._sign == 0 and adj < -p: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3080 # p+1 digits; final round will raise correct flags |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3081 ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3082 elif self._sign == 1 and adj < -p-1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3083 # p+1 digits; final round will raise correct flags |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3084 ans = _dec_from_triple(0, '9'*(p+1), -p-1) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3085 # general case |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3086 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3087 op = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3088 c, e = op.int, op.exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3089 if op.sign == 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3090 c = -c |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3091 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3092 # compute correctly rounded result: increase precision by |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3093 # 3 digits at a time until we get an unambiguously |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3094 # roundable result |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3095 extra = 3 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3096 while True: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3097 coeff, exp = _dexp(c, e, p+extra) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3098 if coeff % (5*10**(len(str(coeff))-p-1)): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3099 break |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3100 extra += 3 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3101 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3102 ans = _dec_from_triple(0, str(coeff), exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3103 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3104 # at this stage, ans should round correctly with *any* |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3105 # rounding mode, not just with ROUND_HALF_EVEN |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3106 context = context._shallow_copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3107 rounding = context._set_rounding(ROUND_HALF_EVEN) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3108 ans = ans._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3109 context.rounding = rounding |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3110 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3111 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3112 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3113 def is_canonical(self): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3114 """Return True if self is canonical; otherwise return False. |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3115 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3116 Currently, the encoding of a Decimal instance is always |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3117 canonical, so this method returns True for any Decimal. |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3118 """ |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3119 return True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3120 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3121 def is_finite(self): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3122 """Return True if self is finite; otherwise return False. |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3123 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3124 A Decimal instance is considered finite if it is neither |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3125 infinite nor a NaN. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3126 """ |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3127 return not self._is_special |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3128 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3129 def is_infinite(self): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3130 """Return True if self is infinite; otherwise return False.""" |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3131 return self._exp == 'F' |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3132 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3133 def is_nan(self): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3134 """Return True if self is a qNaN or sNaN; otherwise return False.""" |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3135 return self._exp in ('n', 'N') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3136 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3137 def is_normal(self, context=None): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3138 """Return True if self is a normal number; otherwise return False.""" |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3139 if self._is_special or not self: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3140 return False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3141 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3142 context = getcontext() |
|
56644
26007395607e
Merged revisions 75562 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56411
diff
changeset
|
3143 return context.Emin <= self.adjusted() |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3144 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3145 def is_qnan(self): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3146 """Return True if self is a quiet NaN; otherwise return False.""" |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3147 return self._exp == 'n' |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3148 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3149 def is_signed(self): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3150 """Return True if self is negative; otherwise return False.""" |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3151 return self._sign == 1 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3152 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3153 def is_snan(self): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3154 """Return True if self is a signaling NaN; otherwise return False.""" |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3155 return self._exp == 'N' |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3156 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3157 def is_subnormal(self, context=None): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3158 """Return True if self is subnormal; otherwise return False.""" |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3159 if self._is_special or not self: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3160 return False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3161 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3162 context = getcontext() |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3163 return self.adjusted() < context.Emin |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3164 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3165 def is_zero(self): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
3166 """Return True if self is a zero; otherwise return False.""" |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3167 return not self._is_special and self._int == '0' |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3168 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3169 def _ln_exp_bound(self): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3170 """Compute a lower bound for the adjusted exponent of self.ln(). |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3171 In other words, compute r such that self.ln() >= 10**r. Assumes |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3172 that self is finite and positive and that self != 1. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3173 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3174 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3175 # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3176 adj = self._exp + len(self._int) - 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3177 if adj >= 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3178 # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3179 return len(str(adj*23//10)) - 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3180 if adj <= -2: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3181 # argument <= 0.1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3182 return len(str((-1-adj)*23//10)) - 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3183 op = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3184 c, e = op.int, op.exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3185 if adj == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3186 # 1 < self < 10 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3187 num = str(c-10**-e) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3188 den = str(c) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3189 return len(num) - len(den) - (num < den) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3190 # adj == -1, 0.1 <= self < 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3191 return e + len(str(10**-e - c)) - 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3192 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3193 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3194 def ln(self, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3195 """Returns the natural (base e) logarithm of self.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3196 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3197 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3198 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3199 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3200 # ln(NaN) = NaN |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3201 ans = self._check_nans(context=context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3202 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3203 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3204 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3205 # ln(0.0) == -Infinity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3206 if not self: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3207 return _NegativeInfinity |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3208 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3209 # ln(Infinity) = Infinity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3210 if self._isinfinity() == 1: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3211 return _Infinity |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3212 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3213 # ln(1.0) == 0.0 |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3214 if self == _One: |
|
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3215 return _Zero |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3216 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3217 # ln(negative) raises InvalidOperation |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3218 if self._sign == 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3219 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3220 'ln of a negative value') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3221 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3222 # result is irrational, so necessarily inexact |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3223 op = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3224 c, e = op.int, op.exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3225 p = context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3226 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3227 # correctly rounded result: repeatedly increase precision by 3 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3228 # until we get an unambiguously roundable result |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3229 places = p - self._ln_exp_bound() + 2 # at least p+3 places |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3230 while True: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3231 coeff = _dlog(c, e, places) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3232 # assert len(str(abs(coeff)))-p >= 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3233 if coeff % (5*10**(len(str(abs(coeff)))-p-1)): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3234 break |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3235 places += 3 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3236 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3237 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3238 context = context._shallow_copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3239 rounding = context._set_rounding(ROUND_HALF_EVEN) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3240 ans = ans._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3241 context.rounding = rounding |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3242 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3243 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3244 def _log10_exp_bound(self): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3245 """Compute a lower bound for the adjusted exponent of self.log10(). |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3246 In other words, find r such that self.log10() >= 10**r. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3247 Assumes that self is finite and positive and that self != 1. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3248 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3249 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3250 # For x >= 10 or x < 0.1 we only need a bound on the integer |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3251 # part of log10(self), and this comes directly from the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3252 # exponent of x. For 0.1 <= x <= 10 we use the inequalities |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3253 # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| > |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3254 # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3255 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3256 adj = self._exp + len(self._int) - 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3257 if adj >= 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3258 # self >= 10 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3259 return len(str(adj))-1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3260 if adj <= -2: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3261 # self < 0.1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3262 return len(str(-1-adj))-1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3263 op = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3264 c, e = op.int, op.exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3265 if adj == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3266 # 1 < self < 10 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3267 num = str(c-10**-e) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3268 den = str(231*c) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3269 return len(num) - len(den) - (num < den) + 2 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3270 # adj == -1, 0.1 <= self < 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3271 num = str(10**-e-c) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3272 return len(num) + e - (num < "231") - 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3273 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3274 def log10(self, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3275 """Returns the base 10 logarithm of self.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3276 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3277 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3278 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3279 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3280 # log10(NaN) = NaN |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3281 ans = self._check_nans(context=context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3282 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3283 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3284 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3285 # log10(0.0) == -Infinity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3286 if not self: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3287 return _NegativeInfinity |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3288 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3289 # log10(Infinity) = Infinity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3290 if self._isinfinity() == 1: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3291 return _Infinity |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3292 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3293 # log10(negative or -Infinity) raises InvalidOperation |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3294 if self._sign == 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3295 return context._raise_error(InvalidOperation, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3296 'log10 of a negative value') |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3297 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3298 # log10(10**n) = n |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3299 if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1): |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3300 # answer may need rounding |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3301 ans = Decimal(self._exp + len(self._int) - 1) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3302 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3303 # result is irrational, so necessarily inexact |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3304 op = _WorkRep(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3305 c, e = op.int, op.exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3306 p = context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3307 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3308 # correctly rounded result: repeatedly increase precision |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3309 # until result is unambiguously roundable |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3310 places = p-self._log10_exp_bound()+2 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3311 while True: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3312 coeff = _dlog10(c, e, places) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3313 # assert len(str(abs(coeff)))-p >= 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3314 if coeff % (5*10**(len(str(abs(coeff)))-p-1)): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3315 break |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3316 places += 3 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3317 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3318 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3319 context = context._shallow_copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3320 rounding = context._set_rounding(ROUND_HALF_EVEN) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3321 ans = ans._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3322 context.rounding = rounding |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3323 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3324 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3325 def logb(self, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3326 """ Returns the exponent of the magnitude of self's MSD. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3327 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3328 The result is the integer which is the exponent of the magnitude |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3329 of the most significant digit of self (as though it were truncated |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3330 to a single digit while maintaining the value of that digit and |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3331 without limiting the resulting exponent). |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3332 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3333 # logb(NaN) = NaN |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3334 ans = self._check_nans(context=context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3335 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3336 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3337 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3338 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3339 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3340 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3341 # logb(+/-Inf) = +Inf |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3342 if self._isinfinity(): |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3343 return _Infinity |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3344 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3345 # logb(0) = -Inf, DivisionByZero |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3346 if not self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3347 return context._raise_error(DivisionByZero, 'logb(0)', 1) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3348 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3349 # otherwise, simply return the adjusted exponent of self, as a |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3350 # Decimal. Note that no attempt is made to fit the result |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3351 # into the current context. |
|
56411
dc047d9abf7b
Merged revisions 75276 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55888
diff
changeset
|
3352 ans = Decimal(self.adjusted()) |
|
dc047d9abf7b
Merged revisions 75276 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55888
diff
changeset
|
3353 return ans._fix(context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3354 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3355 def _islogical(self): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3356 """Return True if self is a logical operand. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3357 |
|
44742
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44654
diff
changeset
|
3358 For being logical, it must be a finite number with a sign of 0, |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3359 an exponent of 0, and a coefficient whose digits must all be |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3360 either 0 or 1. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3361 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3362 if self._sign != 0 or self._exp != 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3363 return False |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3364 for dig in self._int: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3365 if dig not in '01': |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3366 return False |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3367 return True |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3368 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3369 def _fill_logical(self, context, opa, opb): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3370 dif = context.prec - len(opa) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3371 if dif > 0: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3372 opa = '0'*dif + opa |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3373 elif dif < 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3374 opa = opa[-context.prec:] |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3375 dif = context.prec - len(opb) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3376 if dif > 0: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3377 opb = '0'*dif + opb |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3378 elif dif < 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3379 opb = opb[-context.prec:] |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3380 return opa, opb |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3381 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3382 def logical_and(self, other, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3383 """Applies an 'and' operation between self and other's digits.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3384 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3385 context = getcontext() |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3386 |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3387 other = _convert_other(other, raiseit=True) |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3388 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3389 if not self._islogical() or not other._islogical(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3390 return context._raise_error(InvalidOperation) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3391 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3392 # fill to context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3393 (opa, opb) = self._fill_logical(context, self._int, other._int) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3394 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3395 # make the operation, and clean starting zeroes |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3396 result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)]) |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3397 return _dec_from_triple(0, result.lstrip('0') or '0', 0) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3398 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3399 def logical_invert(self, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3400 """Invert all its digits.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3401 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3402 context = getcontext() |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3403 return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0), |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3404 context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3405 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3406 def logical_or(self, other, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3407 """Applies an 'or' operation between self and other's digits.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3408 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3409 context = getcontext() |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3410 |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3411 other = _convert_other(other, raiseit=True) |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3412 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3413 if not self._islogical() or not other._islogical(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3414 return context._raise_error(InvalidOperation) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3415 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3416 # fill to context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3417 (opa, opb) = self._fill_logical(context, self._int, other._int) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3418 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3419 # make the operation, and clean starting zeroes |
|
50602
5436e534da6e
Merged revisions 68317-68318 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50597
diff
changeset
|
3420 result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)]) |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3421 return _dec_from_triple(0, result.lstrip('0') or '0', 0) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3422 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3423 def logical_xor(self, other, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3424 """Applies an 'xor' operation between self and other's digits.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3425 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3426 context = getcontext() |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3427 |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3428 other = _convert_other(other, raiseit=True) |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3429 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3430 if not self._islogical() or not other._islogical(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3431 return context._raise_error(InvalidOperation) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3432 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3433 # fill to context.prec |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3434 (opa, opb) = self._fill_logical(context, self._int, other._int) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3435 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3436 # make the operation, and clean starting zeroes |
|
50602
5436e534da6e
Merged revisions 68317-68318 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50597
diff
changeset
|
3437 result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)]) |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3438 return _dec_from_triple(0, result.lstrip('0') or '0', 0) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3439 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3440 def max_mag(self, other, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3441 """Compares the values numerically with their sign ignored.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3442 other = _convert_other(other, raiseit=True) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3443 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3444 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3445 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3446 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3447 if self._is_special or other._is_special: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3448 # If one operand is a quiet NaN and the other is number, then the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3449 # number is always returned |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3450 sn = self._isnan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3451 on = other._isnan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3452 if sn or on: |
|
50115
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
3453 if on == 1 and sn == 0: |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
3454 return self._fix(context) |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
3455 if sn == 1 and on == 0: |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
3456 return other._fix(context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3457 return self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3458 |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
3459 c = self.copy_abs()._cmp(other.copy_abs()) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3460 if c == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3461 c = self.compare_total(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3462 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3463 if c == -1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3464 ans = other |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3465 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3466 ans = self |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3467 |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
3468 return ans._fix(context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3469 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3470 def min_mag(self, other, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3471 """Compares the values numerically with their sign ignored.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3472 other = _convert_other(other, raiseit=True) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3473 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3474 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3475 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3476 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3477 if self._is_special or other._is_special: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3478 # If one operand is a quiet NaN and the other is number, then the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3479 # number is always returned |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3480 sn = self._isnan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3481 on = other._isnan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3482 if sn or on: |
|
50115
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
3483 if on == 1 and sn == 0: |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
3484 return self._fix(context) |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
3485 if sn == 1 and on == 0: |
|
21de7a9146f7
Merged revisions 67695 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
48848
diff
changeset
|
3486 return other._fix(context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3487 return self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3488 |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
3489 c = self.copy_abs()._cmp(other.copy_abs()) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3490 if c == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3491 c = self.compare_total(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3492 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3493 if c == -1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3494 ans = self |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3495 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3496 ans = other |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3497 |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
3498 return ans._fix(context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3499 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3500 def next_minus(self, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3501 """Returns the largest representable number smaller than itself.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3502 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3503 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3504 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3505 ans = self._check_nans(context=context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3506 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3507 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3508 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3509 if self._isinfinity() == -1: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3510 return _NegativeInfinity |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3511 if self._isinfinity() == 1: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3512 return _dec_from_triple(0, '9'*context.prec, context.Etop()) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3513 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3514 context = context.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3515 context._set_rounding(ROUND_FLOOR) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3516 context._ignore_all_flags() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3517 new_self = self._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3518 if new_self != self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3519 return new_self |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3520 return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1), |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3521 context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3522 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3523 def next_plus(self, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3524 """Returns the smallest representable number larger than itself.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3525 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3526 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3527 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3528 ans = self._check_nans(context=context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3529 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3530 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3531 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3532 if self._isinfinity() == 1: |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
3533 return _Infinity |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3534 if self._isinfinity() == -1: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3535 return _dec_from_triple(1, '9'*context.prec, context.Etop()) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3536 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3537 context = context.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3538 context._set_rounding(ROUND_CEILING) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3539 context._ignore_all_flags() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3540 new_self = self._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3541 if new_self != self: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3542 return new_self |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3543 return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1), |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3544 context) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3545 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3546 def next_toward(self, other, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3547 """Returns the number closest to self, in the direction towards other. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3548 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3549 The result is the closest representable number to self |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3550 (excluding self) that is in the direction towards other, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3551 unless both have the same value. If the two operands are |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3552 numerically equal, then the result is a copy of self with the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3553 sign set to be the same as the sign of other. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3554 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3555 other = _convert_other(other, raiseit=True) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3556 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3557 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3558 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3559 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3560 ans = self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3561 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3562 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3563 |
|
45244
2a821e001a2b
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-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45092
diff
changeset
|
3564 comparison = self._cmp(other) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3565 if comparison == 0: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3566 return self.copy_sign(other) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3567 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3568 if comparison == -1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3569 ans = self.next_plus(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3570 else: # comparison == 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3571 ans = self.next_minus(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3572 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3573 # decide which flags to raise using value of ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3574 if ans._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3575 context._raise_error(Overflow, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3576 'Infinite result from next_toward', |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3577 ans._sign) |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
3578 context._raise_error(Inexact) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3579 context._raise_error(Rounded) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3580 elif ans.adjusted() < context.Emin: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3581 context._raise_error(Underflow) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3582 context._raise_error(Subnormal) |
|
61214
1143972f04bb
Merged revisions 80755 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58665
diff
changeset
|
3583 context._raise_error(Inexact) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3584 context._raise_error(Rounded) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3585 # if precision == 1 then we don't raise Clamped for a |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3586 # result 0E-Etiny. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3587 if not ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3588 context._raise_error(Clamped) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3589 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3590 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3591 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3592 def number_class(self, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3593 """Returns an indication of the class of self. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3594 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3595 The class is one of the following strings: |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
3596 sNaN |
|
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44329
diff
changeset
|
3597 NaN |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3598 -Infinity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3599 -Normal |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3600 -Subnormal |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3601 -Zero |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3602 +Zero |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3603 +Subnormal |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3604 +Normal |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3605 +Infinity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3606 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3607 if self.is_snan(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3608 return "sNaN" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3609 if self.is_qnan(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3610 return "NaN" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3611 inf = self._isinfinity() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3612 if inf == 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3613 return "+Infinity" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3614 if inf == -1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3615 return "-Infinity" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3616 if self.is_zero(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3617 if self._sign: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3618 return "-Zero" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3619 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3620 return "+Zero" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3621 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3622 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3623 if self.is_subnormal(context=context): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3624 if self._sign: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3625 return "-Subnormal" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3626 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3627 return "+Subnormal" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3628 # just a normal, regular, boring number, :) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3629 if self._sign: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3630 return "-Normal" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3631 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3632 return "+Normal" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3633 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3634 def radix(self): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3635 """Just returns 10, as this is Decimal, :)""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3636 return Decimal(10) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3637 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3638 def rotate(self, other, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3639 """Returns a rotated copy of self, value-of-other times.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3640 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3641 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3642 |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3643 other = _convert_other(other, raiseit=True) |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3644 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3645 ans = self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3646 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3647 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3648 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3649 if other._exp != 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3650 return context._raise_error(InvalidOperation) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3651 if not (-context.prec <= int(other) <= context.prec): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3652 return context._raise_error(InvalidOperation) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3653 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3654 if self._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3655 return Decimal(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3656 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3657 # get values, pad if necessary |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3658 torot = int(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3659 rotdig = self._int |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3660 topad = context.prec - len(rotdig) |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3661 if topad > 0: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3662 rotdig = '0'*topad + rotdig |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3663 elif topad < 0: |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3664 rotdig = rotdig[-topad:] |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3665 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3666 # let's rotate! |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3667 rotated = rotdig[torot:] + rotdig[:torot] |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3668 return _dec_from_triple(self._sign, |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3669 rotated.lstrip('0') or '0', self._exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3670 |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3671 def scaleb(self, other, context=None): |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3672 """Returns self operand after adding the second value to its exp.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3673 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3674 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3675 |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3676 other = _convert_other(other, raiseit=True) |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3677 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3678 ans = self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3679 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3680 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3681 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3682 if other._exp != 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3683 return context._raise_error(InvalidOperation) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3684 liminf = -2 * (context.Emax + context.prec) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3685 limsup = 2 * (context.Emax + context.prec) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3686 if not (liminf <= int(other) <= limsup): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3687 return context._raise_error(InvalidOperation) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3688 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3689 if self._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3690 return Decimal(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3691 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3692 d = _dec_from_triple(self._sign, self._int, self._exp + int(other)) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3693 d = d._fix(context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3694 return d |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3695 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3696 def shift(self, other, context=None): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3697 """Returns a shifted copy of self, value-of-other times.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3698 if context is None: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3699 context = getcontext() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3700 |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3701 other = _convert_other(other, raiseit=True) |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3702 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3703 ans = self._check_nans(other, context) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3704 if ans: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3705 return ans |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3706 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3707 if other._exp != 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3708 return context._raise_error(InvalidOperation) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3709 if not (-context.prec <= int(other) <= context.prec): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3710 return context._raise_error(InvalidOperation) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3711 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3712 if self._isinfinity(): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3713 return Decimal(self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3714 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3715 # get values, pad if necessary |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3716 torot = int(other) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3717 rotdig = self._int |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3718 topad = context.prec - len(rotdig) |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3719 if topad > 0: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3720 rotdig = '0'*topad + rotdig |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3721 elif topad < 0: |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3722 rotdig = rotdig[-topad:] |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3723 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3724 # let's shift! |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3725 if torot < 0: |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3726 shifted = rotdig[:torot] |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3727 else: |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3728 shifted = rotdig + '0'*torot |
|
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3729 shifted = shifted[-context.prec:] |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3730 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3731 return _dec_from_triple(self._sign, |
|
56973
0ed4bf430d4e
Merged revisions 75947 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56644
diff
changeset
|
3732 shifted.lstrip('0') or '0', self._exp) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
3733 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3734 # Support for pickling, copy, and deepcopy |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3735 def __reduce__(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3736 return (self.__class__, (str(self),)) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3737 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3738 def __copy__(self): |
|
58668
72ecfffe9f02
Merged revisions 77712,77740-77741,77756,77886,77902,77936 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
58664
diff
changeset
|
3739 if type(self) is Decimal: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3740 return self # I'm immutable; therefore I am my own clone |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3741 return self.__class__(str(self)) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3742 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3743 def __deepcopy__(self, memo): |
|
58668
72ecfffe9f02
Merged revisions 77712,77740-77741,77756,77886,77902,77936 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
58664
diff
changeset
|
3744 if type(self) is Decimal: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3745 return self # My components are also immutable |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3746 return self.__class__(str(self)) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3747 |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3748 # PEP 3101 support. the _localeconv keyword argument should be |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3749 # considered private: it's provided for ease of testing only. |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3750 def __format__(self, specifier, context=None, _localeconv=None): |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3751 """Format a Decimal instance according to the given specifier. |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3752 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3753 The specifier should be a standard format specifier, with the |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3754 form described in PEP 3101. Formatting types 'e', 'E', 'f', |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3755 'F', 'g', 'G', 'n' and '%' are supported. If the formatting |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3756 type is omitted it defaults to 'g' or 'G', depending on the |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3757 value of context.capitals. |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3758 """ |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3759 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3760 # Note: PEP 3101 says that if the type is not present then |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3761 # there should be at least one digit after the decimal point. |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3762 # We take the liberty of ignoring this requirement for |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3763 # Decimal---it's presumably there to make sure that |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3764 # format(float, '') behaves similarly to str(float). |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3765 if context is None: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3766 context = getcontext() |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3767 |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3768 spec = _parse_format_specifier(specifier, _localeconv=_localeconv) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3769 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3770 # special values don't care about the type or precision |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3771 if self._is_special: |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3772 sign = _format_sign(self._sign, spec) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3773 body = str(self.copy_abs()) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3774 return _format_align(sign, body, spec) |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3775 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3776 # a type of None defaults to 'g' or 'G', depending on context |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3777 if spec['type'] is None: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3778 spec['type'] = ['g', 'G'][context.capitals] |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3779 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3780 # if type is '%', adjust exponent of self accordingly |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3781 if spec['type'] == '%': |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3782 self = _dec_from_triple(self._sign, self._int, self._exp+2) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3783 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3784 # round if necessary, taking rounding mode from the context |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3785 rounding = context.rounding |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3786 precision = spec['precision'] |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3787 if precision is not None: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3788 if spec['type'] in 'eE': |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3789 self = self._round(precision+1, rounding) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3790 elif spec['type'] in 'fF%': |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3791 self = self._rescale(-precision, rounding) |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3792 elif spec['type'] in 'gG' and len(self._int) > precision: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3793 self = self._round(precision, rounding) |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3794 # special case: zeros with a positive exponent can't be |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3795 # represented in fixed point; rescale them to 0e0. |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3796 if not self and self._exp > 0 and spec['type'] in 'fF%': |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3797 self = self._rescale(0, rounding) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3798 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3799 # figure out placement of the decimal point |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3800 leftdigits = self._exp + len(self._int) |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3801 if spec['type'] in 'eE': |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3802 if not self and precision is not None: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3803 dotplace = 1 - precision |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3804 else: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3805 dotplace = 1 |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3806 elif spec['type'] in 'fF%': |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3807 dotplace = leftdigits |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3808 elif spec['type'] in 'gG': |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3809 if self._exp <= 0 and leftdigits > -6: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3810 dotplace = leftdigits |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3811 else: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3812 dotplace = 1 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3813 |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3814 # find digits before and after decimal point, and get exponent |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3815 if dotplace < 0: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3816 intpart = '0' |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3817 fracpart = '0'*(-dotplace) + self._int |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3818 elif dotplace > len(self._int): |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3819 intpart = self._int + '0'*(dotplace-len(self._int)) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3820 fracpart = '' |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3821 else: |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3822 intpart = self._int[:dotplace] or '0' |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3823 fracpart = self._int[dotplace:] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3824 exp = leftdigits-dotplace |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3825 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3826 # done with the decimal-specific stuff; hand over the rest |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3827 # of the formatting to the _format_number function |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
3828 return _format_number(self._sign, intpart, fracpart, exp, spec) |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
3829 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3830 def _dec_from_triple(sign, coefficient, exponent, special=False): |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3831 """Create a decimal instance directly, without any validation, |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3832 normalization (e.g. removal of leading zeros) or argument |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3833 conversion. |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3834 |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3835 This function is for *internal use only*. |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3836 """ |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3837 |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3838 self = object.__new__(Decimal) |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3839 self._sign = sign |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3840 self._int = coefficient |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3841 self._exp = exponent |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3842 self._is_special = special |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3843 |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3844 return self |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3845 |
|
51297
5b713045ea90
Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents:
51029
diff
changeset
|
3846 # Register Decimal as a kind of Number (an abstract base class). |
|
5b713045ea90
Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents:
51029
diff
changeset
|
3847 # However, do not register it as Real (because Decimals are not |
|
5b713045ea90
Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents:
51029
diff
changeset
|
3848 # interoperable with floats). |
|
5b713045ea90
Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents:
51029
diff
changeset
|
3849 _numbers.Number.register(Decimal) |
|
5b713045ea90
Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents:
51029
diff
changeset
|
3850 |
|
5b713045ea90
Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents:
51029
diff
changeset
|
3851 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3852 ##### Context class ####################################################### |
|
32477
bc586db9945a
Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents:
32456
diff
changeset
|
3853 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
3854 class _ContextManager(object): |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
3855 """Context manager class to support localcontext(). |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
3856 |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
3857 Sets a copy of the supplied context in __enter__() and restores |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
3858 the previous decimal context in __exit__() |
|
36737
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
35379
diff
changeset
|
3859 """ |
|
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
35379
diff
changeset
|
3860 def __init__(self, new_context): |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40404
diff
changeset
|
3861 self.new_context = new_context.copy() |
|
36737
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
35379
diff
changeset
|
3862 def __enter__(self): |
|
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
35379
diff
changeset
|
3863 self.saved_context = getcontext() |
|
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
35379
diff
changeset
|
3864 setcontext(self.new_context) |
|
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
35379
diff
changeset
|
3865 return self.new_context |
|
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
35379
diff
changeset
|
3866 def __exit__(self, t, v, tb): |
|
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
35379
diff
changeset
|
3867 setcontext(self.saved_context) |
|
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
35379
diff
changeset
|
3868 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3869 class Context(object): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3870 """Contains the context for a Decimal instance. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3871 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3872 Contains: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3873 prec - precision (for use in rounding, division, square roots..) |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3874 rounding - rounding type (how you round) |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
3875 traps - If traps[exception] = 1, then the exception is |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3876 raised when it is caused. Otherwise, a value is |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3877 substituted in. |
|
45092
faa88ff4cce4
Context flags get set, not incremented.
Raymond Hettinger <python@rcn.com>
parents:
44943
diff
changeset
|
3878 flags - When an exception is caused, flags[exception] is set. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3879 (Whether or not the trap_enabler is set) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3880 Should be reset by user of Decimal instance. |
|
32489
ab0a2b74ddfd
Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents:
32487
diff
changeset
|
3881 Emin - Minimum exponent |
|
ab0a2b74ddfd
Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents:
32487
diff
changeset
|
3882 Emax - Maximum exponent |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3883 capitals - If 1, 1*10^1 is printed as 1E+1. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3884 If 0, printed as 1e1 |
|
61864
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
3885 clamp - If 1, change exponents if too high (Default 0) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3886 """ |
| 32482 | 3887 |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3888 def __init__(self, prec=None, rounding=None, Emin=None, Emax=None, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3889 capitals=None, clamp=None, flags=None, traps=None, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3890 _ignored_flags=None): |
|
62870
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3891 # Set defaults; for everything except flags and _ignored_flags, |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3892 # inherit from DefaultContext. |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3893 try: |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3894 dc = DefaultContext |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3895 except NameError: |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3896 pass |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3897 |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3898 self.prec = prec if prec is not None else dc.prec |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3899 self.rounding = rounding if rounding is not None else dc.rounding |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3900 self.Emin = Emin if Emin is not None else dc.Emin |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3901 self.Emax = Emax if Emax is not None else dc.Emax |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3902 self.capitals = capitals if capitals is not None else dc.capitals |
|
62869
09f5fd013c0b
Issue #9136: Profiling Decimal gave 'dictionary changed size during iteration'.
Mark Dickinson <dickinsm@gmail.com>
parents:
62865
diff
changeset
|
3903 self.clamp = clamp if clamp is not None else dc.clamp |
|
62870
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3904 |
|
33722
74a57e6684f3
Don't use mutable values for method defaults.
Raymond Hettinger <python@rcn.com>
parents:
33695
diff
changeset
|
3905 if _ignored_flags is None: |
|
62870
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3906 self._ignored_flags = [] |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3907 else: |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3908 self._ignored_flags = _ignored_flags |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3909 |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3910 if traps is None: |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3911 self.traps = dc.traps.copy() |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3912 elif not isinstance(traps, dict): |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3913 self.traps = dict((s, int(s in traps)) for s in _signals + traps) |
|
62870
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3914 else: |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3915 self.traps = traps |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3916 |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3917 if flags is None: |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3918 self.flags = dict.fromkeys(_signals, 0) |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3919 elif not isinstance(flags, dict): |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3920 self.flags = dict((s, int(s in flags)) for s in _signals + flags) |
|
62870
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3921 else: |
|
9752b85c0119
Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
62866
diff
changeset
|
3922 self.flags = flags |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
3923 |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3924 def _set_integer_check(self, name, value, vmin, vmax): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3925 if not isinstance(value, int): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3926 raise TypeError("%s must be an integer" % name) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3927 if vmin == '-inf': |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3928 if value > vmax: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3929 raise ValueError("%s must be in [%s, %d]. got: %s" % (name, vmin, vmax, value)) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3930 elif vmax == 'inf': |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3931 if value < vmin: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3932 raise ValueError("%s must be in [%d, %s]. got: %s" % (name, vmin, vmax, value)) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3933 else: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3934 if value < vmin or value > vmax: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3935 raise ValueError("%s must be in [%d, %d]. got %s" % (name, vmin, vmax, value)) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3936 return object.__setattr__(self, name, value) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3937 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3938 def _set_signal_dict(self, name, d): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3939 if not isinstance(d, dict): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3940 raise TypeError("%s must be a signal dict" % d) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3941 for key in d: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3942 if not key in _signals: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3943 raise KeyError("%s is not a valid signal dict" % d) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3944 for key in _signals: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3945 if not key in d: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3946 raise KeyError("%s is not a valid signal dict" % d) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3947 return object.__setattr__(self, name, d) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3948 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3949 def __setattr__(self, name, value): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3950 if name == 'prec': |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3951 return self._set_integer_check(name, value, 1, 'inf') |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3952 elif name == 'Emin': |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3953 return self._set_integer_check(name, value, '-inf', 0) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3954 elif name == 'Emax': |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3955 return self._set_integer_check(name, value, 0, 'inf') |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3956 elif name == 'capitals': |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3957 return self._set_integer_check(name, value, 0, 1) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3958 elif name == 'clamp': |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3959 return self._set_integer_check(name, value, 0, 1) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3960 elif name == 'rounding': |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3961 if not value in _rounding_modes: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3962 # raise TypeError even for strings to have consistency |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3963 # among various implementations. |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3964 raise TypeError("%s: invalid rounding mode" % value) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3965 return object.__setattr__(self, name, value) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3966 elif name == 'flags' or name == 'traps': |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3967 return self._set_signal_dict(name, value) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3968 elif name == '_ignored_flags': |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3969 return object.__setattr__(self, name, value) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3970 else: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3971 raise AttributeError( |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3972 "'decimal.Context' object has no attribute '%s'" % name) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3973 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3974 def __delattr__(self, name): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3975 raise AttributeError("%s cannot be deleted" % name) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3976 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3977 # Support for pickling, copy, and deepcopy |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3978 def __reduce__(self): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3979 flags = [sig for sig, v in self.flags.items() if v] |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3980 traps = [sig for sig, v in self.traps.items() if v] |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3981 return (self.__class__, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3982 (self.prec, self.rounding, self.Emin, self.Emax, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3983 self.capitals, self.clamp, flags, traps)) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
3984 |
|
32487
fa23a9b18967
Fix clear_flags(). Make a readable (not evalable) Context repr.
Raymond Hettinger <python@rcn.com>
parents:
32482
diff
changeset
|
3985 def __repr__(self): |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
3986 """Show the current context.""" |
|
32487
fa23a9b18967
Fix clear_flags(). Make a readable (not evalable) Context repr.
Raymond Hettinger <python@rcn.com>
parents:
32482
diff
changeset
|
3987 s = [] |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3988 s.append('Context(prec=%(prec)d, rounding=%(rounding)s, ' |
|
61864
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
3989 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d, ' |
|
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
3990 'clamp=%(clamp)d' |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3991 % vars(self)) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3992 names = [f.__name__ for f, v in self.flags.items() if v] |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3993 s.append('flags=[' + ', '.join(names) + ']') |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3994 names = [t.__name__ for t, v in self.traps.items() if v] |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3995 s.append('traps=[' + ', '.join(names) + ']') |
|
32487
fa23a9b18967
Fix clear_flags(). Make a readable (not evalable) Context repr.
Raymond Hettinger <python@rcn.com>
parents:
32482
diff
changeset
|
3996 return ', '.join(s) + ')' |
|
fa23a9b18967
Fix clear_flags(). Make a readable (not evalable) Context repr.
Raymond Hettinger <python@rcn.com>
parents:
32482
diff
changeset
|
3997 |
|
32477
bc586db9945a
Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents:
32456
diff
changeset
|
3998 def clear_flags(self): |
|
bc586db9945a
Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents:
32456
diff
changeset
|
3999 """Reset all flags to zero""" |
|
bc586db9945a
Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents:
32456
diff
changeset
|
4000 for flag in self.flags: |
|
32487
fa23a9b18967
Fix clear_flags(). Make a readable (not evalable) Context repr.
Raymond Hettinger <python@rcn.com>
parents:
32482
diff
changeset
|
4001 self.flags[flag] = 0 |
|
32477
bc586db9945a
Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents:
32456
diff
changeset
|
4002 |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4003 def clear_traps(self): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4004 """Reset all traps to zero""" |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4005 for flag in self.traps: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4006 self.traps[flag] = 0 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4007 |
|
33044
2749334d71a4
* Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents:
32980
diff
changeset
|
4008 def _shallow_copy(self): |
|
2749334d71a4
* Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents:
32980
diff
changeset
|
4009 """Returns a shallow copy from self.""" |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4010 nc = Context(self.prec, self.rounding, self.Emin, self.Emax, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4011 self.capitals, self.clamp, self.flags, self.traps, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4012 self._ignored_flags) |
|
33044
2749334d71a4
* Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents:
32980
diff
changeset
|
4013 return nc |
|
2749334d71a4
* Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents:
32980
diff
changeset
|
4014 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4015 def copy(self): |
|
33044
2749334d71a4
* Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents:
32980
diff
changeset
|
4016 """Returns a deep copy from self.""" |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4017 nc = Context(self.prec, self.rounding, self.Emin, self.Emax, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4018 self.capitals, self.clamp, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4019 self.flags.copy(), self.traps.copy(), |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4020 self._ignored_flags) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4021 return nc |
| 32482 | 4022 __copy__ = copy |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4023 |
| 32560 | 4024 def _raise_error(self, condition, explanation = None, *args): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4025 """Handles an error |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4026 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4027 If the flag is in _ignored_flags, returns the default response. |
|
45092
faa88ff4cce4
Context flags get set, not incremented.
Raymond Hettinger <python@rcn.com>
parents:
44943
diff
changeset
|
4028 Otherwise, it sets the flag, then, if the corresponding |
|
61746
49d7de9d7b1a
Merged revisions 81352 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61214
diff
changeset
|
4029 trap_enabler is set, it reraises the exception. Otherwise, it returns |
|
45092
faa88ff4cce4
Context flags get set, not incremented.
Raymond Hettinger <python@rcn.com>
parents:
44943
diff
changeset
|
4030 the default value after setting the flag. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4031 """ |
| 32560 | 4032 error = _condition_map.get(condition, condition) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4033 if error in self._ignored_flags: |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
4034 # Don't touch the flag |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4035 return error().handle(self, *args) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4036 |
|
45092
faa88ff4cce4
Context flags get set, not incremented.
Raymond Hettinger <python@rcn.com>
parents:
44943
diff
changeset
|
4037 self.flags[error] = 1 |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
4038 if not self.traps[error]: |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
4039 # The errors define how to handle themselves. |
| 32560 | 4040 return condition().handle(self, *args) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4041 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4042 # Errors should only be risked on copies of the context |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
4043 # self._ignored_flags = [] |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42629
diff
changeset
|
4044 raise error(explanation) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4045 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4046 def _ignore_all_flags(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4047 """Ignore all flags, if they are raised""" |
|
32666
c13d911ae05b
* Rename "Signals" to "_signals" making it non-public.
Raymond Hettinger <python@rcn.com>
parents:
32576
diff
changeset
|
4048 return self._ignore_flags(*_signals) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4049 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4050 def _ignore_flags(self, *flags): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4051 """Ignore the flags, if they are raised""" |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4052 # Do not mutate-- This way, copies of a context leave the original |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4053 # alone. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4054 self._ignored_flags = (self._ignored_flags + list(flags)) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4055 return list(flags) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4056 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4057 def _regard_flags(self, *flags): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4058 """Stop ignoring the flags, if they are raised""" |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4059 if flags and isinstance(flags[0], (tuple,list)): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4060 flags = flags[0] |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4061 for flag in flags: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4062 self._ignored_flags.remove(flag) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4063 |
|
48475
f4e7ef4329a9
Manual forward port of 64962 - use PyObject_HashNotImplemented as a tp_hash level indicator that the default hash implementation has not been inherited
Nick Coghlan <ncoghlan@gmail.com>
parents:
48412
diff
changeset
|
4064 # We inherit object.__hash__, so we must deny this explicitly |
|
f4e7ef4329a9
Manual forward port of 64962 - use PyObject_HashNotImplemented as a tp_hash level indicator that the default hash implementation has not been inherited
Nick Coghlan <ncoghlan@gmail.com>
parents:
48412
diff
changeset
|
4065 __hash__ = None |
| 32560 | 4066 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4067 def Etiny(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4068 """Returns Etiny (= Emin - prec + 1)""" |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4069 return int(self.Emin - self.prec + 1) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4070 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4071 def Etop(self): |
| 32496 | 4072 """Returns maximum exponent (= Emax - prec + 1)""" |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4073 return int(self.Emax - self.prec + 1) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4074 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4075 def _set_rounding(self, type): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4076 """Sets the rounding type. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4077 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4078 Sets the rounding type, and returns the current (previous) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4079 rounding type. Often used like: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4080 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4081 context = context.copy() |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4082 # so you don't change the calling context |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4083 # if an error occurs in the middle. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4084 rounding = context._set_rounding(ROUND_UP) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4085 val = self.__sub__(other, context=context) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4086 context._set_rounding(rounding) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4087 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4088 This will make it round up for that operation. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4089 """ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4090 rounding = self.rounding |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4091 self.rounding= type |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4092 return rounding |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4093 |
|
32666
c13d911ae05b
* Rename "Signals" to "_signals" making it non-public.
Raymond Hettinger <python@rcn.com>
parents:
32576
diff
changeset
|
4094 def create_decimal(self, num='0'): |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
4095 """Creates a new Decimal instance but using self as context. |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
4096 |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
4097 This method implements the to-number operation of the |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
4098 IBM Decimal specification.""" |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
4099 |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
4100 if isinstance(num, str) and num != num.strip(): |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
4101 return self._raise_error(ConversionSyntax, |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
4102 "no trailing or leading whitespace is " |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
4103 "permitted.") |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
4104 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4105 d = Decimal(num, context=self) |
|
61864
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
4106 if d._isnan() and len(d._int) > self.prec - self.clamp: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4107 return self._raise_error(ConversionSyntax, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4108 "diagnostic info too long in NaN") |
| 33695 | 4109 return d._fix(self) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4110 |
|
50499
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4111 def create_decimal_from_float(self, f): |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4112 """Creates a new Decimal instance from a float but rounding using self |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4113 as the context. |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4114 |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4115 >>> context = Context(prec=5, rounding=ROUND_DOWN) |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4116 >>> context.create_decimal_from_float(3.1415926535897932) |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4117 Decimal('3.1415') |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4118 >>> context = Context(prec=5, traps=[Inexact]) |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4119 >>> context.create_decimal_from_float(3.1415926535897932) |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4120 Traceback (most recent call last): |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4121 ... |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4122 decimal.Inexact: None |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4123 |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4124 """ |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4125 d = Decimal.from_float(f) # An exact conversion |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4126 return d._fix(self) # Apply the context rounding |
|
104005d07ea5
Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents:
50482
diff
changeset
|
4127 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
4128 # Methods |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4129 def abs(self, a): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4130 """Returns the absolute value of the operand. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4131 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4132 If the operand is negative, the result is the same as using the minus |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
4133 operation on the operand. Otherwise, the result is the same as using |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4134 the plus operation on the operand. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4135 |
| 32482 | 4136 >>> ExtendedContext.abs(Decimal('2.1')) |
|
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:
45307
diff
changeset
|
4137 Decimal('2.1') |
| 32482 | 4138 >>> ExtendedContext.abs(Decimal('-100')) |
|
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:
45307
diff
changeset
|
4139 Decimal('100') |
| 32482 | 4140 >>> ExtendedContext.abs(Decimal('101.5')) |
|
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:
45307
diff
changeset
|
4141 Decimal('101.5') |
| 32482 | 4142 >>> ExtendedContext.abs(Decimal('-101.5')) |
|
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:
45307
diff
changeset
|
4143 Decimal('101.5') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4144 >>> ExtendedContext.abs(-1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4145 Decimal('1') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4146 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4147 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4148 return a.__abs__(context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4149 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4150 def add(self, a, b): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4151 """Return the sum of the two operands. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4152 |
| 32482 | 4153 >>> ExtendedContext.add(Decimal('12'), Decimal('7.00')) |
|
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:
45307
diff
changeset
|
4154 Decimal('19.00') |
| 32482 | 4155 >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4')) |
|
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:
45307
diff
changeset
|
4156 Decimal('1.02E+4') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4157 >>> ExtendedContext.add(1, Decimal(2)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4158 Decimal('3') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4159 >>> ExtendedContext.add(Decimal(8), 5) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4160 Decimal('13') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4161 >>> ExtendedContext.add(5, 5) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4162 Decimal('10') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4163 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4164 a = _convert_other(a, raiseit=True) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4165 r = a.__add__(b, context=self) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4166 if r is NotImplemented: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4167 raise TypeError("Unable to convert %s to Decimal" % b) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4168 else: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4169 return r |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4170 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4171 def _apply(self, a): |
| 33695 | 4172 return str(a._fix(self)) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4173 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4174 def canonical(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4175 """Returns the same Decimal object. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4176 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4177 As we do not have different encodings for the same number, the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4178 received object already is in its canonical form. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4179 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4180 >>> ExtendedContext.canonical(Decimal('2.50')) |
|
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:
45307
diff
changeset
|
4181 Decimal('2.50') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4182 """ |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4183 if not isinstance(a, Decimal): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4184 raise TypeError("canonical requires a Decimal as an argument.") |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4185 return a.canonical(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4186 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4187 def compare(self, a, b): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4188 """Compares values numerically. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4189 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4190 If the signs of the operands differ, a value representing each operand |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4191 ('-1' if the operand is less than zero, '0' if the operand is zero or |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4192 negative zero, or '1' if the operand is greater than zero) is used in |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4193 place of that operand for the comparison instead of the actual |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4194 operand. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4195 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4196 The comparison is then effected by subtracting the second operand from |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4197 the first and then returning a value according to the result of the |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4198 subtraction: '-1' if the result is less than zero, '0' if the result is |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4199 zero or negative zero, or '1' if the result is greater than zero. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4200 |
| 32482 | 4201 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3')) |
|
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:
45307
diff
changeset
|
4202 Decimal('-1') |
| 32482 | 4203 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1')) |
|
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:
45307
diff
changeset
|
4204 Decimal('0') |
| 32482 | 4205 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10')) |
|
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:
45307
diff
changeset
|
4206 Decimal('0') |
| 32482 | 4207 >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1')) |
|
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:
45307
diff
changeset
|
4208 Decimal('1') |
| 32482 | 4209 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3')) |
|
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:
45307
diff
changeset
|
4210 Decimal('1') |
| 32482 | 4211 >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1')) |
|
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:
45307
diff
changeset
|
4212 Decimal('-1') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4213 >>> ExtendedContext.compare(1, 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4214 Decimal('-1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4215 >>> ExtendedContext.compare(Decimal(1), 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4216 Decimal('-1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4217 >>> ExtendedContext.compare(1, Decimal(2)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4218 Decimal('-1') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4219 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4220 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4221 return a.compare(b, context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4222 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4223 def compare_signal(self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4224 """Compares the values of the two operands numerically. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4225 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4226 It's pretty much like compare(), but all NaNs signal, with signaling |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4227 NaNs taking precedence over quiet NaNs. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4228 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4229 >>> c = ExtendedContext |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4230 >>> c.compare_signal(Decimal('2.1'), Decimal('3')) |
|
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:
45307
diff
changeset
|
4231 Decimal('-1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4232 >>> c.compare_signal(Decimal('2.1'), Decimal('2.1')) |
|
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:
45307
diff
changeset
|
4233 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4234 >>> c.flags[InvalidOperation] = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4235 >>> print(c.flags[InvalidOperation]) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4236 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4237 >>> c.compare_signal(Decimal('NaN'), Decimal('2.1')) |
|
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:
45307
diff
changeset
|
4238 Decimal('NaN') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4239 >>> print(c.flags[InvalidOperation]) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4240 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4241 >>> c.flags[InvalidOperation] = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4242 >>> print(c.flags[InvalidOperation]) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4243 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4244 >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1')) |
|
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:
45307
diff
changeset
|
4245 Decimal('NaN') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4246 >>> print(c.flags[InvalidOperation]) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4247 1 |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4248 >>> c.compare_signal(-1, 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4249 Decimal('-1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4250 >>> c.compare_signal(Decimal(-1), 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4251 Decimal('-1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4252 >>> c.compare_signal(-1, Decimal(2)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4253 Decimal('-1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4254 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4255 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4256 return a.compare_signal(b, context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4257 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4258 def compare_total(self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4259 """Compares two operands using their abstract representation. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4260 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4261 This is not like the standard compare, which use their numerical |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4262 value. Note that a total ordering is defined for all possible abstract |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4263 representations. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4264 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4265 >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9')) |
|
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:
45307
diff
changeset
|
4266 Decimal('-1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4267 >>> ExtendedContext.compare_total(Decimal('-127'), Decimal('12')) |
|
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:
45307
diff
changeset
|
4268 Decimal('-1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4269 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3')) |
|
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:
45307
diff
changeset
|
4270 Decimal('-1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4271 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30')) |
|
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:
45307
diff
changeset
|
4272 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4273 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('12.300')) |
|
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:
45307
diff
changeset
|
4274 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4275 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN')) |
|
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:
45307
diff
changeset
|
4276 Decimal('-1') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4277 >>> ExtendedContext.compare_total(1, 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4278 Decimal('-1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4279 >>> ExtendedContext.compare_total(Decimal(1), 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4280 Decimal('-1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4281 >>> ExtendedContext.compare_total(1, Decimal(2)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4282 Decimal('-1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4283 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4284 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4285 return a.compare_total(b) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4286 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4287 def compare_total_mag(self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4288 """Compares two operands using their abstract representation ignoring sign. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4289 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4290 Like compare_total, but with operand's sign ignored and assumed to be 0. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4291 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4292 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4293 return a.compare_total_mag(b) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4294 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4295 def copy_abs(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4296 """Returns a copy of the operand with the sign set to 0. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4297 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4298 >>> ExtendedContext.copy_abs(Decimal('2.1')) |
|
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:
45307
diff
changeset
|
4299 Decimal('2.1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4300 >>> ExtendedContext.copy_abs(Decimal('-100')) |
|
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:
45307
diff
changeset
|
4301 Decimal('100') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4302 >>> ExtendedContext.copy_abs(-1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4303 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4304 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4305 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4306 return a.copy_abs() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4307 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4308 def copy_decimal(self, a): |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4309 """Returns a copy of the decimal object. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4310 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4311 >>> ExtendedContext.copy_decimal(Decimal('2.1')) |
|
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:
45307
diff
changeset
|
4312 Decimal('2.1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4313 >>> ExtendedContext.copy_decimal(Decimal('-1.00')) |
|
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:
45307
diff
changeset
|
4314 Decimal('-1.00') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4315 >>> ExtendedContext.copy_decimal(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4316 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4317 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4318 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4319 return Decimal(a) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4320 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4321 def copy_negate(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4322 """Returns a copy of the operand with the sign inverted. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4323 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4324 >>> ExtendedContext.copy_negate(Decimal('101.5')) |
|
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:
45307
diff
changeset
|
4325 Decimal('-101.5') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4326 >>> ExtendedContext.copy_negate(Decimal('-101.5')) |
|
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:
45307
diff
changeset
|
4327 Decimal('101.5') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4328 >>> ExtendedContext.copy_negate(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4329 Decimal('-1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4330 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4331 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4332 return a.copy_negate() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4333 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4334 def copy_sign(self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4335 """Copies the second operand's sign to the first one. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4336 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4337 In detail, it returns a copy of the first operand with the sign |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4338 equal to the sign of the second operand. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4339 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4340 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33')) |
|
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:
45307
diff
changeset
|
4341 Decimal('1.50') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4342 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33')) |
|
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:
45307
diff
changeset
|
4343 Decimal('1.50') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4344 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33')) |
|
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:
45307
diff
changeset
|
4345 Decimal('-1.50') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4346 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33')) |
|
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:
45307
diff
changeset
|
4347 Decimal('-1.50') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4348 >>> ExtendedContext.copy_sign(1, -2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4349 Decimal('-1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4350 >>> ExtendedContext.copy_sign(Decimal(1), -2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4351 Decimal('-1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4352 >>> ExtendedContext.copy_sign(1, Decimal(-2)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4353 Decimal('-1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4354 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4355 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4356 return a.copy_sign(b) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4357 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4358 def divide(self, a, b): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4359 """Decimal division in a specified context. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4360 |
| 32482 | 4361 >>> ExtendedContext.divide(Decimal('1'), Decimal('3')) |
|
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:
45307
diff
changeset
|
4362 Decimal('0.333333333') |
| 32482 | 4363 >>> ExtendedContext.divide(Decimal('2'), Decimal('3')) |
|
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:
45307
diff
changeset
|
4364 Decimal('0.666666667') |
| 32482 | 4365 >>> ExtendedContext.divide(Decimal('5'), Decimal('2')) |
|
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:
45307
diff
changeset
|
4366 Decimal('2.5') |
| 32482 | 4367 >>> ExtendedContext.divide(Decimal('1'), Decimal('10')) |
|
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:
45307
diff
changeset
|
4368 Decimal('0.1') |
| 32482 | 4369 >>> ExtendedContext.divide(Decimal('12'), Decimal('12')) |
|
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:
45307
diff
changeset
|
4370 Decimal('1') |
| 32482 | 4371 >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2')) |
|
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:
45307
diff
changeset
|
4372 Decimal('4.00') |
| 32482 | 4373 >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.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:
45307
diff
changeset
|
4374 Decimal('1.20') |
| 32482 | 4375 >>> ExtendedContext.divide(Decimal('1000'), Decimal('100')) |
|
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:
45307
diff
changeset
|
4376 Decimal('10') |
| 32482 | 4377 >>> ExtendedContext.divide(Decimal('1000'), Decimal('1')) |
|
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:
45307
diff
changeset
|
4378 Decimal('1000') |
| 32482 | 4379 >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2')) |
|
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:
45307
diff
changeset
|
4380 Decimal('1.20E+6') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4381 >>> ExtendedContext.divide(5, 5) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4382 Decimal('1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4383 >>> ExtendedContext.divide(Decimal(5), 5) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4384 Decimal('1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4385 >>> ExtendedContext.divide(5, Decimal(5)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4386 Decimal('1') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4387 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4388 a = _convert_other(a, raiseit=True) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4389 r = a.__truediv__(b, context=self) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4390 if r is NotImplemented: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4391 raise TypeError("Unable to convert %s to Decimal" % b) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4392 else: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4393 return r |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4394 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4395 def divide_int(self, a, b): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4396 """Divides two numbers and returns the integer part of the result. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4397 |
| 32482 | 4398 >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3')) |
|
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:
45307
diff
changeset
|
4399 Decimal('0') |
| 32482 | 4400 >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3')) |
|
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:
45307
diff
changeset
|
4401 Decimal('3') |
| 32482 | 4402 >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3')) |
|
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:
45307
diff
changeset
|
4403 Decimal('3') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4404 >>> ExtendedContext.divide_int(10, 3) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4405 Decimal('3') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4406 >>> ExtendedContext.divide_int(Decimal(10), 3) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4407 Decimal('3') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4408 >>> ExtendedContext.divide_int(10, Decimal(3)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4409 Decimal('3') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4410 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4411 a = _convert_other(a, raiseit=True) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4412 r = a.__floordiv__(b, context=self) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4413 if r is NotImplemented: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4414 raise TypeError("Unable to convert %s to Decimal" % b) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4415 else: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4416 return r |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4417 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4418 def divmod(self, a, b): |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4419 """Return (a // b, a % b). |
|
58171
07a749f066a1
Merged revisions 77326 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56973
diff
changeset
|
4420 |
|
07a749f066a1
Merged revisions 77326 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56973
diff
changeset
|
4421 >>> ExtendedContext.divmod(Decimal(8), Decimal(3)) |
|
07a749f066a1
Merged revisions 77326 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56973
diff
changeset
|
4422 (Decimal('2'), Decimal('2')) |
|
07a749f066a1
Merged revisions 77326 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56973
diff
changeset
|
4423 >>> ExtendedContext.divmod(Decimal(8), Decimal(4)) |
|
07a749f066a1
Merged revisions 77326 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56973
diff
changeset
|
4424 (Decimal('2'), Decimal('0')) |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4425 >>> ExtendedContext.divmod(8, 4) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4426 (Decimal('2'), Decimal('0')) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4427 >>> ExtendedContext.divmod(Decimal(8), 4) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4428 (Decimal('2'), Decimal('0')) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4429 >>> ExtendedContext.divmod(8, Decimal(4)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4430 (Decimal('2'), Decimal('0')) |
|
58171
07a749f066a1
Merged revisions 77326 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
56973
diff
changeset
|
4431 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4432 a = _convert_other(a, raiseit=True) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4433 r = a.__divmod__(b, context=self) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4434 if r is NotImplemented: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4435 raise TypeError("Unable to convert %s to Decimal" % b) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4436 else: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4437 return r |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4438 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4439 def exp(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4440 """Returns e ** a. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4441 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4442 >>> c = ExtendedContext.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4443 >>> c.Emin = -999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4444 >>> c.Emax = 999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4445 >>> c.exp(Decimal('-Infinity')) |
|
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:
45307
diff
changeset
|
4446 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4447 >>> c.exp(Decimal('-1')) |
|
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:
45307
diff
changeset
|
4448 Decimal('0.367879441') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4449 >>> c.exp(Decimal('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:
45307
diff
changeset
|
4450 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4451 >>> c.exp(Decimal('1')) |
|
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:
45307
diff
changeset
|
4452 Decimal('2.71828183') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4453 >>> c.exp(Decimal('0.693147181')) |
|
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:
45307
diff
changeset
|
4454 Decimal('2.00000000') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4455 >>> c.exp(Decimal('+Infinity')) |
|
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:
45307
diff
changeset
|
4456 Decimal('Infinity') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4457 >>> c.exp(10) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4458 Decimal('22026.4658') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4459 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4460 a =_convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4461 return a.exp(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4462 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4463 def fma(self, a, b, c): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4464 """Returns a multiplied by b, plus c. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4465 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4466 The first two operands are multiplied together, using multiply, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4467 the third operand is then added to the result of that |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4468 multiplication, using add, all with only one final rounding. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4469 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4470 >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7')) |
|
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:
45307
diff
changeset
|
4471 Decimal('22') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4472 >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7')) |
|
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:
45307
diff
changeset
|
4473 Decimal('-8') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4474 >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578')) |
|
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:
45307
diff
changeset
|
4475 Decimal('1.38435736E+12') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4476 >>> ExtendedContext.fma(1, 3, 4) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4477 Decimal('7') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4478 >>> ExtendedContext.fma(1, Decimal(3), 4) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4479 Decimal('7') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4480 >>> ExtendedContext.fma(1, 3, Decimal(4)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4481 Decimal('7') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4482 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4483 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4484 return a.fma(b, c, context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4485 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4486 def is_canonical(self, a): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4487 """Return True if the operand is canonical; otherwise return False. |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4488 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4489 Currently, the encoding of a Decimal instance is always |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4490 canonical, so this method returns True for any Decimal. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4491 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4492 >>> ExtendedContext.is_canonical(Decimal('2.50')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4493 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4494 """ |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4495 if not isinstance(a, Decimal): |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
4496 raise TypeError("is_canonical requires a Decimal as an argument.") |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4497 return a.is_canonical() |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4498 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4499 def is_finite(self, a): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4500 """Return True if the operand is finite; otherwise return False. |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4501 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4502 A Decimal instance is considered finite if it is neither |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4503 infinite nor a NaN. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4504 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4505 >>> ExtendedContext.is_finite(Decimal('2.50')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4506 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4507 >>> ExtendedContext.is_finite(Decimal('-0.3')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4508 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4509 >>> ExtendedContext.is_finite(Decimal('0')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4510 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4511 >>> ExtendedContext.is_finite(Decimal('Inf')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4512 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4513 >>> ExtendedContext.is_finite(Decimal('NaN')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4514 False |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4515 >>> ExtendedContext.is_finite(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4516 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4517 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4518 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4519 return a.is_finite() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4520 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4521 def is_infinite(self, a): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4522 """Return True if the operand is infinite; otherwise return False. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4523 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4524 >>> ExtendedContext.is_infinite(Decimal('2.50')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4525 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4526 >>> ExtendedContext.is_infinite(Decimal('-Inf')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4527 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4528 >>> ExtendedContext.is_infinite(Decimal('NaN')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4529 False |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4530 >>> ExtendedContext.is_infinite(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4531 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4532 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4533 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4534 return a.is_infinite() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4535 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4536 def is_nan(self, a): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4537 """Return True if the operand is a qNaN or sNaN; |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4538 otherwise return False. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4539 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4540 >>> ExtendedContext.is_nan(Decimal('2.50')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4541 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4542 >>> ExtendedContext.is_nan(Decimal('NaN')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4543 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4544 >>> ExtendedContext.is_nan(Decimal('-sNaN')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4545 True |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4546 >>> ExtendedContext.is_nan(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4547 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4548 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4549 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4550 return a.is_nan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4551 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4552 def is_normal(self, a): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4553 """Return True if the operand is a normal number; |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4554 otherwise return False. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4555 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4556 >>> c = ExtendedContext.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4557 >>> c.Emin = -999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4558 >>> c.Emax = 999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4559 >>> c.is_normal(Decimal('2.50')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4560 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4561 >>> c.is_normal(Decimal('0.1E-999')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4562 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4563 >>> c.is_normal(Decimal('0.00')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4564 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4565 >>> c.is_normal(Decimal('-Inf')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4566 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4567 >>> c.is_normal(Decimal('NaN')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4568 False |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4569 >>> c.is_normal(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4570 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4571 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4572 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4573 return a.is_normal(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4574 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4575 def is_qnan(self, a): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4576 """Return True if the operand is a quiet NaN; otherwise return False. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4577 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4578 >>> ExtendedContext.is_qnan(Decimal('2.50')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4579 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4580 >>> ExtendedContext.is_qnan(Decimal('NaN')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4581 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4582 >>> ExtendedContext.is_qnan(Decimal('sNaN')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4583 False |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4584 >>> ExtendedContext.is_qnan(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4585 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4586 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4587 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4588 return a.is_qnan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4589 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4590 def is_signed(self, a): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4591 """Return True if the operand is negative; otherwise return False. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4592 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4593 >>> ExtendedContext.is_signed(Decimal('2.50')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4594 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4595 >>> ExtendedContext.is_signed(Decimal('-12')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4596 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4597 >>> ExtendedContext.is_signed(Decimal('-0')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4598 True |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4599 >>> ExtendedContext.is_signed(8) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4600 False |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4601 >>> ExtendedContext.is_signed(-8) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4602 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4603 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4604 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4605 return a.is_signed() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4606 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4607 def is_snan(self, a): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4608 """Return True if the operand is a signaling NaN; |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4609 otherwise return False. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4610 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4611 >>> ExtendedContext.is_snan(Decimal('2.50')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4612 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4613 >>> ExtendedContext.is_snan(Decimal('NaN')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4614 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4615 >>> ExtendedContext.is_snan(Decimal('sNaN')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4616 True |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4617 >>> ExtendedContext.is_snan(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4618 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4619 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4620 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4621 return a.is_snan() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4622 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4623 def is_subnormal(self, a): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4624 """Return True if the operand is subnormal; otherwise return False. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4625 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4626 >>> c = ExtendedContext.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4627 >>> c.Emin = -999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4628 >>> c.Emax = 999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4629 >>> c.is_subnormal(Decimal('2.50')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4630 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4631 >>> c.is_subnormal(Decimal('0.1E-999')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4632 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4633 >>> c.is_subnormal(Decimal('0.00')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4634 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4635 >>> c.is_subnormal(Decimal('-Inf')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4636 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4637 >>> c.is_subnormal(Decimal('NaN')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4638 False |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4639 >>> c.is_subnormal(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4640 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4641 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4642 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4643 return a.is_subnormal(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4644 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4645 def is_zero(self, a): |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4646 """Return True if the operand is a zero; otherwise return False. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4647 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4648 >>> ExtendedContext.is_zero(Decimal('0')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4649 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4650 >>> ExtendedContext.is_zero(Decimal('2.50')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4651 False |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4652 >>> ExtendedContext.is_zero(Decimal('-0E+2')) |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
4653 True |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4654 >>> ExtendedContext.is_zero(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4655 False |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4656 >>> ExtendedContext.is_zero(0) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4657 True |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4658 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4659 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4660 return a.is_zero() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4661 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4662 def ln(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4663 """Returns the natural (base e) logarithm of the operand. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4664 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4665 >>> c = ExtendedContext.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4666 >>> c.Emin = -999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4667 >>> c.Emax = 999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4668 >>> c.ln(Decimal('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:
45307
diff
changeset
|
4669 Decimal('-Infinity') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4670 >>> c.ln(Decimal('1.000')) |
|
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:
45307
diff
changeset
|
4671 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4672 >>> c.ln(Decimal('2.71828183')) |
|
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:
45307
diff
changeset
|
4673 Decimal('1.00000000') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4674 >>> c.ln(Decimal('10')) |
|
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:
45307
diff
changeset
|
4675 Decimal('2.30258509') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4676 >>> c.ln(Decimal('+Infinity')) |
|
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:
45307
diff
changeset
|
4677 Decimal('Infinity') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4678 >>> c.ln(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4679 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4680 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4681 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4682 return a.ln(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4683 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4684 def log10(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4685 """Returns the base 10 logarithm of the operand. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4686 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4687 >>> c = ExtendedContext.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4688 >>> c.Emin = -999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4689 >>> c.Emax = 999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4690 >>> c.log10(Decimal('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:
45307
diff
changeset
|
4691 Decimal('-Infinity') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4692 >>> c.log10(Decimal('0.001')) |
|
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:
45307
diff
changeset
|
4693 Decimal('-3') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4694 >>> c.log10(Decimal('1.000')) |
|
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:
45307
diff
changeset
|
4695 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4696 >>> c.log10(Decimal('2')) |
|
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:
45307
diff
changeset
|
4697 Decimal('0.301029996') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4698 >>> c.log10(Decimal('10')) |
|
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:
45307
diff
changeset
|
4699 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4700 >>> c.log10(Decimal('70')) |
|
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:
45307
diff
changeset
|
4701 Decimal('1.84509804') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4702 >>> c.log10(Decimal('+Infinity')) |
|
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:
45307
diff
changeset
|
4703 Decimal('Infinity') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4704 >>> c.log10(0) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4705 Decimal('-Infinity') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4706 >>> c.log10(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4707 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4708 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4709 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4710 return a.log10(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4711 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4712 def logb(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4713 """ Returns the exponent of the magnitude of the operand's MSD. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4714 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4715 The result is the integer which is the exponent of the magnitude |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4716 of the most significant digit of the operand (as though the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4717 operand were truncated to a single digit while maintaining the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4718 value of that digit and without limiting the resulting exponent). |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4719 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4720 >>> ExtendedContext.logb(Decimal('250')) |
|
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:
45307
diff
changeset
|
4721 Decimal('2') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4722 >>> ExtendedContext.logb(Decimal('2.50')) |
|
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:
45307
diff
changeset
|
4723 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4724 >>> ExtendedContext.logb(Decimal('0.03')) |
|
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:
45307
diff
changeset
|
4725 Decimal('-2') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4726 >>> ExtendedContext.logb(Decimal('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:
45307
diff
changeset
|
4727 Decimal('-Infinity') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4728 >>> ExtendedContext.logb(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4729 Decimal('0') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4730 >>> ExtendedContext.logb(10) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4731 Decimal('1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4732 >>> ExtendedContext.logb(100) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4733 Decimal('2') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4734 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4735 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4736 return a.logb(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4737 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4738 def logical_and(self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4739 """Applies the logical operation 'and' between each operand's digits. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4740 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4741 The operands must be both logical numbers. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4742 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4743 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('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:
45307
diff
changeset
|
4744 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4745 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1')) |
|
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:
45307
diff
changeset
|
4746 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4747 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('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:
45307
diff
changeset
|
4748 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4749 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1')) |
|
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:
45307
diff
changeset
|
4750 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4751 >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010')) |
|
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:
45307
diff
changeset
|
4752 Decimal('1000') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4753 >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10')) |
|
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:
45307
diff
changeset
|
4754 Decimal('10') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4755 >>> ExtendedContext.logical_and(110, 1101) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4756 Decimal('100') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4757 >>> ExtendedContext.logical_and(Decimal(110), 1101) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4758 Decimal('100') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4759 >>> ExtendedContext.logical_and(110, Decimal(1101)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4760 Decimal('100') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4761 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4762 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4763 return a.logical_and(b, context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4764 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4765 def logical_invert(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4766 """Invert all the digits in the operand. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4767 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4768 The operand must be a logical number. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4769 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4770 >>> ExtendedContext.logical_invert(Decimal('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:
45307
diff
changeset
|
4771 Decimal('111111111') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4772 >>> ExtendedContext.logical_invert(Decimal('1')) |
|
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:
45307
diff
changeset
|
4773 Decimal('111111110') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4774 >>> ExtendedContext.logical_invert(Decimal('111111111')) |
|
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:
45307
diff
changeset
|
4775 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4776 >>> ExtendedContext.logical_invert(Decimal('101010101')) |
|
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:
45307
diff
changeset
|
4777 Decimal('10101010') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4778 >>> ExtendedContext.logical_invert(1101) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4779 Decimal('111110010') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4780 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4781 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4782 return a.logical_invert(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4783 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4784 def logical_or(self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4785 """Applies the logical operation 'or' between each operand's digits. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4786 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4787 The operands must be both logical numbers. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4788 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4789 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('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:
45307
diff
changeset
|
4790 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4791 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1')) |
|
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:
45307
diff
changeset
|
4792 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4793 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('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:
45307
diff
changeset
|
4794 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4795 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1')) |
|
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:
45307
diff
changeset
|
4796 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4797 >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010')) |
|
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:
45307
diff
changeset
|
4798 Decimal('1110') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4799 >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10')) |
|
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:
45307
diff
changeset
|
4800 Decimal('1110') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4801 >>> ExtendedContext.logical_or(110, 1101) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4802 Decimal('1111') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4803 >>> ExtendedContext.logical_or(Decimal(110), 1101) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4804 Decimal('1111') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4805 >>> ExtendedContext.logical_or(110, Decimal(1101)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4806 Decimal('1111') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4807 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4808 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4809 return a.logical_or(b, context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4810 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4811 def logical_xor(self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4812 """Applies the logical operation 'xor' between each operand's digits. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4813 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4814 The operands must be both logical numbers. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4815 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4816 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('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:
45307
diff
changeset
|
4817 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4818 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1')) |
|
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:
45307
diff
changeset
|
4819 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4820 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('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:
45307
diff
changeset
|
4821 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4822 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1')) |
|
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:
45307
diff
changeset
|
4823 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4824 >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010')) |
|
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:
45307
diff
changeset
|
4825 Decimal('110') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4826 >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10')) |
|
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:
45307
diff
changeset
|
4827 Decimal('1101') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4828 >>> ExtendedContext.logical_xor(110, 1101) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4829 Decimal('1011') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4830 >>> ExtendedContext.logical_xor(Decimal(110), 1101) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4831 Decimal('1011') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4832 >>> ExtendedContext.logical_xor(110, Decimal(1101)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4833 Decimal('1011') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4834 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4835 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4836 return a.logical_xor(b, context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4837 |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4838 def max(self, a, b): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4839 """max compares two values numerically and returns the maximum. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4840 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4841 If either operand is a NaN then the general rules apply. |
|
44742
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44654
diff
changeset
|
4842 Otherwise, the operands are compared as though by the compare |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
4843 operation. If they are numerically equal then the left-hand operand |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
4844 is chosen as the result. Otherwise the maximum (closer to positive |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4845 infinity) of the two operands is chosen as the result. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4846 |
| 32482 | 4847 >>> ExtendedContext.max(Decimal('3'), Decimal('2')) |
|
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:
45307
diff
changeset
|
4848 Decimal('3') |
| 32482 | 4849 >>> ExtendedContext.max(Decimal('-10'), Decimal('3')) |
|
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:
45307
diff
changeset
|
4850 Decimal('3') |
| 32482 | 4851 >>> ExtendedContext.max(Decimal('1.0'), Decimal('1')) |
|
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:
45307
diff
changeset
|
4852 Decimal('1') |
|
33157
b2f427db228b
Revise max() and min() to comply with the 8/2/2004 update to the specification
Raymond Hettinger <python@rcn.com>
parents:
33044
diff
changeset
|
4853 >>> ExtendedContext.max(Decimal('7'), Decimal('NaN')) |
|
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:
45307
diff
changeset
|
4854 Decimal('7') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4855 >>> ExtendedContext.max(1, 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4856 Decimal('2') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4857 >>> ExtendedContext.max(Decimal(1), 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4858 Decimal('2') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4859 >>> ExtendedContext.max(1, Decimal(2)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4860 Decimal('2') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4861 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4862 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4863 return a.max(b, context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4864 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4865 def max_mag(self, a, b): |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4866 """Compares the values numerically with their sign ignored. |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4867 |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4868 >>> ExtendedContext.max_mag(Decimal('7'), Decimal('NaN')) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4869 Decimal('7') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4870 >>> ExtendedContext.max_mag(Decimal('7'), Decimal('-10')) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4871 Decimal('-10') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4872 >>> ExtendedContext.max_mag(1, -2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4873 Decimal('-2') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4874 >>> ExtendedContext.max_mag(Decimal(1), -2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4875 Decimal('-2') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4876 >>> ExtendedContext.max_mag(1, Decimal(-2)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4877 Decimal('-2') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4878 """ |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4879 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4880 return a.max_mag(b, context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4881 |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4882 def min(self, a, b): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4883 """min compares two values numerically and returns the minimum. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4884 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4885 If either operand is a NaN then the general rules apply. |
|
44742
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44654
diff
changeset
|
4886 Otherwise, the operands are compared as though by the compare |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
4887 operation. If they are numerically equal then the left-hand operand |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
4888 is chosen as the result. Otherwise the minimum (closer to negative |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4889 infinity) of the two operands is chosen as the result. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4890 |
| 32482 | 4891 >>> ExtendedContext.min(Decimal('3'), Decimal('2')) |
|
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:
45307
diff
changeset
|
4892 Decimal('2') |
| 32482 | 4893 >>> ExtendedContext.min(Decimal('-10'), Decimal('3')) |
|
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:
45307
diff
changeset
|
4894 Decimal('-10') |
| 32482 | 4895 >>> ExtendedContext.min(Decimal('1.0'), Decimal('1')) |
|
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:
45307
diff
changeset
|
4896 Decimal('1.0') |
|
33157
b2f427db228b
Revise max() and min() to comply with the 8/2/2004 update to the specification
Raymond Hettinger <python@rcn.com>
parents:
33044
diff
changeset
|
4897 >>> ExtendedContext.min(Decimal('7'), Decimal('NaN')) |
|
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:
45307
diff
changeset
|
4898 Decimal('7') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4899 >>> ExtendedContext.min(1, 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4900 Decimal('1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4901 >>> ExtendedContext.min(Decimal(1), 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4902 Decimal('1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4903 >>> ExtendedContext.min(1, Decimal(29)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4904 Decimal('1') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4905 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4906 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4907 return a.min(b, context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4908 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4909 def min_mag(self, a, b): |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4910 """Compares the values numerically with their sign ignored. |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4911 |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4912 >>> ExtendedContext.min_mag(Decimal('3'), Decimal('-2')) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4913 Decimal('-2') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4914 >>> ExtendedContext.min_mag(Decimal('-3'), Decimal('NaN')) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4915 Decimal('-3') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4916 >>> ExtendedContext.min_mag(1, -2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4917 Decimal('1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4918 >>> ExtendedContext.min_mag(Decimal(1), -2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4919 Decimal('1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4920 >>> ExtendedContext.min_mag(1, Decimal(-2)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4921 Decimal('1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4922 """ |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4923 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4924 return a.min_mag(b, context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4925 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4926 def minus(self, a): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4927 """Minus corresponds to unary prefix minus in Python. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4928 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4929 The operation is evaluated using the same rules as subtract; the |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4930 operation minus(a) is calculated as subtract('0', a) where the '0' |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4931 has the same exponent as the operand. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4932 |
| 32482 | 4933 >>> ExtendedContext.minus(Decimal('1.3')) |
|
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:
45307
diff
changeset
|
4934 Decimal('-1.3') |
| 32482 | 4935 >>> ExtendedContext.minus(Decimal('-1.3')) |
|
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:
45307
diff
changeset
|
4936 Decimal('1.3') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4937 >>> ExtendedContext.minus(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4938 Decimal('-1') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4939 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4940 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4941 return a.__neg__(context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4942 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4943 def multiply(self, a, b): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4944 """multiply multiplies two operands. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4945 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4946 If either operand is a special value then the general rules apply. |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4947 Otherwise, the operands are multiplied together |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4948 ('long multiplication'), resulting in a number which may be as long as |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4949 the sum of the lengths of the two operands. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4950 |
| 32482 | 4951 >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3')) |
|
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:
45307
diff
changeset
|
4952 Decimal('3.60') |
| 32482 | 4953 >>> ExtendedContext.multiply(Decimal('7'), Decimal('3')) |
|
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:
45307
diff
changeset
|
4954 Decimal('21') |
| 32482 | 4955 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8')) |
|
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:
45307
diff
changeset
|
4956 Decimal('0.72') |
| 32482 | 4957 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-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:
45307
diff
changeset
|
4958 Decimal('-0.0') |
| 32482 | 4959 >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321')) |
|
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:
45307
diff
changeset
|
4960 Decimal('4.28135971E+11') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4961 >>> ExtendedContext.multiply(7, 7) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4962 Decimal('49') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4963 >>> ExtendedContext.multiply(Decimal(7), 7) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4964 Decimal('49') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4965 >>> ExtendedContext.multiply(7, Decimal(7)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4966 Decimal('49') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4967 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4968 a = _convert_other(a, raiseit=True) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4969 r = a.__mul__(b, context=self) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4970 if r is NotImplemented: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4971 raise TypeError("Unable to convert %s to Decimal" % b) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4972 else: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4973 return r |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
4974 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4975 def next_minus(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4976 """Returns the largest representable number smaller than a. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4977 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4978 >>> c = ExtendedContext.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4979 >>> c.Emin = -999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4980 >>> c.Emax = 999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4981 >>> ExtendedContext.next_minus(Decimal('1')) |
|
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:
45307
diff
changeset
|
4982 Decimal('0.999999999') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4983 >>> c.next_minus(Decimal('1E-1007')) |
|
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:
45307
diff
changeset
|
4984 Decimal('0E-1007') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4985 >>> ExtendedContext.next_minus(Decimal('-1.00000003')) |
|
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:
45307
diff
changeset
|
4986 Decimal('-1.00000004') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4987 >>> c.next_minus(Decimal('Infinity')) |
|
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:
45307
diff
changeset
|
4988 Decimal('9.99999999E+999') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4989 >>> c.next_minus(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4990 Decimal('0.999999999') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4991 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
4992 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4993 return a.next_minus(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4994 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4995 def next_plus(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4996 """Returns the smallest representable number larger than a. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4997 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4998 >>> c = ExtendedContext.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
4999 >>> c.Emin = -999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5000 >>> c.Emax = 999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5001 >>> ExtendedContext.next_plus(Decimal('1')) |
|
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:
45307
diff
changeset
|
5002 Decimal('1.00000001') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5003 >>> c.next_plus(Decimal('-1E-1007')) |
|
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:
45307
diff
changeset
|
5004 Decimal('-0E-1007') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5005 >>> ExtendedContext.next_plus(Decimal('-1.00000003')) |
|
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:
45307
diff
changeset
|
5006 Decimal('-1.00000002') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5007 >>> c.next_plus(Decimal('-Infinity')) |
|
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:
45307
diff
changeset
|
5008 Decimal('-9.99999999E+999') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5009 >>> c.next_plus(1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5010 Decimal('1.00000001') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5011 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5012 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5013 return a.next_plus(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5014 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5015 def next_toward(self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5016 """Returns the number closest to a, in direction towards b. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5017 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5018 The result is the closest representable number from the first |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5019 operand (but not the first operand) that is in the direction |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5020 towards the second operand, unless the operands have the same |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5021 value. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5022 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5023 >>> c = ExtendedContext.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5024 >>> c.Emin = -999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5025 >>> c.Emax = 999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5026 >>> c.next_toward(Decimal('1'), Decimal('2')) |
|
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:
45307
diff
changeset
|
5027 Decimal('1.00000001') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5028 >>> c.next_toward(Decimal('-1E-1007'), Decimal('1')) |
|
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:
45307
diff
changeset
|
5029 Decimal('-0E-1007') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5030 >>> c.next_toward(Decimal('-1.00000003'), Decimal('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:
45307
diff
changeset
|
5031 Decimal('-1.00000002') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5032 >>> c.next_toward(Decimal('1'), Decimal('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:
45307
diff
changeset
|
5033 Decimal('0.999999999') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5034 >>> c.next_toward(Decimal('1E-1007'), Decimal('-100')) |
|
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:
45307
diff
changeset
|
5035 Decimal('0E-1007') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5036 >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10')) |
|
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:
45307
diff
changeset
|
5037 Decimal('-1.00000004') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5038 >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000')) |
|
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:
45307
diff
changeset
|
5039 Decimal('-0.00') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5040 >>> c.next_toward(0, 1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5041 Decimal('1E-1007') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5042 >>> c.next_toward(Decimal(0), 1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5043 Decimal('1E-1007') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5044 >>> c.next_toward(0, Decimal(1)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5045 Decimal('1E-1007') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5046 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5047 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5048 return a.next_toward(b, context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5049 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5050 def normalize(self, a): |
| 32496 | 5051 """normalize reduces an operand to its simplest form. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5052 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5053 Essentially a plus operation with all trailing zeros removed from the |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5054 result. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5055 |
| 32482 | 5056 >>> ExtendedContext.normalize(Decimal('2.1')) |
|
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:
45307
diff
changeset
|
5057 Decimal('2.1') |
| 32482 | 5058 >>> ExtendedContext.normalize(Decimal('-2.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:
45307
diff
changeset
|
5059 Decimal('-2') |
| 32482 | 5060 >>> ExtendedContext.normalize(Decimal('1.200')) |
|
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:
45307
diff
changeset
|
5061 Decimal('1.2') |
| 32482 | 5062 >>> ExtendedContext.normalize(Decimal('-120')) |
|
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:
45307
diff
changeset
|
5063 Decimal('-1.2E+2') |
| 32482 | 5064 >>> ExtendedContext.normalize(Decimal('120.00')) |
|
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:
45307
diff
changeset
|
5065 Decimal('1.2E+2') |
| 32482 | 5066 >>> ExtendedContext.normalize(Decimal('0.00')) |
|
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:
45307
diff
changeset
|
5067 Decimal('0') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5068 >>> ExtendedContext.normalize(6) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5069 Decimal('6') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5070 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5071 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5072 return a.normalize(context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5073 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5074 def number_class(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5075 """Returns an indication of the class of the operand. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5076 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5077 The class is one of the following strings: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5078 -sNaN |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5079 -NaN |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5080 -Infinity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5081 -Normal |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5082 -Subnormal |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5083 -Zero |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5084 +Zero |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5085 +Subnormal |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5086 +Normal |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5087 +Infinity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5088 |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
5089 >>> c = ExtendedContext.copy() |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5090 >>> c.Emin = -999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5091 >>> c.Emax = 999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5092 >>> c.number_class(Decimal('Infinity')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5093 '+Infinity' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5094 >>> c.number_class(Decimal('1E-10')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5095 '+Normal' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5096 >>> c.number_class(Decimal('2.50')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5097 '+Normal' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5098 >>> c.number_class(Decimal('0.1E-999')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5099 '+Subnormal' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5100 >>> c.number_class(Decimal('0')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5101 '+Zero' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5102 >>> c.number_class(Decimal('-0')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5103 '-Zero' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5104 >>> c.number_class(Decimal('-0.1E-999')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5105 '-Subnormal' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5106 >>> c.number_class(Decimal('-1E-10')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5107 '-Normal' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5108 >>> c.number_class(Decimal('-2.50')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5109 '-Normal' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5110 >>> c.number_class(Decimal('-Infinity')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5111 '-Infinity' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5112 >>> c.number_class(Decimal('NaN')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5113 'NaN' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5114 >>> c.number_class(Decimal('-NaN')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5115 'NaN' |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5116 >>> c.number_class(Decimal('sNaN')) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5117 'sNaN' |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5118 >>> c.number_class(123) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5119 '+Normal' |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5120 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5121 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5122 return a.number_class(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5123 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5124 def plus(self, a): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5125 """Plus corresponds to unary prefix plus in Python. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5126 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5127 The operation is evaluated using the same rules as add; the |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5128 operation plus(a) is calculated as add('0', a) where the '0' |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5129 has the same exponent as the operand. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5130 |
| 32482 | 5131 >>> ExtendedContext.plus(Decimal('1.3')) |
|
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:
45307
diff
changeset
|
5132 Decimal('1.3') |
| 32482 | 5133 >>> ExtendedContext.plus(Decimal('-1.3')) |
|
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:
45307
diff
changeset
|
5134 Decimal('-1.3') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5135 >>> ExtendedContext.plus(-1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5136 Decimal('-1') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5137 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5138 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5139 return a.__pos__(context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5140 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5141 def power(self, a, b, modulo=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5142 """Raises a to the power of b, to modulo if given. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5143 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5144 With two arguments, compute a**b. If a is negative then b |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5145 must be integral. The result will be inexact unless b is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5146 integral and the result is finite and can be expressed exactly |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5147 in 'precision' digits. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5148 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5149 With three arguments, compute (a**b) % modulo. For the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5150 three argument form, the following restrictions on the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5151 arguments hold: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5152 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5153 - all three arguments must be integral |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5154 - b must be nonnegative |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5155 - at least one of a or b must be nonzero |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5156 - modulo must be nonzero and have at most 'precision' digits |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5157 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5158 The result of pow(a, b, modulo) is identical to the result |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5159 that would be obtained by computing (a**b) % modulo with |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5160 unbounded precision, but is computed more efficiently. It is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5161 always exact. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5162 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5163 >>> c = ExtendedContext.copy() |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5164 >>> c.Emin = -999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5165 >>> c.Emax = 999 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5166 >>> c.power(Decimal('2'), Decimal('3')) |
|
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:
45307
diff
changeset
|
5167 Decimal('8') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5168 >>> c.power(Decimal('-2'), Decimal('3')) |
|
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:
45307
diff
changeset
|
5169 Decimal('-8') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5170 >>> c.power(Decimal('2'), Decimal('-3')) |
|
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:
45307
diff
changeset
|
5171 Decimal('0.125') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5172 >>> c.power(Decimal('1.7'), Decimal('8')) |
|
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:
45307
diff
changeset
|
5173 Decimal('69.7575744') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5174 >>> c.power(Decimal('10'), Decimal('0.301029996')) |
|
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:
45307
diff
changeset
|
5175 Decimal('2.00000000') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5176 >>> c.power(Decimal('Infinity'), Decimal('-1')) |
|
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:
45307
diff
changeset
|
5177 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5178 >>> c.power(Decimal('Infinity'), Decimal('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:
45307
diff
changeset
|
5179 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5180 >>> c.power(Decimal('Infinity'), Decimal('1')) |
|
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:
45307
diff
changeset
|
5181 Decimal('Infinity') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5182 >>> c.power(Decimal('-Infinity'), Decimal('-1')) |
|
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:
45307
diff
changeset
|
5183 Decimal('-0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5184 >>> c.power(Decimal('-Infinity'), Decimal('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:
45307
diff
changeset
|
5185 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5186 >>> c.power(Decimal('-Infinity'), Decimal('1')) |
|
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:
45307
diff
changeset
|
5187 Decimal('-Infinity') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5188 >>> c.power(Decimal('-Infinity'), Decimal('2')) |
|
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:
45307
diff
changeset
|
5189 Decimal('Infinity') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5190 >>> c.power(Decimal('0'), Decimal('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:
45307
diff
changeset
|
5191 Decimal('NaN') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5192 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5193 >>> c.power(Decimal('3'), Decimal('7'), Decimal('16')) |
|
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:
45307
diff
changeset
|
5194 Decimal('11') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5195 >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16')) |
|
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:
45307
diff
changeset
|
5196 Decimal('-11') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5197 >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16')) |
|
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:
45307
diff
changeset
|
5198 Decimal('1') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5199 >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16')) |
|
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:
45307
diff
changeset
|
5200 Decimal('11') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5201 >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789')) |
|
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:
45307
diff
changeset
|
5202 Decimal('11729830') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5203 >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729')) |
|
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:
45307
diff
changeset
|
5204 Decimal('-0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5205 >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537')) |
|
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:
45307
diff
changeset
|
5206 Decimal('1') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5207 >>> ExtendedContext.power(7, 7) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5208 Decimal('823543') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5209 >>> ExtendedContext.power(Decimal(7), 7) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5210 Decimal('823543') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5211 >>> ExtendedContext.power(7, Decimal(7), 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5212 Decimal('1') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5213 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5214 a = _convert_other(a, raiseit=True) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5215 r = a.__pow__(b, modulo, context=self) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5216 if r is NotImplemented: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5217 raise TypeError("Unable to convert %s to Decimal" % b) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5218 else: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5219 return r |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5220 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5221 def quantize(self, a, b): |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5222 """Returns a value equal to 'a' (rounded), having the exponent of 'b'. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5223 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5224 The coefficient of the result is derived from that of the left-hand |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5225 operand. It may be rounded using the current rounding setting (if the |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5226 exponent is being increased), multiplied by a positive power of ten (if |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5227 the exponent is being decreased), or is unchanged (if the exponent is |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5228 already equal to that of the right-hand operand). |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5229 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5230 Unlike other operations, if the length of the coefficient after the |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5231 quantize operation would be greater than precision then an Invalid |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5232 operation condition is raised. This guarantees that, unless there is |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5233 an error condition, the exponent of the result of a quantize is always |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5234 equal to that of the right-hand operand. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5235 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5236 Also unlike other operations, quantize will never raise Underflow, even |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5237 if the result is subnormal and inexact. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5238 |
| 32482 | 5239 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001')) |
|
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:
45307
diff
changeset
|
5240 Decimal('2.170') |
| 32482 | 5241 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01')) |
|
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:
45307
diff
changeset
|
5242 Decimal('2.17') |
| 32482 | 5243 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1')) |
|
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:
45307
diff
changeset
|
5244 Decimal('2.2') |
| 32482 | 5245 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+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:
45307
diff
changeset
|
5246 Decimal('2') |
| 32482 | 5247 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1')) |
|
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:
45307
diff
changeset
|
5248 Decimal('0E+1') |
| 32482 | 5249 >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity')) |
|
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:
45307
diff
changeset
|
5250 Decimal('-Infinity') |
| 32482 | 5251 >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity')) |
|
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:
45307
diff
changeset
|
5252 Decimal('NaN') |
| 32482 | 5253 >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1')) |
|
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:
45307
diff
changeset
|
5254 Decimal('-0') |
| 32482 | 5255 >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5')) |
|
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:
45307
diff
changeset
|
5256 Decimal('-0E+5') |
| 32482 | 5257 >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2')) |
|
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:
45307
diff
changeset
|
5258 Decimal('NaN') |
| 32482 | 5259 >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2')) |
|
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:
45307
diff
changeset
|
5260 Decimal('NaN') |
| 32482 | 5261 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1')) |
|
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:
45307
diff
changeset
|
5262 Decimal('217.0') |
| 32482 | 5263 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-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:
45307
diff
changeset
|
5264 Decimal('217') |
| 32482 | 5265 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1')) |
|
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:
45307
diff
changeset
|
5266 Decimal('2.2E+2') |
| 32482 | 5267 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2')) |
|
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:
45307
diff
changeset
|
5268 Decimal('2E+2') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5269 >>> ExtendedContext.quantize(1, 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5270 Decimal('1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5271 >>> ExtendedContext.quantize(Decimal(1), 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5272 Decimal('1') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5273 >>> ExtendedContext.quantize(1, Decimal(2)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5274 Decimal('1') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5275 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5276 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5277 return a.quantize(b, context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5278 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5279 def radix(self): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5280 """Just returns 10, as this is Decimal, :) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5281 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5282 >>> ExtendedContext.radix() |
|
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:
45307
diff
changeset
|
5283 Decimal('10') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5284 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5285 return Decimal(10) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5286 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5287 def remainder(self, a, b): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5288 """Returns the remainder from integer division. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5289 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5290 The result is the residue of the dividend after the operation of |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5291 calculating integer division as described for divide-integer, rounded |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5292 to precision digits if necessary. The sign of the result, if |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5293 non-zero, is the same as that of the original dividend. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5294 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5295 This operation will fail under the same conditions as integer division |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5296 (that is, if integer division on the same two operands would fail, the |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5297 remainder cannot be calculated). |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5298 |
| 32482 | 5299 >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3')) |
|
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:
45307
diff
changeset
|
5300 Decimal('2.1') |
| 32482 | 5301 >>> ExtendedContext.remainder(Decimal('10'), Decimal('3')) |
|
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:
45307
diff
changeset
|
5302 Decimal('1') |
| 32482 | 5303 >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3')) |
|
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:
45307
diff
changeset
|
5304 Decimal('-1') |
| 32482 | 5305 >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1')) |
|
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:
45307
diff
changeset
|
5306 Decimal('0.2') |
| 32482 | 5307 >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3')) |
|
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:
45307
diff
changeset
|
5308 Decimal('0.1') |
| 32482 | 5309 >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3')) |
|
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:
45307
diff
changeset
|
5310 Decimal('1.0') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5311 >>> ExtendedContext.remainder(22, 6) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5312 Decimal('4') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5313 >>> ExtendedContext.remainder(Decimal(22), 6) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5314 Decimal('4') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5315 >>> ExtendedContext.remainder(22, Decimal(6)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5316 Decimal('4') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5317 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5318 a = _convert_other(a, raiseit=True) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5319 r = a.__mod__(b, context=self) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5320 if r is NotImplemented: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5321 raise TypeError("Unable to convert %s to Decimal" % b) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5322 else: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5323 return r |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5324 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5325 def remainder_near(self, a, b): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5326 """Returns to be "a - b * n", where n is the integer nearest the exact |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5327 value of "x / b" (if two integers are equally near then the even one |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5328 is chosen). If the result is equal to 0 then its sign will be the |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5329 sign of a. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5330 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5331 This operation will fail under the same conditions as integer division |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5332 (that is, if integer division on the same two operands would fail, the |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5333 remainder cannot be calculated). |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5334 |
| 32482 | 5335 >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3')) |
|
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:
45307
diff
changeset
|
5336 Decimal('-0.9') |
| 32482 | 5337 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6')) |
|
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:
45307
diff
changeset
|
5338 Decimal('-2') |
| 32482 | 5339 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3')) |
|
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:
45307
diff
changeset
|
5340 Decimal('1') |
| 32482 | 5341 >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3')) |
|
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:
45307
diff
changeset
|
5342 Decimal('-1') |
| 32482 | 5343 >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1')) |
|
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:
45307
diff
changeset
|
5344 Decimal('0.2') |
| 32482 | 5345 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3')) |
|
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:
45307
diff
changeset
|
5346 Decimal('0.1') |
| 32482 | 5347 >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3')) |
|
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:
45307
diff
changeset
|
5348 Decimal('-0.3') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5349 >>> ExtendedContext.remainder_near(3, 11) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5350 Decimal('3') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5351 >>> ExtendedContext.remainder_near(Decimal(3), 11) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5352 Decimal('3') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5353 >>> ExtendedContext.remainder_near(3, Decimal(11)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5354 Decimal('3') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5355 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5356 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5357 return a.remainder_near(b, context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5358 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5359 def rotate(self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5360 """Returns a rotated copy of a, b times. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5361 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5362 The coefficient of the result is a rotated copy of the digits in |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5363 the coefficient of the first operand. The number of places of |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5364 rotation is taken from the absolute value of the second operand, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5365 with the rotation being to the left if the second operand is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5366 positive or to the right otherwise. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5367 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5368 >>> ExtendedContext.rotate(Decimal('34'), Decimal('8')) |
|
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:
45307
diff
changeset
|
5369 Decimal('400000003') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5370 >>> ExtendedContext.rotate(Decimal('12'), Decimal('9')) |
|
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:
45307
diff
changeset
|
5371 Decimal('12') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5372 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2')) |
|
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:
45307
diff
changeset
|
5373 Decimal('891234567') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5374 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('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:
45307
diff
changeset
|
5375 Decimal('123456789') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5376 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2')) |
|
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:
45307
diff
changeset
|
5377 Decimal('345678912') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5378 >>> ExtendedContext.rotate(1333333, 1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5379 Decimal('13333330') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5380 >>> ExtendedContext.rotate(Decimal(1333333), 1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5381 Decimal('13333330') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5382 >>> ExtendedContext.rotate(1333333, Decimal(1)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5383 Decimal('13333330') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5384 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5385 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5386 return a.rotate(b, context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5387 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5388 def same_quantum(self, a, b): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5389 """Returns True if the two operands have the same exponent. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5390 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5391 The result is never affected by either the sign or the coefficient of |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5392 either operand. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5393 |
| 32482 | 5394 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001')) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5395 False |
| 32482 | 5396 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01')) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5397 True |
| 32482 | 5398 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1')) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5399 False |
| 32482 | 5400 >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf')) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5401 True |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5402 >>> ExtendedContext.same_quantum(10000, -1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5403 True |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5404 >>> ExtendedContext.same_quantum(Decimal(10000), -1) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5405 True |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5406 >>> ExtendedContext.same_quantum(10000, Decimal(-1)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5407 True |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5408 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5409 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5410 return a.same_quantum(b) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5411 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5412 def scaleb (self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5413 """Returns the first operand after adding the second value its exp. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5414 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5415 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2')) |
|
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:
45307
diff
changeset
|
5416 Decimal('0.0750') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5417 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('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:
45307
diff
changeset
|
5418 Decimal('7.50') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5419 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3')) |
|
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:
45307
diff
changeset
|
5420 Decimal('7.50E+3') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5421 >>> ExtendedContext.scaleb(1, 4) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5422 Decimal('1E+4') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5423 >>> ExtendedContext.scaleb(Decimal(1), 4) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5424 Decimal('1E+4') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5425 >>> ExtendedContext.scaleb(1, Decimal(4)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5426 Decimal('1E+4') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5427 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5428 a = _convert_other(a, raiseit=True) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5429 return a.scaleb(b, context=self) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5430 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5431 def shift(self, a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5432 """Returns a shifted copy of a, b times. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5433 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5434 The coefficient of the result is a shifted copy of the digits |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5435 in the coefficient of the first operand. The number of places |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5436 to shift is taken from the absolute value of the second operand, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5437 with the shift being to the left if the second operand is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5438 positive or to the right otherwise. Digits shifted into the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5439 coefficient are zeros. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5440 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5441 >>> ExtendedContext.shift(Decimal('34'), Decimal('8')) |
|
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:
45307
diff
changeset
|
5442 Decimal('400000000') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5443 >>> ExtendedContext.shift(Decimal('12'), Decimal('9')) |
|
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:
45307
diff
changeset
|
5444 Decimal('0') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5445 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2')) |
|
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:
45307
diff
changeset
|
5446 Decimal('1234567') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5447 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('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:
45307
diff
changeset
|
5448 Decimal('123456789') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5449 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2')) |
|
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:
45307
diff
changeset
|
5450 Decimal('345678900') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5451 >>> ExtendedContext.shift(88888888, 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5452 Decimal('888888800') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5453 >>> ExtendedContext.shift(Decimal(88888888), 2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5454 Decimal('888888800') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5455 >>> ExtendedContext.shift(88888888, Decimal(2)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5456 Decimal('888888800') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5457 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5458 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5459 return a.shift(b, context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5460 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5461 def sqrt(self, a): |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5462 """Square root of a non-negative number to context precision. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5463 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5464 If the result must be inexact, it is rounded using the round-half-even |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5465 algorithm. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5466 |
| 32482 | 5467 >>> ExtendedContext.sqrt(Decimal('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:
45307
diff
changeset
|
5468 Decimal('0') |
| 32482 | 5469 >>> ExtendedContext.sqrt(Decimal('-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:
45307
diff
changeset
|
5470 Decimal('-0') |
| 32482 | 5471 >>> ExtendedContext.sqrt(Decimal('0.39')) |
|
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:
45307
diff
changeset
|
5472 Decimal('0.624499800') |
| 32482 | 5473 >>> ExtendedContext.sqrt(Decimal('100')) |
|
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:
45307
diff
changeset
|
5474 Decimal('10') |
| 32482 | 5475 >>> ExtendedContext.sqrt(Decimal('1')) |
|
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:
45307
diff
changeset
|
5476 Decimal('1') |
| 32482 | 5477 >>> ExtendedContext.sqrt(Decimal('1.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:
45307
diff
changeset
|
5478 Decimal('1.0') |
| 32482 | 5479 >>> ExtendedContext.sqrt(Decimal('1.00')) |
|
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:
45307
diff
changeset
|
5480 Decimal('1.0') |
| 32482 | 5481 >>> ExtendedContext.sqrt(Decimal('7')) |
|
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:
45307
diff
changeset
|
5482 Decimal('2.64575131') |
| 32482 | 5483 >>> ExtendedContext.sqrt(Decimal('10')) |
|
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:
45307
diff
changeset
|
5484 Decimal('3.16227766') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5485 >>> ExtendedContext.sqrt(2) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5486 Decimal('1.41421356') |
| 32482 | 5487 >>> ExtendedContext.prec |
|
32481
b835d5c61d86
* Make the tests independent of the default precision.
Raymond Hettinger <python@rcn.com>
parents:
32477
diff
changeset
|
5488 9 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5489 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5490 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5491 return a.sqrt(context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5492 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5493 def subtract(self, a, b): |
|
35379
43211be0de41
bug [ 1266296 ] Mistakes in decimal.Context.subtract documentation
Georg Brandl <georg@python.org>
parents:
35113
diff
changeset
|
5494 """Return the difference between the two operands. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5495 |
| 32482 | 5496 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07')) |
|
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:
45307
diff
changeset
|
5497 Decimal('0.23') |
| 32482 | 5498 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30')) |
|
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:
45307
diff
changeset
|
5499 Decimal('0.00') |
| 32482 | 5500 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07')) |
|
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:
45307
diff
changeset
|
5501 Decimal('-0.77') |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5502 >>> ExtendedContext.subtract(8, 5) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5503 Decimal('3') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5504 >>> ExtendedContext.subtract(Decimal(8), 5) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5505 Decimal('3') |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5506 >>> ExtendedContext.subtract(8, Decimal(5)) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5507 Decimal('3') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5508 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5509 a = _convert_other(a, raiseit=True) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5510 r = a.__sub__(b, context=self) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5511 if r is NotImplemented: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5512 raise TypeError("Unable to convert %s to Decimal" % b) |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5513 else: |
|
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5514 return r |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5515 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5516 def to_eng_string(self, a): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5517 """Converts a number to a string, using scientific notation. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5518 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5519 The operation is not affected by the context. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5520 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5521 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5522 return a.to_eng_string(context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5523 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5524 def to_sci_string(self, a): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5525 """Converts a number to a string, using scientific notation. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5526 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5527 The operation is not affected by the context. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5528 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5529 a = _convert_other(a, raiseit=True) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5530 return a.__str__(context=self) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5531 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5532 def to_integral_exact(self, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5533 """Rounds to an integer. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5534 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5535 When the operand has a negative exponent, the result is the same |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5536 as using the quantize() operation using the given operand as the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5537 left-hand-operand, 1E+0 as the right-hand-operand, and the precision |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5538 of the operand as the precision setting; Inexact and Rounded flags |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5539 are allowed in this operation. The rounding mode is taken from the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5540 context. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5541 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5542 >>> ExtendedContext.to_integral_exact(Decimal('2.1')) |
|
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:
45307
diff
changeset
|
5543 Decimal('2') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5544 >>> ExtendedContext.to_integral_exact(Decimal('100')) |
|
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:
45307
diff
changeset
|
5545 Decimal('100') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5546 >>> ExtendedContext.to_integral_exact(Decimal('100.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:
45307
diff
changeset
|
5547 Decimal('100') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5548 >>> ExtendedContext.to_integral_exact(Decimal('101.5')) |
|
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:
45307
diff
changeset
|
5549 Decimal('102') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5550 >>> ExtendedContext.to_integral_exact(Decimal('-101.5')) |
|
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:
45307
diff
changeset
|
5551 Decimal('-102') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5552 >>> ExtendedContext.to_integral_exact(Decimal('10E+5')) |
|
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:
45307
diff
changeset
|
5553 Decimal('1.0E+6') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5554 >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77')) |
|
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:
45307
diff
changeset
|
5555 Decimal('7.89E+77') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5556 >>> ExtendedContext.to_integral_exact(Decimal('-Inf')) |
|
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:
45307
diff
changeset
|
5557 Decimal('-Infinity') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5558 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5559 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5560 return a.to_integral_exact(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5561 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5562 def to_integral_value(self, a): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5563 """Rounds to an integer. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5564 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5565 When the operand has a negative exponent, the result is the same |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5566 as using the quantize() operation using the given operand as the |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5567 left-hand-operand, 1E+0 as the right-hand-operand, and the precision |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5568 of the operand as the precision setting, except that no flags will |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5569 be set. The rounding mode is taken from the context. |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5570 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5571 >>> ExtendedContext.to_integral_value(Decimal('2.1')) |
|
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:
45307
diff
changeset
|
5572 Decimal('2') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5573 >>> ExtendedContext.to_integral_value(Decimal('100')) |
|
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:
45307
diff
changeset
|
5574 Decimal('100') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5575 >>> ExtendedContext.to_integral_value(Decimal('100.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:
45307
diff
changeset
|
5576 Decimal('100') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5577 >>> ExtendedContext.to_integral_value(Decimal('101.5')) |
|
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:
45307
diff
changeset
|
5578 Decimal('102') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5579 >>> ExtendedContext.to_integral_value(Decimal('-101.5')) |
|
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:
45307
diff
changeset
|
5580 Decimal('-102') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5581 >>> ExtendedContext.to_integral_value(Decimal('10E+5')) |
|
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:
45307
diff
changeset
|
5582 Decimal('1.0E+6') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5583 >>> ExtendedContext.to_integral_value(Decimal('7.89E+77')) |
|
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:
45307
diff
changeset
|
5584 Decimal('7.89E+77') |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5585 >>> ExtendedContext.to_integral_value(Decimal('-Inf')) |
|
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:
45307
diff
changeset
|
5586 Decimal('-Infinity') |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5587 """ |
|
58936
f225d5e6e0e5
Merged revisions 78217-78218 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
58668
diff
changeset
|
5588 a = _convert_other(a, raiseit=True) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5589 return a.to_integral_value(context=self) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5590 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5591 # the method name changed, but we provide also the old one, for compatibility |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5592 to_integral = to_integral_value |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5593 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5594 class _WorkRep(object): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5595 __slots__ = ('sign','int','exp') |
| 33851 | 5596 # sign: 0 or 1 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5597 # int: int |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5598 # exp: None, int, or string |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5599 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5600 def __init__(self, value=None): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5601 if value is None: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5602 self.sign = None |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
5603 self.int = 0 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5604 self.exp = None |
| 33851 | 5605 elif isinstance(value, Decimal): |
| 5606 self.sign = value._sign | |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
5607 self.int = int(value._int) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5608 self.exp = value._exp |
| 33851 | 5609 else: |
| 5610 # assert isinstance(value, tuple) | |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5611 self.sign = value[0] |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5612 self.int = value[1] |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5613 self.exp = value[2] |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5614 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5615 def __repr__(self): |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5616 return "(%r, %r, %r)" % (self.sign, self.int, self.exp) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5617 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5618 __str__ = __repr__ |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5619 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5620 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5621 |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
5622 def _normalize(op1, op2, prec = 0): |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5623 """Normalizes op1, op2 to have the same exp and length of coefficient. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5624 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5625 Done during addition. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5626 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5627 if op1.exp < op2.exp: |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5628 tmp = op2 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5629 other = op1 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5630 else: |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5631 tmp = op1 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5632 other = op2 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5633 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5634 # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1). |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5635 # Then adding 10**exp to tmp has the same effect (after rounding) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5636 # as adding any positive quantity smaller than 10**exp; similarly |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5637 # for subtraction. So if other is smaller than 10**exp we replace |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5638 # it with 10**exp. This avoids tmp.exp - other.exp getting too large. |
|
44329
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
5639 tmp_len = len(str(tmp.int)) |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
5640 other_len = len(str(other.int)) |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
5641 exp = tmp.exp + min(-1, tmp_len - prec - 2) |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
5642 if other_len + other.exp - 1 < exp: |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
5643 other.int = 1 |
|
75c6bfd3b1f3
Merged revisions 59512-59540 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44256
diff
changeset
|
5644 other.exp = exp |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5645 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5646 tmp.int *= 10 ** (tmp.exp - other.exp) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5647 tmp.exp = other.exp |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5648 return op1, op2 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5649 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5650 ##### Integer arithmetic functions used by ln, log10, exp and __pow__ ##### |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5651 |
|
66506
fee98b604139
Replace _nbits() with int.bit_length().
Raymond Hettinger <python@rcn.com>
parents:
66444
diff
changeset
|
5652 _nbits = int.bit_length |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5653 |
|
70636
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5654 def _decimal_lshift_exact(n, e): |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5655 """ Given integers n and e, return n * 10**e if it's an integer, else None. |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5656 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5657 The computation is designed to avoid computing large powers of 10 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5658 unnecessarily. |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5659 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5660 >>> _decimal_lshift_exact(3, 4) |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5661 30000 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5662 >>> _decimal_lshift_exact(300, -999999999) # returns None |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5663 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5664 """ |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5665 if n == 0: |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5666 return 0 |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5667 elif e >= 0: |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5668 return n * 10**e |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5669 else: |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5670 # val_n = largest power of 10 dividing n. |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5671 str_n = str(abs(n)) |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5672 val_n = len(str_n) - len(str_n.rstrip('0')) |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5673 return None if val_n < -e else n // 10**-e |
|
c3fe54781244
Issue #12080: Fix a performance issue in Decimal._power_exact that causes some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents:
70271
diff
changeset
|
5674 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5675 def _sqrt_nearest(n, a): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5676 """Closest integer to the square root of the positive integer n. a is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5677 an initial approximation to the square root. Any positive integer |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5678 will do for a, but the closer a is to the square root of n the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5679 faster convergence will be. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5680 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5681 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5682 if n <= 0 or a <= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5683 raise ValueError("Both arguments to _sqrt_nearest should be positive.") |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5684 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5685 b=0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5686 while a != b: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5687 b, a = a, a--n//a>>1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5688 return a |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5689 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5690 def _rshift_nearest(x, shift): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5691 """Given an integer x and a nonnegative integer shift, return closest |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5692 integer to x / 2**shift; use round-to-even in case of a tie. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5693 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5694 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5695 b, q = 1 << shift, x >> shift |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5696 return q + (2*(x & (b-1)) + (q&1) > b) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5697 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5698 def _div_nearest(a, b): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5699 """Closest integer to a/b, a and b positive integers; rounds to even |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5700 in the case of a tie. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5701 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5702 """ |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5703 q, r = divmod(a, b) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5704 return q + (2*r + (q&1) > b) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5705 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5706 def _ilog(x, M, L = 8): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5707 """Integer approximation to M*log(x/M), with absolute error boundable |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5708 in terms only of x/M. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5709 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5710 Given positive integers x and M, return an integer approximation to |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5711 M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5712 between the approximation and the exact result is at most 22. For |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5713 L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5714 both cases these are upper bounds on the error; it will usually be |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5715 much smaller.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5716 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5717 # The basic algorithm is the following: let log1p be the function |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5718 # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5719 # the reduction |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5720 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5721 # log1p(y) = 2*log1p(y/(1+sqrt(1+y))) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5722 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5723 # repeatedly until the argument to log1p is small (< 2**-L in |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5724 # absolute value). For small y we can use the Taylor series |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5725 # expansion |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5726 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5727 # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5728 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5729 # truncating at T such that y**T is small enough. The whole |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5730 # computation is carried out in a form of fixed-point arithmetic, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5731 # with a real number z being represented by an integer |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5732 # approximation to z*M. To avoid loss of precision, the y below |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5733 # is actually an integer approximation to 2**R*y*M, where R is the |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5734 # number of reductions performed so far. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5735 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5736 y = x-M |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5737 # argument reduction; R = number of reductions performed |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5738 R = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5739 while (R <= L and abs(y) << L-R >= M or |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5740 R > L and abs(y) >> R-L >= M): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5741 y = _div_nearest((M*y) << 1, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5742 M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M)) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5743 R += 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5744 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5745 # Taylor series with T terms |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5746 T = -int(-10*len(str(M))//(3*L)) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5747 yshift = _rshift_nearest(y, R) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5748 w = _div_nearest(M, T) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5749 for k in range(T-1, 0, -1): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5750 w = _div_nearest(M, k) - _div_nearest(yshift*w, M) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5751 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5752 return _div_nearest(w*y, M) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5753 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5754 def _dlog10(c, e, p): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5755 """Given integers c, e and p with c > 0, p >= 0, compute an integer |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5756 approximation to 10**p * log10(c*10**e), with an absolute error of |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5757 at most 1. Assumes that c*10**e is not exactly 1.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5758 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5759 # increase precision by 2; compensate for this by dividing |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5760 # final result by 100 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5761 p += 2 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5762 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5763 # write c*10**e as d*10**f with either: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5764 # f >= 0 and 1 <= d <= 10, or |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5765 # f <= 0 and 0.1 <= d <= 1. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5766 # Thus for c*10**e close to 1, f = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5767 l = len(str(c)) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5768 f = e+l - (e+l >= 1) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5769 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5770 if p > 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5771 M = 10**p |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5772 k = e+p-f |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5773 if k >= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5774 c *= 10**k |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5775 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5776 c = _div_nearest(c, 10**-k) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5777 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5778 log_d = _ilog(c, M) # error < 5 + 22 = 27 |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5779 log_10 = _log10_digits(p) # error < 1 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5780 log_d = _div_nearest(log_d*M, log_10) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5781 log_tenpower = f*M # exact |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5782 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5783 log_d = 0 # error < 2.31 |
|
48848
5c75a33ef5b2
Merged revisions 66006 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
48769
diff
changeset
|
5784 log_tenpower = _div_nearest(f, 10**-p) # error < 0.5 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5785 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5786 return _div_nearest(log_tenpower+log_d, 100) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5787 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5788 def _dlog(c, e, p): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5789 """Given integers c, e and p with c > 0, compute an integer |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5790 approximation to 10**p * log(c*10**e), with an absolute error of |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5791 at most 1. Assumes that c*10**e is not exactly 1.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5792 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5793 # Increase precision by 2. The precision increase is compensated |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5794 # for at the end with a division by 100. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5795 p += 2 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5796 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5797 # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5798 # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5799 # as 10**p * log(d) + 10**p*f * log(10). |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5800 l = len(str(c)) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5801 f = e+l - (e+l >= 1) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5802 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5803 # compute approximation to 10**p*log(d), with error < 27 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5804 if p > 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5805 k = e+p-f |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5806 if k >= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5807 c *= 10**k |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5808 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5809 c = _div_nearest(c, 10**-k) # error of <= 0.5 in c |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5810 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5811 # _ilog magnifies existing error in c by a factor of at most 10 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5812 log_d = _ilog(c, 10**p) # error < 5 + 22 = 27 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5813 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5814 # p <= 0: just approximate the whole thing by 0; error < 2.31 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5815 log_d = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5816 |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5817 # compute approximation to f*10**p*log(10), with error < 11. |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5818 if f: |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5819 extra = len(str(abs(f)))-1 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5820 if p + extra >= 0: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5821 # error in f * _log10_digits(p+extra) < |f| * 1 = |f| |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5822 # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5823 f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5824 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5825 f_log_ten = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5826 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5827 f_log_ten = 0 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5828 |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5829 # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5830 return _div_nearest(f_log_ten + log_d, 100) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5831 |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5832 class _Log10Memoize(object): |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5833 """Class to compute, store, and allow retrieval of, digits of the |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5834 constant log(10) = 2.302585.... This constant is needed by |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5835 Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__.""" |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5836 def __init__(self): |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5837 self.digits = "23025850929940456840179914546843642076011014886" |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5838 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5839 def getdigits(self, p): |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5840 """Given an integer p >= 0, return floor(10**p)*log(10). |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5841 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5842 For example, self.getdigits(3) returns 2302. |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5843 """ |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5844 # digits are stored as a string, for quick conversion to |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5845 # integer in the case that we've already computed enough |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5846 # digits; the stored digits should always be correct |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5847 # (truncated, not rounded to nearest). |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5848 if p < 0: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5849 raise ValueError("p should be nonnegative") |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5850 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5851 if p >= len(self.digits): |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5852 # compute p+3, p+6, p+9, ... digits; continue until at |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5853 # least one of the extra digits is nonzero |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5854 extra = 3 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5855 while True: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5856 # compute p+extra digits, correct to within 1ulp |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5857 M = 10**(p+extra+2) |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5858 digits = str(_div_nearest(_ilog(10*M, M), 100)) |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5859 if digits[-extra:] != '0'*extra: |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5860 break |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5861 extra += 3 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5862 # keep all reliable digits so far; remove trailing zeros |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5863 # and next nonzero digit |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5864 self.digits = digits.rstrip('0')[:-1] |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5865 return int(self.digits[:p+1]) |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5866 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5867 _log10_digits = _Log10Memoize().getdigits |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5868 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5869 def _iexp(x, M, L=8): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5870 """Given integers x and M, M > 0, such that x/M is small in absolute |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5871 value, compute an integer approximation to M*exp(x/M). For 0 <= |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5872 x/M <= 2.4, the absolute error in the result is bounded by 60 (and |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5873 is usually much smaller).""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5874 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5875 # Algorithm: to compute exp(z) for a real number z, first divide z |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5876 # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5877 # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5878 # series |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5879 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5880 # expm1(x) = x + x**2/2! + x**3/3! + ... |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5881 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5882 # Now use the identity |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5883 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5884 # expm1(2x) = expm1(x)*(expm1(x)+2) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5885 # |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5886 # R times to compute the sequence expm1(z/2**R), |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5887 # expm1(z/2**(R-1)), ... , exp(z/2), exp(z). |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5888 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5889 # Find R such that x/2**R/M <= 2**-L |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5890 R = _nbits((x<<L)//M) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5891 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5892 # Taylor series. (2**L)**T > M |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5893 T = -int(-10*len(str(M))//(3*L)) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5894 y = _div_nearest(x, T) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5895 Mshift = M<<R |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5896 for i in range(T-1, 0, -1): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5897 y = _div_nearest(x*(Mshift + y), Mshift * i) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5898 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5899 # Expansion |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5900 for k in range(R-1, -1, -1): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5901 Mshift = M<<(k+2) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5902 y = _div_nearest(y*(y+Mshift), Mshift) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5903 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5904 return M+y |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5905 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5906 def _dexp(c, e, p): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5907 """Compute an approximation to exp(c*10**e), with p decimal places of |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5908 precision. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5909 |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5910 Returns integers d, f such that: |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5911 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5912 10**(p-1) <= d <= 10**p, and |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5913 (d-1)*10**f < exp(c*10**e) < (d+1)*10**f |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5914 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5915 In other words, d*10**f is an approximation to exp(c*10**e) with p |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5916 digits of precision, and with an error in d of at most 1. This is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5917 almost, but not quite, the same as the error being < 1ulp: when d |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5918 = 10**(p-1) the error could be up to 10 ulp.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5919 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5920 # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5921 p += 2 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5922 |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5923 # compute log(10) with extra precision = adjusted exponent of c*10**e |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5924 extra = max(0, e + len(str(c)) - 1) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5925 q = p + extra |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5926 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5927 # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q), |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5928 # rounding down |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5929 shift = e+q |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5930 if shift >= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5931 cshift = c*10**shift |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5932 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5933 cshift = c//10**-shift |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43577
diff
changeset
|
5934 quot, rem = divmod(cshift, _log10_digits(q)) |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5935 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5936 # reduce remainder back to original precision |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5937 rem = _div_nearest(rem, 10**extra) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5938 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5939 # error in result of _iexp < 120; error after division < 0.62 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5940 return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5941 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5942 def _dpower(xc, xe, yc, ye, p): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5943 """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5944 y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5945 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5946 10**(p-1) <= c <= 10**p, and |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5947 (c-1)*10**e < x**y < (c+1)*10**e |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5948 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5949 in other words, c*10**e is an approximation to x**y with p digits |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5950 of precision, and with an error in c of at most 1. (This is |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5951 almost, but not quite, the same as the error being < 1ulp: when c |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5952 == 10**(p-1) we can only guarantee error < 10ulp.) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5953 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5954 We assume that: x is positive and not equal to 1, and y is nonzero. |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5955 """ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5956 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5957 # Find b such that 10**(b-1) <= |y| <= 10**b |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5958 b = len(str(abs(yc))) + ye |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5959 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5960 # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5961 lxc = _dlog(xc, xe, p+b+1) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5962 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5963 # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5964 shift = ye-b |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5965 if shift >= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5966 pc = lxc*yc*10**shift |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5967 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5968 pc = _div_nearest(lxc*yc, 10**-shift) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5969 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5970 if pc == 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5971 # we prefer a result that isn't exactly 1; this makes it |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5972 # easier to compute a correctly rounded result in __pow__ |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5973 if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5974 coeff, exp = 10**(p-1)+1, 1-p |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5975 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5976 coeff, exp = 10**p-1, -p |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5977 else: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5978 coeff, exp = _dexp(pc, -(p+1), p+1) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5979 coeff = _div_nearest(coeff, 10) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5980 exp += 1 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5981 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5982 return coeff, exp |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5983 |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5984 def _log10_lb(c, correction = { |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5985 '1': 100, '2': 70, '3': 53, '4': 40, '5': 31, |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5986 '6': 23, '7': 16, '8': 10, '9': 5}): |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5987 """Compute a lower bound for 100*log10(c) for a positive integer c.""" |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5988 if c <= 0: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5989 raise ValueError("The argument to _log10_lb should be nonnegative.") |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5990 str_c = str(c) |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
5991 return 100*len(str_c) - correction[str_c[0]] |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5992 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
5993 ##### Helper Functions #################################################### |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
5994 |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
5995 def _convert_other(other, raiseit=False, allow_float=False): |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
5996 """Convert other to Decimal. |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
5997 |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
5998 Verifies that it's ok to use in an implicit construction. |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
5999 If allow_float is true, allow conversion from float; this |
|
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
6000 is used in the comparison methods (__eq__ and friends). |
|
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
6001 |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
6002 """ |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
6003 if isinstance(other, Decimal): |
|
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
6004 return other |
|
41592
1e5a2a2b18ee
Fix various spots where int/long and str/unicode unification
Walter Dörwald <walter@livinglogic.de>
parents:
41554
diff
changeset
|
6005 if isinstance(other, int): |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
6006 return Decimal(other) |
|
60232
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
6007 if allow_float and isinstance(other, float): |
|
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
6008 return Decimal.from_float(other) |
|
5078220bd1ea
Merged revisions 79583,79588-79589 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
60166
diff
changeset
|
6009 |
|
43400
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
6010 if raiseit: |
|
1bac386c17cc
Merged revisions 58095-58132,58136-58148,58151-58197 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43020
diff
changeset
|
6011 raise TypeError("Unable to convert %s to Decimal" % other) |
|
34812
b016236dfbd9
* Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents:
34758
diff
changeset
|
6012 return NotImplemented |
|
33519
139a4012bead
SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents:
33198
diff
changeset
|
6013 |
|
62241
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6014 def _convert_for_comparison(self, other, equality_op=False): |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6015 """Given a Decimal instance self and a Python object other, return |
|
62244
ebc4e896924e
Fix typo in docstring.
Mark Dickinson <dickinsm@gmail.com>
parents:
62241
diff
changeset
|
6016 a pair (s, o) of Decimal instances such that "s op o" is |
|
62241
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6017 equivalent to "self op other" for any of the 6 comparison |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6018 operators "op". |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6019 |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6020 """ |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6021 if isinstance(other, Decimal): |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6022 return self, other |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6023 |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6024 # Comparison with a Rational instance (also includes integers): |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6025 # self op n/d <=> self*d op n (for n and d integers, d positive). |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6026 # A NaN or infinity can be left unchanged without affecting the |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6027 # comparison result. |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6028 if isinstance(other, _numbers.Rational): |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6029 if not self._is_special: |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6030 self = _dec_from_triple(self._sign, |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6031 str(int(self._int) * other.denominator), |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6032 self._exp) |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6033 return self, Decimal(other.numerator) |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6034 |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6035 # Comparisons with float and complex types. == and != comparisons |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6036 # with complex numbers should succeed, returning either True or False |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6037 # as appropriate. Other comparisons return NotImplemented. |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6038 if equality_op and isinstance(other, _numbers.Complex) and other.imag == 0: |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6039 other = other.real |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6040 if isinstance(other, float): |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6041 context = getcontext() |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6042 if equality_op: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6043 context.flags[FloatOperation] = 1 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6044 else: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6045 context._raise_error(FloatOperation, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6046 "strict semantics for mixing floats and Decimals are enabled") |
|
62241
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6047 return self, Decimal.from_float(other) |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6048 return NotImplemented, NotImplemented |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6049 |
|
26685311d313
Issue #8188: Comparisons between Decimal objects and other numeric
Mark Dickinson <dickinsm@gmail.com>
parents:
61873
diff
changeset
|
6050 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
6051 ##### Setup Specific Contexts ############################################ |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6052 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6053 # The default context prototype used by Context() |
|
32666
c13d911ae05b
* Rename "Signals" to "_signals" making it non-public.
Raymond Hettinger <python@rcn.com>
parents:
32576
diff
changeset
|
6054 # Is mutable, so that new contexts can have different default values |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6055 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6056 DefaultContext = Context( |
|
32481
b835d5c61d86
* Make the tests independent of the default precision.
Raymond Hettinger <python@rcn.com>
parents:
32477
diff
changeset
|
6057 prec=28, rounding=ROUND_HALF_EVEN, |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
6058 traps=[DivisionByZero, Overflow, InvalidOperation], |
|
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
6059 flags=[], |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6060 Emax=999999, |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6061 Emin=-999999, |
|
61864
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
6062 capitals=1, |
|
6fee26c89f6e
#Issue 8540: Make Context._clamp attribute public in decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents:
61745
diff
changeset
|
6063 clamp=0 |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6064 ) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6065 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6066 # Pre-made alternate contexts offered by the specification |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6067 # Don't change these; the user should be able to select these |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6068 # contexts and be able to reproduce results from other implementations |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6069 # of the spec. |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6070 |
| 32482 | 6071 BasicContext = Context( |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6072 prec=9, rounding=ROUND_HALF_UP, |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
6073 traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow], |
|
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
6074 flags=[], |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6075 ) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6076 |
| 32482 | 6077 ExtendedContext = Context( |
|
32481
b835d5c61d86
* Make the tests independent of the default precision.
Raymond Hettinger <python@rcn.com>
parents:
32477
diff
changeset
|
6078 prec=9, rounding=ROUND_HALF_EVEN, |
|
32576
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
6079 traps=[], |
|
83cbc025bfc7
Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents:
32561
diff
changeset
|
6080 flags=[], |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6081 ) |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6082 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6083 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6084 ##### crud for parsing strings ############################################# |
|
45514
fce5af5ce16a
Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45333
diff
changeset
|
6085 # |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6086 # Regular expression used for parsing numeric strings. Additional |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6087 # comments: |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6088 # |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6089 # 1. Uncomment the two '\s*' lines to allow leading and/or trailing |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6090 # whitespace. But note that the specification disallows whitespace in |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6091 # a numeric string. |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6092 # |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6093 # 2. For finite numbers (not infinities and NaNs) the body of the |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6094 # number between the optional sign and the optional exponent must have |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6095 # at least one decimal digit, possibly after the decimal point. The |
|
55517
88255cb4534d
Merged revisions 74279 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53299
diff
changeset
|
6096 # lookahead expression '(?=\d|\.\d)' checks this. |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6097 |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6098 import re |
|
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:
47674
diff
changeset
|
6099 _parser = re.compile(r""" # A numeric string consists of: |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6100 # \s* |
|
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:
47674
diff
changeset
|
6101 (?P<sign>[-+])? # an optional sign, followed by either... |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6102 ( |
|
55517
88255cb4534d
Merged revisions 74279 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53299
diff
changeset
|
6103 (?=\d|\.\d) # ...a number (with at least one digit) |
|
88255cb4534d
Merged revisions 74279 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53299
diff
changeset
|
6104 (?P<int>\d*) # having a (possibly empty) integer part |
|
88255cb4534d
Merged revisions 74279 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53299
diff
changeset
|
6105 (\.(?P<frac>\d*))? # followed by an optional fractional part |
|
88255cb4534d
Merged revisions 74279 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53299
diff
changeset
|
6106 (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or... |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6107 | |
|
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:
47674
diff
changeset
|
6108 Inf(inity)? # ...an infinity, or... |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6109 | |
|
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:
47674
diff
changeset
|
6110 (?P<signal>s)? # ...an (optionally signaling) |
|
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:
47674
diff
changeset
|
6111 NaN # NaN |
|
55517
88255cb4534d
Merged revisions 74279 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53299
diff
changeset
|
6112 (?P<diag>\d*) # with (possibly empty) diagnostic info. |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6113 ) |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6114 # \s* |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44643
diff
changeset
|
6115 \Z |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6116 """, re.VERBOSE | re.IGNORECASE).match |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6117 |
|
44129
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
6118 _all_zeros = re.compile('0*$').match |
|
b637349336fd
Merged revisions 59275-59303 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44070
diff
changeset
|
6119 _exact_half = re.compile('50*$').match |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6120 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6121 ##### PEP3101 support functions ############################################## |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6122 # The functions in this section have little to do with the Decimal |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6123 # class, and could potentially be reused or adapted for other pure |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6124 # Python numeric classes that want to implement __format__ |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6125 # |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6126 # A format specifier for Decimal looks like: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6127 # |
|
66444
eded691497b7
Issue #7094: Add alternate ('#') flag to __format__ methods for float, complex and Decimal. Allows greater control over when decimal points appear. Added to make transitioning from %-formatting easier. '#g' still has a problem with Decimal which I'll fix soon.
Eric Smith <eric@trueblade.com>
parents:
66346
diff
changeset
|
6128 # [[fill]align][sign][#][0][minimumwidth][,][.precision][type] |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6129 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6130 _parse_format_specifier_regex = re.compile(r"""\A |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6131 (?: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6132 (?P<fill>.)? |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6133 (?P<align>[<>=^]) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6134 )? |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6135 (?P<sign>[-+ ])? |
|
66444
eded691497b7
Issue #7094: Add alternate ('#') flag to __format__ methods for float, complex and Decimal. Allows greater control over when decimal points appear. Added to make transitioning from %-formatting easier. '#g' still has a problem with Decimal which I'll fix soon.
Eric Smith <eric@trueblade.com>
parents:
66346
diff
changeset
|
6136 (?P<alt>\#)? |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6137 (?P<zeropad>0)? |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6138 (?P<minimumwidth>(?!0)\d+)? |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6139 (?P<thousands_sep>,)? |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6140 (?:\.(?P<precision>0|(?!0)\d+))? |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6141 (?P<type>[eEfFgGn%])? |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6142 \Z |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6143 """, re.VERBOSE) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6144 |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6145 del re |
|
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6146 |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6147 # The locale module is only needed for the 'n' format specifier. The |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6148 # rest of the PEP 3101 code functions quite happily without it, so we |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6149 # don't care too much if locale isn't present. |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6150 try: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6151 import locale as _locale |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6152 except ImportError: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6153 pass |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6154 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6155 def _parse_format_specifier(format_spec, _localeconv=None): |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6156 """Parse and validate a format specifier. |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6157 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6158 Turns a standard numeric format specifier into a dict, with the |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6159 following entries: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6160 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6161 fill: fill character to pad field to minimum width |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6162 align: alignment type, either '<', '>', '=' or '^' |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6163 sign: either '+', '-' or ' ' |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6164 minimumwidth: nonnegative integer giving minimum width |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6165 zeropad: boolean, indicating whether to pad with zeros |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6166 thousands_sep: string to use as thousands separator, or '' |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6167 grouping: grouping for thousands separators, in format |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6168 used by localeconv |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6169 decimal_point: string to use for decimal point |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6170 precision: nonnegative integer giving precision, or None |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6171 type: one of the characters 'eEfFgG%', or None |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6172 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6173 """ |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6174 m = _parse_format_specifier_regex.match(format_spec) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6175 if m is None: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6176 raise ValueError("Invalid format specifier: " + format_spec) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6177 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6178 # get the dictionary |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6179 format_dict = m.groupdict() |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6180 |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6181 # zeropad; defaults for fill and alignment. If zero padding |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6182 # is requested, the fill and align fields should be absent. |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6183 fill = format_dict['fill'] |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6184 align = format_dict['align'] |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6185 format_dict['zeropad'] = (format_dict['zeropad'] is not None) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6186 if format_dict['zeropad']: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6187 if fill is not None: |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6188 raise ValueError("Fill character conflicts with '0'" |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6189 " in format specifier: " + format_spec) |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6190 if align is not None: |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6191 raise ValueError("Alignment conflicts with '0' in " |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6192 "format specifier: " + format_spec) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6193 format_dict['fill'] = fill or ' ' |
|
55892
0bc759f6ded5
Merged revisions 74723 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55888
diff
changeset
|
6194 # PEP 3101 originally specified that the default alignment should |
|
0bc759f6ded5
Merged revisions 74723 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55888
diff
changeset
|
6195 # be left; it was later agreed that right-aligned makes more sense |
|
0bc759f6ded5
Merged revisions 74723 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55888
diff
changeset
|
6196 # for numeric types. See http://bugs.python.org/issue6857. |
|
0bc759f6ded5
Merged revisions 74723 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
55888
diff
changeset
|
6197 format_dict['align'] = align or '>' |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6198 |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6199 # default sign handling: '-' for negative, '' for positive |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6200 if format_dict['sign'] is None: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6201 format_dict['sign'] = '-' |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6202 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6203 # minimumwidth defaults to 0; precision remains None if not given |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6204 format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0') |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6205 if format_dict['precision'] is not None: |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6206 format_dict['precision'] = int(format_dict['precision']) |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6207 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6208 # if format type is 'g' or 'G' then a precision of 0 makes little |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6209 # sense; convert it to 1. Same if format type is unspecified. |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6210 if format_dict['precision'] == 0: |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6211 if format_dict['type'] is None or format_dict['type'] in 'gGn': |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6212 format_dict['precision'] = 1 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6213 |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6214 # determine thousands separator, grouping, and decimal separator, and |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6215 # add appropriate entries to format_dict |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6216 if format_dict['type'] == 'n': |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6217 # apart from separators, 'n' behaves just like 'g' |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6218 format_dict['type'] = 'g' |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6219 if _localeconv is None: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6220 _localeconv = _locale.localeconv() |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6221 if format_dict['thousands_sep'] is not None: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6222 raise ValueError("Explicit thousands separator conflicts with " |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6223 "'n' type in format specifier: " + format_spec) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6224 format_dict['thousands_sep'] = _localeconv['thousands_sep'] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6225 format_dict['grouping'] = _localeconv['grouping'] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6226 format_dict['decimal_point'] = _localeconv['decimal_point'] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6227 else: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6228 if format_dict['thousands_sep'] is None: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6229 format_dict['thousands_sep'] = '' |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6230 format_dict['grouping'] = [3, 0] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6231 format_dict['decimal_point'] = '.' |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6232 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6233 return format_dict |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6234 |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6235 def _format_align(sign, body, spec): |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6236 """Given an unpadded, non-aligned numeric string 'body' and sign |
|
68488
0991b40e895d
#11515: fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
68395
diff
changeset
|
6237 string 'sign', add padding and alignment conforming to the given |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6238 format specifier dictionary 'spec' (as produced by |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6239 parse_format_specifier). |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6240 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6241 """ |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6242 # how much extra space do we have to play with? |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6243 minimumwidth = spec['minimumwidth'] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6244 fill = spec['fill'] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6245 padding = fill*(minimumwidth - len(sign) - len(body)) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6246 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6247 align = spec['align'] |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6248 if align == '<': |
|
52190
39f4fa51acfb
Merged revisions 70430 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
51655
diff
changeset
|
6249 result = sign + body + padding |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6250 elif align == '>': |
|
52190
39f4fa51acfb
Merged revisions 70430 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
51655
diff
changeset
|
6251 result = padding + sign + body |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6252 elif align == '=': |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6253 result = sign + padding + body |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6254 elif align == '^': |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6255 half = len(padding)//2 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6256 result = padding[:half] + sign + body + padding[half:] |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6257 else: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6258 raise ValueError('Unrecognised alignment field') |
|
45569
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6259 |
|
937a3c5af691
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61097,61103-61104,61110-61112,61114-61115,61117-61125 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45549
diff
changeset
|
6260 return result |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
6261 |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6262 def _group_lengths(grouping): |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6263 """Convert a localeconv-style grouping into a (possibly infinite) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6264 iterable of integers representing group lengths. |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6265 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6266 """ |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6267 # The result from localeconv()['grouping'], and the input to this |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6268 # function, should be a list of integers in one of the |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6269 # following three forms: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6270 # |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6271 # (1) an empty list, or |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6272 # (2) nonempty list of positive integers + [0] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6273 # (3) list of positive integers + [locale.CHAR_MAX], or |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6274 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6275 from itertools import chain, repeat |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6276 if not grouping: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6277 return [] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6278 elif grouping[-1] == 0 and len(grouping) >= 2: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6279 return chain(grouping[:-1], repeat(grouping[-2])) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6280 elif grouping[-1] == _locale.CHAR_MAX: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6281 return grouping[:-1] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6282 else: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6283 raise ValueError('unrecognised format for grouping') |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6284 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6285 def _insert_thousands_sep(digits, spec, min_width=1): |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6286 """Insert thousands separators into a digit string. |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6287 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6288 spec is a dictionary whose keys should include 'thousands_sep' and |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6289 'grouping'; typically it's the result of parsing the format |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6290 specifier using _parse_format_specifier. |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6291 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6292 The min_width keyword argument gives the minimum length of the |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6293 result, which will be padded on the left with zeros if necessary. |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6294 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6295 If necessary, the zero padding adds an extra '0' on the left to |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6296 avoid a leading thousands separator. For example, inserting |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6297 commas every three digits in '123456', with min_width=8, gives |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6298 '0,123,456', even though that has length 9. |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6299 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6300 """ |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6301 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6302 sep = spec['thousands_sep'] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6303 grouping = spec['grouping'] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6304 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6305 groups = [] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6306 for l in _group_lengths(grouping): |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6307 if l <= 0: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6308 raise ValueError("group length should be positive") |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6309 # max(..., 1) forces at least 1 digit to the left of a separator |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6310 l = min(max(len(digits), min_width, 1), l) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6311 groups.append('0'*(l - len(digits)) + digits[-l:]) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6312 digits = digits[:-l] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6313 min_width -= l |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6314 if not digits and min_width <= 0: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6315 break |
|
52201
fcdffd85a8bd
Merged revisions 70444 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52196
diff
changeset
|
6316 min_width -= len(sep) |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6317 else: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6318 l = max(len(digits), min_width, 1) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6319 groups.append('0'*(l - len(digits)) + digits[-l:]) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6320 return sep.join(reversed(groups)) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6321 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6322 def _format_sign(is_negative, spec): |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6323 """Determine sign character.""" |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6324 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6325 if is_negative: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6326 return '-' |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6327 elif spec['sign'] in ' +': |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6328 return spec['sign'] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6329 else: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6330 return '' |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6331 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6332 def _format_number(is_negative, intpart, fracpart, exp, spec): |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6333 """Format a number, given the following data: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6334 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6335 is_negative: true if the number is negative, else false |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6336 intpart: string of digits that must appear before the decimal point |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6337 fracpart: string of digits that must come after the point |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6338 exp: exponent, as an integer |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6339 spec: dictionary resulting from parsing the format specifier |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6340 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6341 This function uses the information in spec to: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6342 insert separators (decimal separator and thousands separators) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6343 format the sign |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6344 format the exponent |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6345 add trailing '%' for the '%' type |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6346 zero-pad if necessary |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6347 fill and align if necessary |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6348 """ |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6349 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6350 sign = _format_sign(is_negative, spec) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6351 |
|
66444
eded691497b7
Issue #7094: Add alternate ('#') flag to __format__ methods for float, complex and Decimal. Allows greater control over when decimal points appear. Added to make transitioning from %-formatting easier. '#g' still has a problem with Decimal which I'll fix soon.
Eric Smith <eric@trueblade.com>
parents:
66346
diff
changeset
|
6352 if fracpart or spec['alt']: |
|
52196
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6353 fracpart = spec['decimal_point'] + fracpart |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6354 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6355 if exp != 0 or spec['type'] in 'eE': |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6356 echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']] |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6357 fracpart += "{0}{1:+}".format(echar, exp) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6358 if spec['type'] == '%': |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6359 fracpart += '%' |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6360 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6361 if spec['zeropad']: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6362 min_width = spec['minimumwidth'] - len(fracpart) - len(sign) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6363 else: |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6364 min_width = 0 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6365 intpart = _insert_thousands_sep(intpart, spec, min_width) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6366 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6367 return _format_align(sign, intpart+fracpart, spec) |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6368 |
|
12e14e6f1f2d
Merged revisions 70439 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
52190
diff
changeset
|
6369 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
6370 ##### Useful Constants (internal use only) ################################ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
6371 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
6372 # Reusable defaults |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
6373 _Infinity = Decimal('Inf') |
|
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
6374 _NegativeInfinity = Decimal('-Inf') |
|
50473
d367be543f6c
Merged revisions 68184 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50115
diff
changeset
|
6375 _NaN = Decimal('NaN') |
|
50482
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
6376 _Zero = Decimal(0) |
|
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
6377 _One = Decimal(1) |
|
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
6378 _NegativeOne = Decimal(-1) |
|
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
6379 |
|
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
6380 # _SignedInfinity[sign] is infinity w/ that sign |
|
134d173b9350
Merged revisions 68193 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50473
diff
changeset
|
6381 _SignedInfinity = (_Infinity, _NegativeInfinity) |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6382 |
|
61873
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
6383 # 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:
61864
diff
changeset
|
6384 # on the reduction of x modulo _PyHASH_MODULUS |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
6385 _PyHASH_MODULUS = sys.hash_info.modulus |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
6386 # hash values to use for positive and negative infinities, and nans |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
6387 _PyHASH_INF = sys.hash_info.inf |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
6388 _PyHASH_NAN = sys.hash_info.nan |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
6389 |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
6390 # _PyHASH_10INV is the inverse of 10 modulo the prime _PyHASH_MODULUS |
|
0bc8ffe6ba9a
Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents:
61864
diff
changeset
|
6391 _PyHASH_10INV = pow(10, _PyHASH_MODULUS - 2, _PyHASH_MODULUS) |
|
75850
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6392 del sys |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6393 |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6394 try: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6395 import _decimal |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6396 except ImportError: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6397 pass |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6398 else: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6399 s1 = set(dir()) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6400 s2 = set(dir(_decimal)) |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6401 for name in s1 - s2: |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6402 del globals()[name] |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6403 del s1, s2, name |
|
7355550d5357
Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents:
73091
diff
changeset
|
6404 from _decimal import * |
|
32451
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6405 |
|
d2c1c7ae7cf4
Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff
changeset
|
6406 if __name__ == '__main__': |
|
67843
9e65951266a2
Get command-line doctest of Lib/decimal.py to work again.
Raymond Hettinger <python@rcn.com>
parents:
66575
diff
changeset
|
6407 import doctest, decimal |
|
9e65951266a2
Get command-line doctest of Lib/decimal.py to work again.
Raymond Hettinger <python@rcn.com>
parents:
66575
diff
changeset
|
6408 doctest.testmod(decimal) |
