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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
50068b17f41e fix small consistency nit
Fred Drake <fdrake@acm.org>
parents: 32451
diff changeset
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
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
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
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
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
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
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
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
412
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
413 # Map conditions (per the spec) to signals
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
414 _condition_map = {ConversionSyntax:InvalidOperation,
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
415 DivisionImpossible:InvalidOperation,
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
416 DivisionUndefined:InvalidOperation,
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
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
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
428 # work for older Pythons. If threads are not part of the build, create a
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
429 # mock threading object with threading.local() returning the module namespace.
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
430
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
431 try:
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
432 import threading
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
433 except ImportError:
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
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
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
436 def local(self, sys=sys):
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
437 return sys.modules[__name__]
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
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
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
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
9a0c2401c6a6 Revert r86517
Raymond Hettinger <python@rcn.com>
parents: 66236
diff changeset
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
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
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
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
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
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1212 if op1.sign == 1:
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
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
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
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
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1218 elif op1.sign == 1:
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1219 result.sign = 1
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
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
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
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
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
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
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
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
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
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
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4022 __copy__ = copy
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4023
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
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
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
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
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
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
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
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
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
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
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
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
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5605 elif isinstance(value, Decimal):
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
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
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5609 else:
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
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)