annotate Lib/decimal.py @ 65035:87f4b32905df 2.7

Cosmetic fix to use print function.
author Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
date Fri, 01 Oct 2010 10:48:47 +0000
parents 6edc3e2a7da4
children b36cb4602e21
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
33198
017227e47c3d Establish policies with respect to 2.3 compatibilty and treated spec
Raymond Hettinger <python@rcn.com>
parents: 33157
diff changeset
10 # This module is currently Py2.3 compatible and should be kept that way
017227e47c3d Establish policies with respect to 2.3 compatibilty and treated spec
Raymond Hettinger <python@rcn.com>
parents: 33157
diff changeset
11 # unless a major compelling advantage arises. IOW, 2.3 compatibility is
017227e47c3d Establish policies with respect to 2.3 compatibilty and treated spec
Raymond Hettinger <python@rcn.com>
parents: 33157
diff changeset
12 # strongly preferred, but not guaranteed.
017227e47c3d Establish policies with respect to 2.3 compatibilty and treated spec
Raymond Hettinger <python@rcn.com>
parents: 33157
diff changeset
13
017227e47c3d Establish policies with respect to 2.3 compatibilty and treated spec
Raymond Hettinger <python@rcn.com>
parents: 33157
diff changeset
14 # Also, this module should be kept in sync with the latest updates of
017227e47c3d Establish policies with respect to 2.3 compatibilty and treated spec
Raymond Hettinger <python@rcn.com>
parents: 33157
diff changeset
15 # the IBM specification as it evolves. Those updates will be treated
017227e47c3d Establish policies with respect to 2.3 compatibilty and treated spec
Raymond Hettinger <python@rcn.com>
parents: 33157
diff changeset
16 # 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
17 # 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
18 # 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
19
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
20 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
21 This is a Py2.3 implementation of decimal floating point arithmetic based on
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
22 the General Decimal Arithmetic Specification:
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 www2.hursley.ibm.com/decimal/decarith.html
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
25
32489
ab0a2b74ddfd Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents: 32487
diff changeset
26 and IEEE standard 854-1987:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
27
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
28 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
29
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
30 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
31
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
32 The purpose of this module is to support arithmetic using familiar
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
33 "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
34 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
35 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
36 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
37 in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
38 of the expected Decimal('0.00') returned by decimal floating point).
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
39
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
40 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
41
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
42 >>> from decimal import *
32529
2476a8334286 Tim gets his default traps.
Raymond Hettinger <python@rcn.com>
parents: 32528
diff changeset
43 >>> setcontext(ExtendedContext)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
44 >>> Decimal(0)
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
45 Decimal('0')
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
46 >>> Decimal('1')
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
47 Decimal('1')
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
48 >>> Decimal('-.0123')
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
49 Decimal('-0.0123')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
50 >>> Decimal(123456)
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
51 Decimal('123456')
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
52 >>> Decimal('123.45e12345678901234567890')
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
53 Decimal('1.2345E+12345678901234567892')
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
54 >>> Decimal('1.33') + Decimal('1.27')
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
55 Decimal('2.60')
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
56 >>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41')
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
57 Decimal('-2.20')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
58 >>> dig = Decimal(1)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
59 >>> print dig / Decimal(3)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
60 0.333333333
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
61 >>> getcontext().prec = 18
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
62 >>> print dig / Decimal(3)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
63 0.333333333333333333
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
64 >>> print dig.sqrt()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
65 1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
66 >>> print Decimal(3).sqrt()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
67 1.73205080756887729
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
68 >>> print Decimal(3) ** 123
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
69 4.85192780976896427E+58
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
70 >>> inf = Decimal(1) / Decimal(0)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
71 >>> print inf
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
72 Infinity
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
73 >>> neginf = Decimal(-1) / Decimal(0)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
74 >>> print neginf
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
75 -Infinity
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
76 >>> print neginf + inf
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
77 NaN
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
78 >>> print neginf * inf
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
79 -Infinity
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
80 >>> print dig / 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
81 Infinity
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
82 >>> getcontext().traps[DivisionByZero] = 1
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
83 >>> print dig / 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
84 Traceback (most recent call last):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
85 ...
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
86 ...
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
87 ...
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
88 DivisionByZero: x / 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
89 >>> c = Context()
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
90 >>> c.traps[InvalidOperation] = 0
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
91 >>> print c.flags[InvalidOperation]
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
92 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
93 >>> c.divide(Decimal(0), Decimal(0))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
94 Decimal('NaN')
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
95 >>> c.traps[InvalidOperation] = 1
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
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 1
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
98 >>> c.flags[InvalidOperation] = 0
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
99 >>> print c.flags[InvalidOperation]
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
100 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
101 >>> print c.divide(Decimal(0), Decimal(0))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
102 Traceback (most recent call last):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
103 ...
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
104 ...
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
105 ...
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
106 InvalidOperation: 0 / 0
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
107 >>> print c.flags[InvalidOperation]
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
108 1
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
109 >>> c.flags[InvalidOperation] = 0
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
110 >>> c.traps[InvalidOperation] = 0
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
111 >>> print c.divide(Decimal(0), Decimal(0))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
112 NaN
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
113 >>> print c.flags[InvalidOperation]
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
114 1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
115 >>>
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
116 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
117
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
118 __all__ = [
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
119 # Two major classes
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
120 'Decimal', 'Context',
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 # Contexts
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
123 'DefaultContext', 'BasicContext', 'ExtendedContext',
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
124
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
125 # Exceptions
32561
6f351b1bcf53 * Update the test suite to reflect that ConversionSyntax was no longer
Raymond Hettinger <python@rcn.com>
parents: 32560
diff changeset
126 '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
127 'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
128
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
129 # Constants for use in setting up contexts
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
130 'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
131 '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
132
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
133 # Functions for manipulating contexts
39707
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
134 'setcontext', 'getcontext', 'localcontext'
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
135 ]
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
136
53551
1c060d5c47cf Update spec version number.
Raymond Hettinger <python@rcn.com>
parents: 52200
diff changeset
137 __version__ = '1.70' # Highest version of the spec this complies with
52114
4fddcd4e8eb5 Add a version tag to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 51293
diff changeset
138
35035
c55899863b9c Minor namespace clean-up.
Raymond Hettinger <python@rcn.com>
parents: 34812
diff changeset
139 import copy as _copy
50496
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
140 import math as _math
51293
5c254795aa07 Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51027
diff changeset
141 import numbers as _numbers
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
142
44631
3cd9b877eae0 Have Decimal.as_tuple return a named tuple.
Raymond Hettinger <python@rcn.com>
parents: 44593
diff changeset
143 try:
3cd9b877eae0 Have Decimal.as_tuple return a named tuple.
Raymond Hettinger <python@rcn.com>
parents: 44593
diff changeset
144 from collections import namedtuple as _namedtuple
3cd9b877eae0 Have Decimal.as_tuple return a named tuple.
Raymond Hettinger <python@rcn.com>
parents: 44593
diff changeset
145 DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
3cd9b877eae0 Have Decimal.as_tuple return a named tuple.
Raymond Hettinger <python@rcn.com>
parents: 44593
diff changeset
146 except ImportError:
3cd9b877eae0 Have Decimal.as_tuple return a named tuple.
Raymond Hettinger <python@rcn.com>
parents: 44593
diff changeset
147 DecimalTuple = lambda *args: args
3cd9b877eae0 Have Decimal.as_tuple return a named tuple.
Raymond Hettinger <python@rcn.com>
parents: 44593
diff changeset
148
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
149 # Rounding
32489
ab0a2b74ddfd Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents: 32487
diff changeset
150 ROUND_DOWN = 'ROUND_DOWN'
ab0a2b74ddfd Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents: 32487
diff changeset
151 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
152 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
153 ROUND_CEILING = 'ROUND_CEILING'
ab0a2b74ddfd Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents: 32487
diff changeset
154 ROUND_FLOOR = 'ROUND_FLOOR'
ab0a2b74ddfd Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents: 32487
diff changeset
155 ROUND_UP = 'ROUND_UP'
ab0a2b74ddfd Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents: 32487
diff changeset
156 ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
157 ROUND_05UP = 'ROUND_05UP'
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
158
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
159 # Errors
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
160
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
161 class DecimalException(ArithmeticError):
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
162 """Base exception class.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
163
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
164 Used exceptions derive from this.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
165 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
166 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
167 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
168 anything, though.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
169
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
170 handle -- Called when context._raise_error is called and the
61743
8c6f981699e8 Fix typos in docstrings.
Stefan Krah <stefan@bytereef.org>
parents: 61211
diff changeset
171 trap_enabler is not set. First argument is self, second is the
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
172 context. More arguments can be given, those being after
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
173 the explanation in _raise_error (For example,
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
174 context._raise_error(NewError, '(-x)!', self._sign) would
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
175 call NewError().handle(context, self._sign).)
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
176
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
177 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
178 from DecimalException.
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 def handle(self, context, *args):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
181 pass
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
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
184 class Clamped(DecimalException):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
185 """Exponent of a 0 changed to fit bounds.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
186
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
187 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
188 altered in order to fit the constraints of a specific concrete
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
189 representation. This may occur when the exponent of a zero result would
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
190 be outside the bounds of a representation, or when a large normal
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
191 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
192 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
193 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
194 """
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 class InvalidOperation(DecimalException):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
197 """An invalid operation was performed.
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 Various bad things cause this:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
200
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
201 Something creates a signaling NaN
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
202 -INF + INF
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
203 0 * (+-)INF
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
204 (+-)INF / (+-)INF
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
205 x % 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
206 (+-)INF % x
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
207 x._rescale( non-integer )
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
208 sqrt(-x) , x > 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
209 0 ** 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
210 x ** (non-integer)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
211 x ** (+-)INF
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
212 An operand is invalid
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
213
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
214 The result of the operation after these is a quiet positive NaN,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
215 except when the cause is a signaling NaN, in which case the result is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
216 also a quiet NaN, but with the original sign, and an optional
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
217 diagnostic information.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
218 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
219 def handle(self, context, *args):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
220 if args:
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
221 ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
222 return ans._fix_nan(context)
50471
94ff3de1e1a4 Merged revisions 68182 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50116
diff changeset
223 return _NaN
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
224
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
225 class ConversionSyntax(InvalidOperation):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
226 """Trying to convert badly formed string.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
227
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
228 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
229 converted to a number and it does not conform to the numeric string
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
230 syntax. The result is [0,qNaN].
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
231 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
232 def handle(self, context, *args):
50471
94ff3de1e1a4 Merged revisions 68182 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50116
diff changeset
233 return _NaN
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
234
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
235 class DivisionByZero(DecimalException, ZeroDivisionError):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
236 """Division by 0.
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 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
239 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
240 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
241 not zero.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
242
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
243 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
244 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
245 -0, for power.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
246 """
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
247
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
248 def handle(self, context, sign, *args):
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
249 return _SignedInfinity[sign]
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 class DivisionImpossible(InvalidOperation):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
252 """Cannot perform the division adequately.
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 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
255 divide-integer or remainder operation had too many digits (would be
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
256 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
257 """
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
258
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
259 def handle(self, context, *args):
50471
94ff3de1e1a4 Merged revisions 68182 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50116
diff changeset
260 return _NaN
32451
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 class DivisionUndefined(InvalidOperation, ZeroDivisionError):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
263 """Undefined result of division.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
264
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
265 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
266 attempted (during a divide-integer, divide, or remainder operation), and
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
267 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
268 """
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
269
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
270 def handle(self, context, *args):
50471
94ff3de1e1a4 Merged revisions 68182 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50116
diff changeset
271 return _NaN
32451
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 class Inexact(DecimalException):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
274 """Had to round, losing information.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
275
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
276 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
277 not exact (that is, it needed to be rounded and any discarded digits
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
278 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
279 result in all cases is unchanged.
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 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
282 operation (or sequence of operations) was inexact.
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
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
285 class InvalidContext(InvalidOperation):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
286 """Invalid context. Unknown rounding, for example.
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 This occurs and signals invalid-operation if an invalid context was
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
289 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
290 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
291 underlying concrete representation or an unknown or unsupported rounding
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
292 was specified. These aspects of the context need only be checked when
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
293 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
294 """
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
295
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
296 def handle(self, context, *args):
50471
94ff3de1e1a4 Merged revisions 68182 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50116
diff changeset
297 return _NaN
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
298
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
299 class Rounded(DecimalException):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
300 """Number got rounded (not necessarily changed during rounding).
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
301
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
302 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
303 rounded (that is, some zero or non-zero digits were discarded from the
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
304 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
305 result in all cases is unchanged.
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 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
308 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
309 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
310
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
311 class Subnormal(DecimalException):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
312 """Exponent < Emin before rounding.
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 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
315 operation is subnormal (that is, its adjusted exponent is less than
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
316 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
317
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
318 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
319 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
320 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
321
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
322 class Overflow(Inexact, Rounded):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
323 """Numerical overflow.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
324
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
325 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
326 (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
327 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
328 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
329
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
330 The result depends on the rounding mode:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
331
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
332 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
333 round-up, if implemented), the result of the operation is [sign,inf],
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
334 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
335 result is the largest finite number that can be represented in the
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
336 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
337 round-ceiling, the result is the same as for round-down if the sign of
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
338 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
339 the result is the same as for round-down if the sign of the intermediate
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
340 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
341 will also be raised.
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
342 """
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
343
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
344 def handle(self, context, sign, *args):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
345 if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
346 ROUND_HALF_DOWN, ROUND_UP):
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
347 return _SignedInfinity[sign]
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
348 if sign == 0:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
349 if context.rounding == ROUND_CEILING:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
350 return _SignedInfinity[sign]
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
351 return _dec_from_triple(sign, '9'*context.prec,
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
352 context.Emax-context.prec+1)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
353 if sign == 1:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
354 if context.rounding == ROUND_FLOOR:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
355 return _SignedInfinity[sign]
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
356 return _dec_from_triple(sign, '9'*context.prec,
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
357 context.Emax-context.prec+1)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
358
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
359
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
360 class Underflow(Inexact, Rounded, Subnormal):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
361 """Numerical underflow with result rounded to 0.
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 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
364 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
365 the smallest value that can be handled by the implementation (the value
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
366 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
367
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
368 The result after an underflow will be a subnormal number rounded, if
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
369 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
370 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
371
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
372 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
373 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
374
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
375 # 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
376 _signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
377 Underflow, InvalidOperation, Subnormal]
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
378
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
379 # Map conditions (per the spec) to signals
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
380 _condition_map = {ConversionSyntax:InvalidOperation,
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
381 DivisionImpossible:InvalidOperation,
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
382 DivisionUndefined:InvalidOperation,
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
383 InvalidContext:InvalidOperation}
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
384
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
385 ##### Context Functions ##################################################
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
386
32675
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
387 # 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
388 # current context. Py2.4 offers direct support for thread locals. If that
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
389 # is not available, use threading.currentThread() which is slower but will
34184
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
390 # work for older Pythons. If threads are not part of the build, create a
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
391 # mock threading object with threading.local() returning the module namespace.
34184
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
392
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
393 try:
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
394 import threading
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
395 except ImportError:
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
396 # Python was compiled without threads; create a mock object instead
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
397 import sys
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
398 class MockThreading(object):
34184
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
399 def local(self, sys=sys):
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
400 return sys.modules[__name__]
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
401 threading = MockThreading()
36cf94f57415 Bug #1083645
Raymond Hettinger <python@rcn.com>
parents: 34023
diff changeset
402 del sys, MockThreading
32675
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
403
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
404 try:
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
405 threading.local
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
406
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
407 except AttributeError:
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
408
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
409 # To fix reloading, force it to create a new context
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
410 # Old contexts have different exceptions in their dicts, making problems.
32675
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
411 if hasattr(threading.currentThread(), '__decimal_context__'):
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
412 del threading.currentThread().__decimal_context__
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
413
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
414 def setcontext(context):
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
415 """Set this thread's context to context."""
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
416 if context in (DefaultContext, BasicContext, ExtendedContext):
33044
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
417 context = context.copy()
32980
e89ef0bfa1ff SF bug #1002530: test_decimal fails if repeated
Raymond Hettinger <python@rcn.com>
parents: 32675
diff changeset
418 context.clear_flags()
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
419 threading.currentThread().__decimal_context__ = context
32675
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
420
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
421 def getcontext():
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
422 """Returns this thread's context.
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
423
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
424 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
425 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
426 New contexts are copies of DefaultContext.
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
427 """
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
428 try:
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
429 return threading.currentThread().__decimal_context__
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
430 except AttributeError:
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
431 context = Context()
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
432 threading.currentThread().__decimal_context__ = context
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
433 return context
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
434
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
435 else:
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
436
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
437 local = threading.local()
33044
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
438 if hasattr(local, '__decimal_context__'):
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
439 del local.__decimal_context__
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 def getcontext(_local=local):
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
442 """Returns this thread's context.
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 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
445 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
446 New contexts are copies of DefaultContext.
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
447 """
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
448 try:
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
449 return _local.__decimal_context__
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
450 except AttributeError:
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
451 context = Context()
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
452 _local.__decimal_context__ = context
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
453 return context
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
454
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
455 def setcontext(context, _local=local):
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
456 """Set this thread's context to context."""
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
457 if context in (DefaultContext, BasicContext, ExtendedContext):
33044
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
458 context = context.copy()
32980
e89ef0bfa1ff SF bug #1002530: test_decimal fails if repeated
Raymond Hettinger <python@rcn.com>
parents: 32675
diff changeset
459 context.clear_flags()
32675
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
460 _local.__decimal_context__ = context
949473fa4828 Use threading.local() instead of threading.currentThread().
Raymond Hettinger <python@rcn.com>
parents: 32674
diff changeset
461
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
462 del threading, local # Don't contaminate the namespace
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
463
39707
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
464 def localcontext(ctx=None):
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
465 """Return a context manager for a copy of the supplied context
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
466
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
467 Uses a copy of the current context if no context is specified
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
468 The returned context manager creates a local decimal context
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
469 in a with statement:
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
470 def sin(x):
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
471 with localcontext() as ctx:
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
472 ctx.prec += 2
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
473 # Rest of sin calculation algorithm
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
474 # uses a precision 2 greater than normal
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
475 return +s # Convert result to normal precision
39707
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
476
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
477 def sin(x):
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
478 with localcontext(ExtendedContext):
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
479 # Rest of sin calculation algorithm
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
480 # uses the Extended Context from the
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
481 # General Decimal Arithmetic Specification
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
482 return +s # Convert result to normal context
39707
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
483
46625
c4d90fa935ea Fixed some test structures. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 46087
diff changeset
484 >>> setcontext(DefaultContext)
39707
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
485 >>> print getcontext().prec
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
486 28
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
487 >>> with localcontext():
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
488 ... ctx = getcontext()
40770
9f5eaea3c795 Fix docstring bug
Raymond Hettinger <python@rcn.com>
parents: 39724
diff changeset
489 ... ctx.prec += 2
39707
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
490 ... print ctx.prec
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
491 ...
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
492 30
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
493 >>> with localcontext(ExtendedContext):
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
494 ... print getcontext().prec
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
495 ...
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
496 9
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
497 >>> print getcontext().prec
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
498 28
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
499 """
39721
2f086d58ca10 Make decimal.ContextManager a private implementation detail of decimal.localcontext()
Nick Coghlan <ncoghlan@gmail.com>
parents: 39707
diff changeset
500 if ctx is None: ctx = getcontext()
2f086d58ca10 Make decimal.ContextManager a private implementation detail of decimal.localcontext()
Nick Coghlan <ncoghlan@gmail.com>
parents: 39707
diff changeset
501 return _ContextManager(ctx)
39707
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
502
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
503
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
504 ##### Decimal class #######################################################
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
505
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
506 class Decimal(object):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
507 """Floating point class for decimal arithmetic."""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
508
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
509 __slots__ = ('_exp','_int','_sign', '_is_special')
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
510 # 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
511 # (-1)**_sign * _int * 10**_exp
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
512 # Special values are signified by _is_special == True
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
513
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
514 # 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
515 def __new__(cls, value="0", context=None):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
516 """Create a decimal point instance.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
517
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
518 >>> Decimal('3.14') # string input
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
519 Decimal('3.14')
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
520 >>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent)
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
521 Decimal('3.14')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
522 >>> Decimal(314) # int or long
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
523 Decimal('314')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
524 >>> Decimal(Decimal(314)) # another decimal instance
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
525 Decimal('314')
44650
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
526 >>> Decimal(' 3.14 \\n') # leading and trailing whitespace okay
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
527 Decimal('3.14')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
528 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
529
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
530 # Note that the coefficient, self._int, is actually stored as
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
531 # a string rather than as a tuple of digits. This speeds up
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
532 # the "digits to integer" and "integer to digits" conversions
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
533 # that are used in almost every arithmetic operation on
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
534 # Decimals. This is an internal detail: the as_tuple function
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
535 # and the Decimal constructor still deal with tuples of
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
536 # digits.
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
537
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
538 self = object.__new__(cls)
44068
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
539
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
540 # From a string
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
541 # REs insist on real strings, so we can too.
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
542 if isinstance(value, basestring):
44650
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
543 m = _parser(value.strip())
44068
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
544 if m is None:
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
545 if context is None:
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
546 context = getcontext()
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
547 return context._raise_error(ConversionSyntax,
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
548 "Invalid literal for Decimal: %r" % value)
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
549
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
550 if m.group('sign') == "-":
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
551 self._sign = 1
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
552 else:
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
553 self._sign = 0
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
554 intpart = m.group('int')
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
555 if intpart is not None:
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
556 # finite number
55518
7c23f0bcca85 Issue #6595: Allow Decimal constructor to accept non-European decimal
Mark Dickinson <dickinsm@gmail.com>
parents: 53551
diff changeset
557 fracpart = m.group('frac') or ''
44068
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
558 exp = int(m.group('exp') or '0')
55518
7c23f0bcca85 Issue #6595: Allow Decimal constructor to accept non-European decimal
Mark Dickinson <dickinsm@gmail.com>
parents: 53551
diff changeset
559 self._int = str(int(intpart+fracpart))
7c23f0bcca85 Issue #6595: Allow Decimal constructor to accept non-European decimal
Mark Dickinson <dickinsm@gmail.com>
parents: 53551
diff changeset
560 self._exp = exp - len(fracpart)
44068
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
561 self._is_special = False
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
562 else:
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
563 diag = m.group('diag')
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
564 if diag is not None:
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
565 # NaN
55518
7c23f0bcca85 Issue #6595: Allow Decimal constructor to accept non-European decimal
Mark Dickinson <dickinsm@gmail.com>
parents: 53551
diff changeset
566 self._int = str(int(diag or '0')).lstrip('0')
44068
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
567 if m.group('signal'):
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
568 self._exp = 'N'
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
569 else:
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
570 self._exp = 'n'
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
571 else:
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
572 # infinity
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
573 self._int = '0'
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
574 self._exp = 'F'
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
575 self._is_special = True
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
576 return self
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
577
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
578 # From an integer
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
579 if isinstance(value, (int,long)):
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
580 if value >= 0:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
581 self._sign = 0
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
582 else:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
583 self._sign = 1
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
584 self._exp = 0
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
585 self._int = str(abs(value))
44068
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
586 self._is_special = False
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
587 return self
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
588
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
589 # From another decimal
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
590 if isinstance(value, Decimal):
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
591 self._exp = value._exp
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
592 self._sign = value._sign
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
593 self._int = value._int
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
594 self._is_special = value._is_special
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
595 return self
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
596
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
597 # From an internal working value
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
598 if isinstance(value, _WorkRep):
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
599 self._sign = value.sign
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
600 self._int = str(value.int)
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
601 self._exp = int(value.exp)
53113106febb Reordering of __new__ to minimize isinstance() calls to most
Facundo Batista <facundobatista@gmail.com>
parents: 43993
diff changeset
602 self._is_special = False
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
603 return self
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
604
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
605 # tuple/list conversion (possibly from as_tuple())
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
606 if isinstance(value, (list,tuple)):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
607 if len(value) != 3:
43602
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
608 raise ValueError('Invalid tuple size in creation of Decimal '
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
609 'from list or tuple. The list or tuple '
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
610 'should have exactly three elements.')
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
611 # process sign. The isinstance test rejects floats
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
612 if not (isinstance(value[0], (int, long)) and value[0] in (0,1)):
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
613 raise ValueError("Invalid sign. The first value in the tuple "
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
614 "should be an integer; either 0 for a "
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
615 "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
616 self._sign = value[0]
43602
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
617 if value[2] == 'F':
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
618 # infinity: value[1] is ignored
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
619 self._int = '0'
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
620 self._exp = value[2]
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
621 self._is_special = True
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
622 else:
43602
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
623 # process and validate the digits in value[1]
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
624 digits = []
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
625 for digit in value[1]:
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
626 if isinstance(digit, (int, long)) and 0 <= digit <= 9:
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
627 # skip leading zeros
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
628 if digits or digit != 0:
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
629 digits.append(digit)
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
630 else:
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
631 raise ValueError("The second value in the tuple must "
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
632 "be composed of integers in the range "
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
633 "0 through 9.")
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
634 if value[2] in ('n', 'N'):
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
635 # NaN: digits form the diagnostic
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
636 self._int = ''.join(map(str, digits))
43602
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
637 self._exp = value[2]
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
638 self._is_special = True
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
639 elif isinstance(value[2], (int, long)):
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
640 # finite number: digits give the coefficient
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
641 self._int = ''.join(map(str, digits or [0]))
43602
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
642 self._exp = value[2]
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
643 self._is_special = False
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
644 else:
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
645 raise ValueError("The third value in the tuple must "
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
646 "be an integer, or one of the "
80744c8d34d8 The constructor from tuple was way too permissive: it allowed bad
Facundo Batista <facundobatista@gmail.com>
parents: 43455
diff changeset
647 "strings 'F', 'n', 'N'.")
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
648 return self
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
649
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
650 if isinstance(value, float):
60173
cca4b72f450b Issue 8257: Decimal constructor to accept float.
Raymond Hettinger <python@rcn.com>
parents: 60156
diff changeset
651 value = Decimal.from_float(value)
cca4b72f450b Issue 8257: Decimal constructor to accept float.
Raymond Hettinger <python@rcn.com>
parents: 60156
diff changeset
652 self._exp = value._exp
cca4b72f450b Issue 8257: Decimal constructor to accept float.
Raymond Hettinger <python@rcn.com>
parents: 60156
diff changeset
653 self._sign = value._sign
cca4b72f450b Issue 8257: Decimal constructor to accept float.
Raymond Hettinger <python@rcn.com>
parents: 60156
diff changeset
654 self._int = value._int
cca4b72f450b Issue 8257: Decimal constructor to accept float.
Raymond Hettinger <python@rcn.com>
parents: 60156
diff changeset
655 self._is_special = value._is_special
cca4b72f450b Issue 8257: Decimal constructor to accept float.
Raymond Hettinger <python@rcn.com>
parents: 60156
diff changeset
656 return self
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
657
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
658 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
659
50595
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
660 # @classmethod, but @decorator is not valid Python 2.3 syntax, so
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
661 # don't use it (see notes on Py2.3 compatibility at top of file)
50496
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
662 def from_float(cls, f):
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
663 """Converts a float to a decimal number, exactly.
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
664
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
665 Note that Decimal.from_float(0.1) is not the same as Decimal('0.1').
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
666 Since 0.1 is not exactly representable in binary floating point, the
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
667 value is stored as the nearest representable value which is
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
668 0x1.999999999999ap-4. The exact equivalent of the value in decimal
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
669 is 0.1000000000000000055511151231257827021181583404541015625.
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
670
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
671 >>> Decimal.from_float(0.1)
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
672 Decimal('0.1000000000000000055511151231257827021181583404541015625')
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
673 >>> Decimal.from_float(float('nan'))
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
674 Decimal('NaN')
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
675 >>> Decimal.from_float(float('inf'))
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
676 Decimal('Infinity')
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
677 >>> Decimal.from_float(-float('inf'))
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
678 Decimal('-Infinity')
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
679 >>> Decimal.from_float(-0.0)
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
680 Decimal('-0')
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
681
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
682 """
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
683 if isinstance(f, (int, long)): # handle integer inputs
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
684 return cls(f)
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
685 if _math.isinf(f) or _math.isnan(f): # raises TypeError if not a float
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
686 return cls(repr(f))
50595
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
687 if _math.copysign(1.0, f) == 1.0:
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
688 sign = 0
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
689 else:
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
690 sign = 1
50496
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
691 n, d = abs(f).as_integer_ratio()
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
692 k = d.bit_length() - 1
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
693 result = _dec_from_triple(sign, str(n*5**k), -k)
50595
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
694 if cls is Decimal:
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
695 return result
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
696 else:
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
697 return cls(result)
2cafe989117a Fix Decimal.from_float to use valid Python 2.3 syntax, as per
Mark Dickinson <dickinsm@gmail.com>
parents: 50497
diff changeset
698 from_float = classmethod(from_float)
50496
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
699
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
700 def _isnan(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
701 """Returns whether the number is not actually one.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
702
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
703 0 if a number
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
704 1 if NaN
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
705 2 if sNaN
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
706 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
707 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
708 exp = self._exp
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
709 if exp == 'n':
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
710 return 1
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
711 elif exp == 'N':
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
712 return 2
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
713 return 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
714
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
715 def _isinfinity(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
716 """Returns whether the number is infinite
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
717
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
718 0 if finite or not a number
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
719 1 if +INF
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
720 -1 if -INF
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
721 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
722 if self._exp == 'F':
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
723 if self._sign:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
724 return -1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
725 return 1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
726 return 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
727
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
728 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
729 """Returns whether the number is not actually one.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
730
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
731 if self, other are sNaN, signal
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
732 if self, other are NaN return nan
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
733 return 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
734
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
735 Done before operations.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
736 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
737
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
738 self_is_nan = self._isnan()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
739 if other is None:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
740 other_is_nan = False
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
741 else:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
742 other_is_nan = other._isnan()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
743
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
744 if self_is_nan or other_is_nan:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
745 if context is None:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
746 context = getcontext()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
747
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
748 if self_is_nan == 2:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
749 return context._raise_error(InvalidOperation, 'sNaN',
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
750 self)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
751 if other_is_nan == 2:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
752 return context._raise_error(InvalidOperation, 'sNaN',
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
753 other)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
754 if self_is_nan:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
755 return self._fix_nan(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
756
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
757 return other._fix_nan(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
758 return 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
759
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
760 def _compare_check_nans(self, other, context):
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
761 """Version of _check_nans used for the signaling comparisons
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
762 compare_signal, __le__, __lt__, __ge__, __gt__.
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
763
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
764 Signal InvalidOperation if either self or other is a (quiet
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
765 or signaling) NaN. Signaling NaNs take precedence over quiet
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
766 NaNs.
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
767
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
768 Return 0 if neither operand is a NaN.
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
769
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
770 """
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
771 if context is None:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
772 context = getcontext()
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
773
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
774 if self._is_special or other._is_special:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
775 if self.is_snan():
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
776 return context._raise_error(InvalidOperation,
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
777 'comparison involving sNaN',
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
778 self)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
779 elif other.is_snan():
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
780 return context._raise_error(InvalidOperation,
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
781 'comparison involving sNaN',
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
782 other)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
783 elif self.is_qnan():
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
784 return context._raise_error(InvalidOperation,
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
785 'comparison involving NaN',
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
786 self)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
787 elif other.is_qnan():
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
788 return context._raise_error(InvalidOperation,
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
789 'comparison involving NaN',
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
790 other)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
791 return 0
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
792
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
793 def __nonzero__(self):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
794 """Return True if self is nonzero; otherwise return False.
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
795
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
796 NaNs and infinities are considered nonzero.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
797 """
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
798 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
799
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
800 def _cmp(self, other):
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
801 """Compare the two non-NaN decimal instances self and other.
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
802
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
803 Returns -1 if self < other, 0 if self == other and 1
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
804 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
805
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
806 if self._is_special or other._is_special:
51027
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
807 self_inf = self._isinfinity()
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
808 other_inf = other._isinfinity()
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
809 if self_inf == other_inf:
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
810 return 0
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
811 elif self_inf < other_inf:
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
812 return -1
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
813 else:
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
814 return 1
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
815
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
816 # check for zeros; Decimal('0') == Decimal('-0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
817 if not self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
818 if not other:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
819 return 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
820 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
821 return -((-1)**other._sign)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
822 if not other:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
823 return (-1)**self._sign
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
824
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
825 # If different signs, neg one is less
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
826 if other._sign < self._sign:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
827 return -1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
828 if self._sign < other._sign:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
829 return 1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
830
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
831 self_adjusted = self.adjusted()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
832 other_adjusted = other.adjusted()
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
833 if self_adjusted == other_adjusted:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
834 self_padded = self._int + '0'*(self._exp - other._exp)
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
835 other_padded = other._int + '0'*(other._exp - self._exp)
51027
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
836 if self_padded == other_padded:
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
837 return 0
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
838 elif self_padded < other_padded:
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
839 return -(-1)**self._sign
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
840 else:
c4c4e4b1dc1a Remove uses of cmp from the decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 50598
diff changeset
841 return (-1)**self._sign
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
842 elif self_adjusted > other_adjusted:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
843 return (-1)**self._sign
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
844 else: # self_adjusted < other_adjusted
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
845 return -((-1)**self._sign)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
846
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
847 # Note: The Decimal standard doesn't cover rich comparisons for
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
848 # Decimals. In particular, the specification is silent on the
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
849 # subject of what should happen for a comparison involving a NaN.
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
850 # We take the following approach:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
851 #
60155
ae7cf578de5a Issue #7279: Make comparisons involving a Decimal sNaN signal InvalidOperation.
Mark Dickinson <dickinsm@gmail.com>
parents: 60151
diff changeset
852 # == comparisons involving a quiet NaN always return False
ae7cf578de5a Issue #7279: Make comparisons involving a Decimal sNaN signal InvalidOperation.
Mark Dickinson <dickinsm@gmail.com>
parents: 60151
diff changeset
853 # != comparisons involving a quiet NaN always return True
ae7cf578de5a Issue #7279: Make comparisons involving a Decimal sNaN signal InvalidOperation.
Mark Dickinson <dickinsm@gmail.com>
parents: 60151
diff changeset
854 # == or != comparisons involving a signaling NaN signal
ae7cf578de5a Issue #7279: Make comparisons involving a Decimal sNaN signal InvalidOperation.
Mark Dickinson <dickinsm@gmail.com>
parents: 60151
diff changeset
855 # InvalidOperation, and return False or True as above if the
ae7cf578de5a Issue #7279: Make comparisons involving a Decimal sNaN signal InvalidOperation.
Mark Dickinson <dickinsm@gmail.com>
parents: 60151
diff changeset
856 # InvalidOperation is not trapped.
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
857 # <, >, <= and >= comparisons involving a (quiet or signaling)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
858 # NaN signal InvalidOperation, and return False if the
45269
fb551c938a59 Typos in decimal comment and documentation
Mark Dickinson <dickinsm@gmail.com>
parents: 45201
diff changeset
859 # InvalidOperation is not trapped.
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
860 #
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
861 # This behavior is designed to conform as closely as possible to
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
862 # that specified by IEEE 754.
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
863
60155
ae7cf578de5a Issue #7279: Make comparisons involving a Decimal sNaN signal InvalidOperation.
Mark Dickinson <dickinsm@gmail.com>
parents: 60151
diff changeset
864 def __eq__(self, other, context=None):
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
865 other = _convert_other(other, allow_float=True)
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
866 if other is NotImplemented:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
867 return other
60155
ae7cf578de5a Issue #7279: Make comparisons involving a Decimal sNaN signal InvalidOperation.
Mark Dickinson <dickinsm@gmail.com>
parents: 60151
diff changeset
868 if self._check_nans(other, context):
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
869 return False
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
870 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
871
60155
ae7cf578de5a Issue #7279: Make comparisons involving a Decimal sNaN signal InvalidOperation.
Mark Dickinson <dickinsm@gmail.com>
parents: 60151
diff changeset
872 def __ne__(self, other, context=None):
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
873 other = _convert_other(other, allow_float=True)
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
874 if other is NotImplemented:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
875 return other
60155
ae7cf578de5a Issue #7279: Make comparisons involving a Decimal sNaN signal InvalidOperation.
Mark Dickinson <dickinsm@gmail.com>
parents: 60151
diff changeset
876 if self._check_nans(other, context):
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
877 return True
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
878 return self._cmp(other) != 0
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
879
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
880 def __lt__(self, other, context=None):
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
881 other = _convert_other(other, allow_float=True)
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
882 if other is NotImplemented:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
883 return other
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
884 ans = self._compare_check_nans(other, context)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
885 if ans:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
886 return False
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
887 return self._cmp(other) < 0
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
888
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
889 def __le__(self, other, context=None):
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
890 other = _convert_other(other, allow_float=True)
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
891 if other is NotImplemented:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
892 return other
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
893 ans = self._compare_check_nans(other, context)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
894 if ans:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
895 return False
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
896 return self._cmp(other) <= 0
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
897
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
898 def __gt__(self, other, context=None):
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
899 other = _convert_other(other, allow_float=True)
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
900 if other is NotImplemented:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
901 return other
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
902 ans = self._compare_check_nans(other, context)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
903 if ans:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
904 return False
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
905 return self._cmp(other) > 0
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
906
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
907 def __ge__(self, other, context=None):
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
908 other = _convert_other(other, allow_float=True)
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
909 if other is NotImplemented:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
910 return other
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
911 ans = self._compare_check_nans(other, context)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
912 if ans:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
913 return False
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
914 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
915
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
916 def compare(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
917 """Compares one to another.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
918
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
919 -1 => a < b
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
920 0 => a = b
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
921 1 => a > b
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
922 NaN => one is NaN
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
923 Like __cmp__, but returns Decimal instances.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
924 """
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
925 other = _convert_other(other, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
926
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
927 # Compare(NaN, NaN) = NaN
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
928 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
929 ans = self._check_nans(other, context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
930 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
931 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
932
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
933 return Decimal(self._cmp(other))
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
934
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
935 def __hash__(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
936 """x.__hash__() <==> hash(x)"""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
937 # Decimal integers must hash the same as the ints
44593
057de46ea17e Issue #1757: The hash of a Decimal instance is no longer affected
Facundo Batista <facundobatista@gmail.com>
parents: 44352
diff changeset
938 #
057de46ea17e Issue #1757: The hash of a Decimal instance is no longer affected
Facundo Batista <facundobatista@gmail.com>
parents: 44352
diff changeset
939 # The hash of a nonspecial noninteger Decimal must depend only
057de46ea17e Issue #1757: The hash of a Decimal instance is no longer affected
Facundo Batista <facundobatista@gmail.com>
parents: 44352
diff changeset
940 # on the value of that Decimal, and not on its representation.
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
941 # For example: hash(Decimal('100E-1')) == hash(Decimal('10')).
60156
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
942
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
943 # Equality comparisons involving signaling nans can raise an
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
944 # exception; since equality checks are implicitly and
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
945 # unpredictably used when checking set and dict membership, we
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
946 # prevent signaling nans from being used as set elements or
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
947 # dict keys by making __hash__ raise an exception.
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
948 if self._is_special:
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
949 if self.is_snan():
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
950 raise TypeError('Cannot hash a signaling NaN value.')
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
951 elif self.is_nan():
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
952 # 0 to match hash(float('nan'))
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
953 return 0
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
954 else:
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
955 # values chosen to match hash(float('inf')) and
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
956 # hash(float('-inf')).
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
957 if self._sign:
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
958 return -271828
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
959 else:
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
960 return 314159
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
961
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
962 # In Python 2.7, we're allowing comparisons (but not
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
963 # arithmetic operations) between floats and Decimals; so if
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
964 # a Decimal instance is exactly representable as a float then
60156
17f08d65cc0d Issue #7279: Make Decimal('nan') hashable. Decimal('snan') remains unhashable.
Mark Dickinson <dickinsm@gmail.com>
parents: 60155
diff changeset
965 # its hash should match that of the float.
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
966 self_as_float = float(self)
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
967 if Decimal.from_float(self_as_float) == self:
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
968 return hash(self_as_float)
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
969
43409
357cf07a23fe Issue #1772851. Optimization of __hash__ to behave better for big big
Facundo Batista <facundobatista@gmail.com>
parents: 43391
diff changeset
970 if self._isinteger():
357cf07a23fe Issue #1772851. Optimization of __hash__ to behave better for big big
Facundo Batista <facundobatista@gmail.com>
parents: 43391
diff changeset
971 op = _WorkRep(self.to_integral_value())
357cf07a23fe Issue #1772851. Optimization of __hash__ to behave better for big big
Facundo Batista <facundobatista@gmail.com>
parents: 43391
diff changeset
972 # to make computation feasible for Decimals with large
357cf07a23fe Issue #1772851. Optimization of __hash__ to behave better for big big
Facundo Batista <facundobatista@gmail.com>
parents: 43391
diff changeset
973 # exponent, we use the fact that hash(n) == hash(m) for
357cf07a23fe Issue #1772851. Optimization of __hash__ to behave better for big big
Facundo Batista <facundobatista@gmail.com>
parents: 43391
diff changeset
974 # any two nonzero integers n and m such that (i) n and m
357cf07a23fe Issue #1772851. Optimization of __hash__ to behave better for big big
Facundo Batista <facundobatista@gmail.com>
parents: 43391
diff changeset
975 # have the same sign, and (ii) n is congruent to m modulo
357cf07a23fe Issue #1772851. Optimization of __hash__ to behave better for big big
Facundo Batista <facundobatista@gmail.com>
parents: 43391
diff changeset
976 # 2**64-1. So we can replace hash((-1)**s*c*10**e) with
357cf07a23fe Issue #1772851. Optimization of __hash__ to behave better for big big
Facundo Batista <facundobatista@gmail.com>
parents: 43391
diff changeset
977 # hash((-1)**s*c*pow(10, e, 2**64-1).
357cf07a23fe Issue #1772851. Optimization of __hash__ to behave better for big big
Facundo Batista <facundobatista@gmail.com>
parents: 43391
diff changeset
978 return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1))
44593
057de46ea17e Issue #1757: The hash of a Decimal instance is no longer affected
Facundo Batista <facundobatista@gmail.com>
parents: 44352
diff changeset
979 # The value of a nonzero nonspecial Decimal instance is
057de46ea17e Issue #1757: The hash of a Decimal instance is no longer affected
Facundo Batista <facundobatista@gmail.com>
parents: 44352
diff changeset
980 # faithfully represented by the triple consisting of its sign,
057de46ea17e Issue #1757: The hash of a Decimal instance is no longer affected
Facundo Batista <facundobatista@gmail.com>
parents: 44352
diff changeset
981 # its adjusted exponent, and its coefficient with trailing
057de46ea17e Issue #1757: The hash of a Decimal instance is no longer affected
Facundo Batista <facundobatista@gmail.com>
parents: 44352
diff changeset
982 # zeros removed.
057de46ea17e Issue #1757: The hash of a Decimal instance is no longer affected
Facundo Batista <facundobatista@gmail.com>
parents: 44352
diff changeset
983 return hash((self._sign,
057de46ea17e Issue #1757: The hash of a Decimal instance is no longer affected
Facundo Batista <facundobatista@gmail.com>
parents: 44352
diff changeset
984 self._exp+len(self._int),
057de46ea17e Issue #1757: The hash of a Decimal instance is no longer affected
Facundo Batista <facundobatista@gmail.com>
parents: 44352
diff changeset
985 self._int.rstrip('0')))
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
986
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
987 def as_tuple(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
988 """Represents the number as a triple tuple.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
989
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
990 To show the internals exactly as they are.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
991 """
44631
3cd9b877eae0 Have Decimal.as_tuple return a named tuple.
Raymond Hettinger <python@rcn.com>
parents: 44593
diff changeset
992 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
993
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
994 def __repr__(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
995 """Represents the number as an instance of Decimal."""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
996 # Invariant: eval(repr(d)) == d
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
997 return "Decimal('%s')" % str(self)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
998
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
999 def __str__(self, eng=False, context=None):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1000 """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
1001
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1002 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
1003 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1004
44120
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1005 sign = ['', '-'][self._sign]
35113
adf189eb4f58 Apply the _is_special guard.
Raymond Hettinger <python@rcn.com>
parents: 35035
diff changeset
1006 if self._is_special:
44120
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1007 if self._exp == 'F':
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1008 return sign + 'Infinity'
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1009 elif self._exp == 'n':
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1010 return sign + 'NaN' + self._int
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1011 else: # self._exp == 'N'
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1012 return sign + 'sNaN' + self._int
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1013
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1014 # number of digits of self._int to left of decimal point
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1015 leftdigits = self._exp + len(self._int)
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1016
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1017 # dotplace is number of digits of self._int to the left of the
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1018 # decimal point in the mantissa of the output string (that is,
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1019 # after adjusting the exponent)
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1020 if self._exp <= 0 and leftdigits > -6:
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1021 # no exponent required
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1022 dotplace = leftdigits
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1023 elif not eng:
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1024 # usual scientific notation: 1 digit on left of the point
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1025 dotplace = 1
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1026 elif self._int == '0':
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1027 # engineering notation, zero
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1028 dotplace = (leftdigits + 1) % 3 - 1
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1029 else:
44120
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1030 # engineering notation, nonzero
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1031 dotplace = (leftdigits - 1) % 3 + 1
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1032
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1033 if dotplace <= 0:
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1034 intpart = '0'
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1035 fracpart = '.' + '0'*(-dotplace) + self._int
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1036 elif dotplace >= len(self._int):
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1037 intpart = self._int+'0'*(dotplace-len(self._int))
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1038 fracpart = ''
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1039 else:
44120
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1040 intpart = self._int[:dotplace]
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1041 fracpart = '.' + self._int[dotplace:]
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1042 if leftdigits == dotplace:
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1043 exp = ''
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1044 else:
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1045 if context is None:
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1046 context = getcontext()
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1047 exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1048
fe6bedafb46a Speedup and cleaning of __str__. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44068
diff changeset
1049 return sign + intpart + fracpart + exp
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1050
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1051 def to_eng_string(self, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1052 """Convert to engineering-type string.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1053
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1054 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
1055 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
1056
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1057 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
1058 """
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1059 return self.__str__(eng=True, context=context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1060
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1061 def __neg__(self, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1062 """Returns a copy with the sign switched.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1063
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1064 Rounds, if it has reason.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1065 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1066 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1067 ans = self._check_nans(context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1068 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1069 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1070
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1071 if not self:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1072 # -Decimal('0') is Decimal('0'), not Decimal('-0')
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
1073 ans = self.copy_abs()
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1074 else:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1075 ans = self.copy_negate()
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1076
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1077 if context is None:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1078 context = getcontext()
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1079 return ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1080
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1081 def __pos__(self, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1082 """Returns a copy, unless it is a sNaN.
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 Rounds the number (if more then precision digits)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1085 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1086 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1087 ans = self._check_nans(context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1088 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1089 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1090
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1091 if not self:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1092 # + (-0) = 0
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
1093 ans = self.copy_abs()
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1094 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1095 ans = Decimal(self)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1096
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1097 if context is None:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1098 context = getcontext()
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1099 return ans._fix(context)
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1100
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1101 def __abs__(self, round=True, context=None):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1102 """Returns the absolute value of self.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1103
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1104 If the keyword argument 'round' is false, do not round. The
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1105 expression self.__abs__(round=False) is equivalent to
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1106 self.copy_abs().
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1107 """
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1108 if not round:
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1109 return self.copy_abs()
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
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
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1116 if self._sign:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1117 ans = self.__neg__(context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1118 else:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1119 ans = self.__pos__(context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1120
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1121 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1122
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1123 def __add__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1124 """Returns self + other.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1125
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1126 -INF + INF (or the reverse) cause InvalidOperation errors.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1127 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1128 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
1129 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1130 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1131
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1132 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1133 context = getcontext()
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1134
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1135 if self._is_special or other._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1136 ans = self._check_nans(other, context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1137 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1138 return ans
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1139
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1140 if self._isinfinity():
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
1141 # 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
1142 if self._sign != other._sign and other._isinfinity():
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1143 return context._raise_error(InvalidOperation, '-INF + INF')
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1144 return Decimal(self)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1145 if other._isinfinity():
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
1146 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
1147
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1148 exp = min(self._exp, other._exp)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1149 negativezero = 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1150 if context.rounding == ROUND_FLOOR and self._sign != other._sign:
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
1151 # 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
1152 negativezero = 1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1153
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1154 if not self and not other:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1155 sign = min(self._sign, other._sign)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1156 if negativezero:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1157 sign = 1
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1158 ans = _dec_from_triple(sign, '0', exp)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1159 ans = ans._fix(context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1160 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1161 if not self:
33845
032f342efcd2 Very few little improvements.
Facundo Batista <facundobatista@gmail.com>
parents: 33803
diff changeset
1162 exp = max(exp, other._exp - context.prec-1)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1163 ans = other._rescale(exp, context.rounding)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1164 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1165 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1166 if not other:
33845
032f342efcd2 Very few little improvements.
Facundo Batista <facundobatista@gmail.com>
parents: 33803
diff changeset
1167 exp = max(exp, self._exp - context.prec-1)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1168 ans = self._rescale(exp, context.rounding)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1169 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1170 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1171
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1172 op1 = _WorkRep(self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1173 op2 = _WorkRep(other)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1174 op1, op2 = _normalize(op1, op2, context.prec)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1175
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1176 result = _WorkRep()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1177 if op1.sign != op2.sign:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1178 # Equal and opposite
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1179 if op1.int == op2.int:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1180 ans = _dec_from_triple(negativezero, '0', exp)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1181 ans = ans._fix(context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1182 return ans
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1183 if op1.int < op2.int:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1184 op1, op2 = op2, op1
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
1185 # OK, now abs(op1) > abs(op2)
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1186 if op1.sign == 1:
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1187 result.sign = 1
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1188 op1.sign, op2.sign = op2.sign, op1.sign
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1189 else:
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1190 result.sign = 0
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
1191 # So we know the sign, and op1 > 0.
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1192 elif op1.sign == 1:
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1193 result.sign = 1
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1194 op1.sign, op2.sign = (0, 0)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1195 else:
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1196 result.sign = 0
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
1197 # Now, op1 > abs(op2) > 0
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1198
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1199 if op2.sign == 0:
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1200 result.int = op1.int + op2.int
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1201 else:
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1202 result.int = op1.int - op2.int
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1203
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1204 result.exp = op1.exp
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1205 ans = Decimal(result)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1206 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1207 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1208
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1209 __radd__ = __add__
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1210
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1211 def __sub__(self, other, context=None):
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1212 """Return self - other"""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1213 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
1214 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1215 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1216
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1217 if self._is_special or other._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1218 ans = self._check_nans(other, context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1219 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1220 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1221
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1222 # self - other is computed as self + other.copy_negate()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1223 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
1224
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1225 def __rsub__(self, other, context=None):
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1226 """Return other - self"""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1227 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
1228 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1229 return other
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1230
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1231 return other.__sub__(self, context=context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1232
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1233 def __mul__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1234 """Return self * other.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1235
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1236 (+-) INF * 0 (or its reverse) raise InvalidOperation.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1237 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1238 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
1239 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1240 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1241
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1242 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1243 context = getcontext()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1244
32561
6f351b1bcf53 * Update the test suite to reflect that ConversionSyntax was no longer
Raymond Hettinger <python@rcn.com>
parents: 32560
diff changeset
1245 resultsign = self._sign ^ other._sign
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1246
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1247 if self._is_special or other._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1248 ans = self._check_nans(other, context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1249 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1250 return ans
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1251
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1252 if self._isinfinity():
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1253 if not other:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1254 return context._raise_error(InvalidOperation, '(+-)INF * 0')
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
1255 return _SignedInfinity[resultsign]
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1256
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1257 if other._isinfinity():
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1258 if not self:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1259 return context._raise_error(InvalidOperation, '0 * (+-)INF')
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
1260 return _SignedInfinity[resultsign]
32451
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 resultexp = self._exp + other._exp
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1263
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1264 # Special case for multiplying by zero
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1265 if not self or not other:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1266 ans = _dec_from_triple(resultsign, '0', resultexp)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1267 # Fixing in case the exponent is out of bounds
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1268 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1269 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1270
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1271 # Special case for multiplying by power of 10
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1272 if self._int == '1':
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1273 ans = _dec_from_triple(resultsign, other._int, resultexp)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1274 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1275 return ans
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1276 if other._int == '1':
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1277 ans = _dec_from_triple(resultsign, self._int, resultexp)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1278 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1279 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1280
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1281 op1 = _WorkRep(self)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1282 op2 = _WorkRep(other)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1283
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1284 ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1285 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1286
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1287 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1288 __rmul__ = __mul__
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1289
46651
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1290 def __truediv__(self, other, context=None):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1291 """Return self / other."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1292 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
1293 if other is NotImplemented:
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1294 return NotImplemented
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1295
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1296 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1297 context = getcontext()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1298
32561
6f351b1bcf53 * Update the test suite to reflect that ConversionSyntax was no longer
Raymond Hettinger <python@rcn.com>
parents: 32560
diff changeset
1299 sign = self._sign ^ other._sign
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1300
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1301 if self._is_special or other._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1302 ans = self._check_nans(other, context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1303 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1304 return ans
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1305
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1306 if self._isinfinity() and other._isinfinity():
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1307 return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1308
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1309 if self._isinfinity():
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
1310 return _SignedInfinity[sign]
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1311
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1312 if other._isinfinity():
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1313 context._raise_error(Clamped, 'Division by infinity')
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1314 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
1315
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1316 # Special cases for zeroes
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1317 if not other:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1318 if not self:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1319 return context._raise_error(DivisionUndefined, '0 / 0')
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1320 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
1321
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1322 if not self:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1323 exp = self._exp - other._exp
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1324 coeff = 0
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1325 else:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1326 # OK, so neither = 0, INF or NaN
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1327 shift = len(other._int) - len(self._int) + context.prec + 1
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1328 exp = self._exp - other._exp - shift
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1329 op1 = _WorkRep(self)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1330 op2 = _WorkRep(other)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1331 if shift >= 0:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1332 coeff, remainder = divmod(op1.int * 10**shift, op2.int)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1333 else:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1334 coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1335 if remainder:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1336 # result is not exact; adjust to ensure correct rounding
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1337 if coeff % 5 == 0:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1338 coeff += 1
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1339 else:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1340 # result is exact; get as close to ideal exponent as possible
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1341 ideal_exp = self._exp - other._exp
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1342 while exp < ideal_exp and coeff % 10 == 0:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1343 coeff //= 10
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1344 exp += 1
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1345
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1346 ans = _dec_from_triple(sign, str(coeff), exp)
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1347 return ans._fix(context)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1348
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1349 def _divide(self, other, context):
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1350 """Return (self // other, self % other), to context.prec precision.
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1351
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1352 Assumes that neither self nor other is a NaN, that self is not
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1353 infinite and that other is nonzero.
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1354 """
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1355 sign = self._sign ^ other._sign
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1356 if other._isinfinity():
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1357 ideal_exp = self._exp
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1358 else:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1359 ideal_exp = min(self._exp, other._exp)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1360
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1361 expdiff = self.adjusted() - other.adjusted()
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1362 if not self or other._isinfinity() or expdiff <= -2:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1363 return (_dec_from_triple(sign, '0', 0),
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1364 self._rescale(ideal_exp, context.rounding))
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1365 if expdiff <= context.prec:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1366 op1 = _WorkRep(self)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1367 op2 = _WorkRep(other)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1368 if op1.exp >= op2.exp:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1369 op1.int *= 10**(op1.exp - op2.exp)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1370 else:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1371 op2.int *= 10**(op2.exp - op1.exp)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1372 q, r = divmod(op1.int, op2.int)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1373 if q < 10**context.prec:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1374 return (_dec_from_triple(sign, str(q), 0),
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1375 _dec_from_triple(self._sign, str(r), ideal_exp))
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1376
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1377 # Here the quotient is too large to be representable
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1378 ans = context._raise_error(DivisionImpossible,
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1379 'quotient too large in //, % or divmod')
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1380 return ans, ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1381
46651
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1382 def __rtruediv__(self, other, context=None):
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1383 """Swaps self/other and returns __truediv__."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1384 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
1385 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1386 return other
46651
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1387 return other.__truediv__(self, context=context)
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1388
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1389 __div__ = __truediv__
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1390 __rdiv__ = __rtruediv__
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1391
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1392 def __divmod__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1393 """
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1394 Return (self // other, self % other)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1395 """
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1396 other = _convert_other(other)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1397 if other is NotImplemented:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1398 return other
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1399
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1400 if context is None:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1401 context = getcontext()
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1402
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1403 ans = self._check_nans(other, context)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1404 if ans:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1405 return (ans, ans)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1406
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1407 sign = self._sign ^ other._sign
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1408 if self._isinfinity():
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1409 if other._isinfinity():
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1410 ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1411 return ans, ans
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1412 else:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
1413 return (_SignedInfinity[sign],
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1414 context._raise_error(InvalidOperation, 'INF % x'))
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1415
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1416 if not other:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1417 if not self:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1418 ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1419 return ans, ans
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1420 else:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1421 return (context._raise_error(DivisionByZero, 'x // 0', sign),
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1422 context._raise_error(InvalidOperation, 'x % 0'))
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1423
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1424 quotient, remainder = self._divide(other, context)
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1425 remainder = remainder._fix(context)
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1426 return quotient, remainder
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1427
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1428 def __rdivmod__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1429 """Swaps self/other and returns __divmod__."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1430 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
1431 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1432 return other
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1433 return other.__divmod__(self, context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1434
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1435 def __mod__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1436 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1437 self % other
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1438 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1439 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
1440 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1441 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1442
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1443 if context is None:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1444 context = getcontext()
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1445
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1446 ans = self._check_nans(other, context)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1447 if ans:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1448 return ans
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1449
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1450 if self._isinfinity():
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1451 return context._raise_error(InvalidOperation, 'INF % x')
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1452 elif not other:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1453 if self:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1454 return context._raise_error(InvalidOperation, 'x % 0')
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1455 else:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1456 return context._raise_error(DivisionUndefined, '0 % 0')
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1457
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1458 remainder = self._divide(other, context)[1]
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
1459 remainder = remainder._fix(context)
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1460 return remainder
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1461
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1462 def __rmod__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1463 """Swaps self/other and returns __mod__."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1464 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
1465 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1466 return other
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1467 return other.__mod__(self, context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1468
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1469 def remainder_near(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1470 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1471 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
1472 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1473 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1474 context = getcontext()
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1475
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1476 other = _convert_other(other, raiseit=True)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1477
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1478 ans = self._check_nans(other, context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1479 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1480 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1481
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1482 # self == +/-infinity -> InvalidOperation
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1483 if self._isinfinity():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1484 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1485 'remainder_near(infinity, x)')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1486
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1487 # other == 0 -> either InvalidOperation or DivisionUndefined
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1488 if not other:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1489 if self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1490 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1491 'remainder_near(x, 0)')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1492 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1493 return context._raise_error(DivisionUndefined,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1494 'remainder_near(0, 0)')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1495
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1496 # other = +/-infinity -> remainder = self
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1497 if other._isinfinity():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1498 ans = Decimal(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1499 return ans._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1500
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1501 # self = 0 -> remainder = self, with ideal exponent
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1502 ideal_exponent = min(self._exp, other._exp)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1503 if not self:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1504 ans = _dec_from_triple(self._sign, '0', ideal_exponent)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1505 return ans._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1506
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1507 # catch most cases of large or small quotient
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1508 expdiff = self.adjusted() - other.adjusted()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1509 if expdiff >= context.prec + 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1510 # expdiff >= prec+1 => abs(self/other) > 10**prec
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1511 return context._raise_error(DivisionImpossible)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1512 if expdiff <= -2:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1513 # expdiff <= -2 => abs(self/other) < 0.1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1514 ans = self._rescale(ideal_exponent, context.rounding)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1515 return ans._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1516
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1517 # adjust both arguments to have the same exponent, then divide
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1518 op1 = _WorkRep(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1519 op2 = _WorkRep(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1520 if op1.exp >= op2.exp:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1521 op1.int *= 10**(op1.exp - op2.exp)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1522 else:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1523 op2.int *= 10**(op2.exp - op1.exp)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1524 q, r = divmod(op1.int, op2.int)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1525 # remainder is r*10**ideal_exponent; other is +/-op2.int *
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1526 # 10**ideal_exponent. Apply correction to ensure that
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1527 # abs(remainder) <= abs(other)/2
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1528 if 2*r + (q&1) > op2.int:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1529 r -= op2.int
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1530 q += 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1531
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1532 if q >= 10**context.prec:
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1533 return context._raise_error(DivisionImpossible)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1534
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1535 # result has same sign as self unless r is negative
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1536 sign = self._sign
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1537 if r < 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1538 sign = 1-sign
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1539 r = -r
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1540
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1541 ans = _dec_from_triple(sign, str(r), ideal_exponent)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1542 return ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1543
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1544 def __floordiv__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1545 """self // other"""
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1546 other = _convert_other(other)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1547 if other is NotImplemented:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1548 return other
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1549
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1550 if context is None:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1551 context = getcontext()
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1552
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1553 ans = self._check_nans(other, context)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1554 if ans:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1555 return ans
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1556
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1557 if self._isinfinity():
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1558 if other._isinfinity():
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1559 return context._raise_error(InvalidOperation, 'INF // INF')
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1560 else:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
1561 return _SignedInfinity[self._sign ^ other._sign]
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1562
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1563 if not other:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1564 if self:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1565 return context._raise_error(DivisionByZero, 'x // 0',
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1566 self._sign ^ other._sign)
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1567 else:
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1568 return context._raise_error(DivisionUndefined, '0 // 0')
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1569
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
1570 return self._divide(other, context)[0]
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1571
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1572 def __rfloordiv__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1573 """Swaps self/other and returns __floordiv__."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1574 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
1575 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1576 return other
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1577 return other.__floordiv__(self, context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1578
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1579 def __float__(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1580 """Float representation."""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1581 return float(str(self))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1582
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1583 def __int__(self):
34638
4a0c202ee789 Fix small grammatical error in a docstring.
Brett Cannon <bcannon@gmail.com>
parents: 34545
diff changeset
1584 """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
1585 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1586 if self._isnan():
55877
d41024593931 #Issue 6795: Fix infinite recursion in long(Decimal('nan')); change int(Decimal('nan')) to raise ValueError instead of either returning NaN or raising InvalidContext.
Mark Dickinson <dickinsm@gmail.com>
parents: 55873
diff changeset
1587 raise ValueError("Cannot convert NaN to integer")
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1588 elif self._isinfinity():
55877
d41024593931 #Issue 6795: Fix infinite recursion in long(Decimal('nan')); change int(Decimal('nan')) to raise ValueError instead of either returning NaN or raising InvalidContext.
Mark Dickinson <dickinsm@gmail.com>
parents: 55873
diff changeset
1589 raise OverflowError("Cannot convert infinity to integer")
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1590 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
1591 if self._exp >= 0:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1592 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
1593 else:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1594 return s*int(self._int[:self._exp] or '0')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1595
44923
e8efa62eec15 Add support for trunc().
Raymond Hettinger <python@rcn.com>
parents: 44701
diff changeset
1596 __trunc__ = __int__
e8efa62eec15 Add support for trunc().
Raymond Hettinger <python@rcn.com>
parents: 44701
diff changeset
1597
45293
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1598 def real(self):
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1599 return self
50598
09a498eb1820 More Python 2.3 compatibility fixes for decimal.py.
Mark Dickinson <dickinsm@gmail.com>
parents: 50595
diff changeset
1600 real = property(real)
09a498eb1820 More Python 2.3 compatibility fixes for decimal.py.
Mark Dickinson <dickinsm@gmail.com>
parents: 50595
diff changeset
1601
45293
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1602 def imag(self):
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1603 return Decimal(0)
50598
09a498eb1820 More Python 2.3 compatibility fixes for decimal.py.
Mark Dickinson <dickinsm@gmail.com>
parents: 50595
diff changeset
1604 imag = property(imag)
45293
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1605
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1606 def conjugate(self):
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1607 return self
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1608
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1609 def __complex__(self):
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1610 return complex(float(self))
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1611
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1612 def __long__(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1613 """Converts to a long.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1614
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1615 Equivalent to long(int(self))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1616 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1617 return long(self.__int__())
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1618
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1619 def _fix_nan(self, context):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1620 """Decapitate the payload of a NaN to fit the context"""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1621 payload = self._int
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1622
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1623 # maximum length of payload is precision if _clamp=0,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1624 # precision-1 if _clamp=1.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1625 max_payload_len = context.prec - context._clamp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1626 if len(payload) > max_payload_len:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1627 payload = payload[len(payload)-max_payload_len:].lstrip('0')
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1628 return _dec_from_triple(self._sign, payload, self._exp, True)
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
1629 return Decimal(self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1630
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
1631 def _fix(self, context):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1632 """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
1633
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1634 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
1635
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1636 Arguments:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1637 self - Decimal instance
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1638 context - context used.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1639 """
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1640
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1641 if self._is_special:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1642 if self._isnan():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1643 # decapitate payload if necessary
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1644 return self._fix_nan(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1645 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1646 # self is +/-Infinity; return unaltered
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
1647 return Decimal(self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1648
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1649 # if self is zero then exponent should be between Etiny and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1650 # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1651 Etiny = context.Etiny()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1652 Etop = context.Etop()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1653 if not self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1654 exp_max = [context.Emax, Etop][context._clamp]
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1655 new_exp = min(max(self._exp, Etiny), exp_max)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1656 if new_exp != self._exp:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1657 context._raise_error(Clamped)
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1658 return _dec_from_triple(self._sign, '0', new_exp)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1659 else:
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
1660 return Decimal(self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1661
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1662 # exp_min is the smallest allowable exponent of the result,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1663 # equal to max(self.adjusted()-context.prec+1, Etiny)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1664 exp_min = len(self._int) + self._exp - context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1665 if exp_min > Etop:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1666 # overflow: exp_min > Etop iff self.adjusted() > Emax
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1667 ans = context._raise_error(Overflow, 'above Emax', self._sign)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1668 context._raise_error(Inexact)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1669 context._raise_error(Rounded)
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1670 return ans
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1671
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1672 self_is_subnormal = exp_min < Etiny
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1673 if self_is_subnormal:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1674 exp_min = Etiny
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1675
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1676 # round if self has too many digits
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1677 if self._exp < exp_min:
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1678 digits = len(self._int) + self._exp - exp_min
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1679 if digits < 0:
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1680 self = _dec_from_triple(self._sign, '1', exp_min-1)
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1681 digits = 0
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1682 rounding_method = self._pick_rounding_function[context.rounding]
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1683 changed = getattr(self, rounding_method)(digits)
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1684 coeff = self._int[:digits] or '0'
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1685 if changed > 0:
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1686 coeff = str(int(coeff)+1)
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1687 if len(coeff) > context.prec:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1688 coeff = coeff[:-1]
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1689 exp_min += 1
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1690
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1691 # check whether the rounding pushed the exponent out of range
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1692 if exp_min > Etop:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1693 ans = context._raise_error(Overflow, 'above Emax', self._sign)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1694 else:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1695 ans = _dec_from_triple(self._sign, coeff, exp_min)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1696
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1697 # raise the appropriate signals, taking care to respect
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1698 # the precedence described in the specification
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1699 if changed and self_is_subnormal:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1700 context._raise_error(Underflow)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1701 if self_is_subnormal:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1702 context._raise_error(Subnormal)
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1703 if changed:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1704 context._raise_error(Inexact)
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1705 context._raise_error(Rounded)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1706 if not ans:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1707 # raise Clamped on underflow to 0
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1708 context._raise_error(Clamped)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1709 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1710
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1711 if self_is_subnormal:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1712 context._raise_error(Subnormal)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
1713
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1714 # fold down if _clamp == 1 and self has too few digits
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1715 if context._clamp == 1 and self._exp > Etop:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1716 context._raise_error(Clamped)
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1717 self_padded = self._int + '0'*(self._exp - Etop)
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1718 return _dec_from_triple(self._sign, self_padded, Etop)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1719
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1720 # here self was representable to begin with; return unchanged
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
1721 return Decimal(self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1722
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1723 _pick_rounding_function = {}
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1724
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1725 # for each of the rounding functions below:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1726 # self is a finite, nonzero Decimal
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1727 # prec is an integer satisfying 0 <= prec < len(self._int)
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1728 #
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1729 # each function returns either -1, 0, or 1, as follows:
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1730 # 1 indicates that self should be rounded up (away from zero)
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1731 # 0 indicates that self should be truncated, and that all the
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1732 # digits to be truncated are zeros (so the value is unchanged)
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1733 # -1 indicates that there are nonzero digits to be truncated
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1734
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1735 def _round_down(self, prec):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1736 """Also known as round-towards-0, truncate."""
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1737 if _all_zeros(self._int, prec):
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1738 return 0
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1739 else:
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1740 return -1
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1741
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1742 def _round_up(self, prec):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1743 """Rounds away from 0."""
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1744 return -self._round_down(prec)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1745
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1746 def _round_half_up(self, prec):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1747 """Rounds 5 up (away from 0)"""
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1748 if self._int[prec] in '56789':
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1749 return 1
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1750 elif _all_zeros(self._int, prec):
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1751 return 0
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1752 else:
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1753 return -1
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1754
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1755 def _round_half_down(self, prec):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1756 """Round 5 down"""
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1757 if _exact_half(self._int, prec):
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1758 return -1
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1759 else:
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1760 return self._round_half_up(prec)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1761
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1762 def _round_half_even(self, prec):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1763 """Round 5 to even, rest to nearest."""
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1764 if _exact_half(self._int, prec) and \
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1765 (prec == 0 or self._int[prec-1] in '02468'):
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1766 return -1
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1767 else:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1768 return self._round_half_up(prec)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1769
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1770 def _round_ceiling(self, prec):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1771 """Rounds up (not away from 0 if negative.)"""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1772 if self._sign:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1773 return self._round_down(prec)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1774 else:
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1775 return -self._round_down(prec)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1776
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1777 def _round_floor(self, prec):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1778 """Rounds down (not towards 0 if negative)"""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1779 if not self._sign:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1780 return self._round_down(prec)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1781 else:
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1782 return -self._round_down(prec)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1783
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1784 def _round_05up(self, prec):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1785 """Round down unless digit prec-1 is 0 or 5."""
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1786 if prec and self._int[prec-1] not in '05':
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1787 return self._round_down(prec)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1788 else:
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
1789 return -self._round_down(prec)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1790
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1791 def fma(self, other, third, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1792 """Fused multiply-add.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1793
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1794 Returns self*other+third with no rounding of the intermediate
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1795 product self*other.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1796
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1797 self and other are multiplied together, with no rounding of
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1798 the result. The third operand is then added to the result,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1799 and a single final rounding is performed.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1800 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1801
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1802 other = _convert_other(other, raiseit=True)
44148
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1803
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1804 # compute product; raise InvalidOperation if either operand is
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1805 # a signaling NaN or if the product is zero times infinity.
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1806 if self._is_special or other._is_special:
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1807 if context is None:
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1808 context = getcontext()
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1809 if self._exp == 'N':
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
1810 return context._raise_error(InvalidOperation, 'sNaN', self)
44148
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1811 if other._exp == 'N':
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
1812 return context._raise_error(InvalidOperation, 'sNaN', other)
44148
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1813 if self._exp == 'n':
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1814 product = self
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1815 elif other._exp == 'n':
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1816 product = other
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1817 elif self._exp == 'F':
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1818 if not other:
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1819 return context._raise_error(InvalidOperation,
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1820 'INF * 0 in fma')
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
1821 product = _SignedInfinity[self._sign ^ other._sign]
44148
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1822 elif other._exp == 'F':
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1823 if not self:
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1824 return context._raise_error(InvalidOperation,
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1825 '0 * INF in fma')
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
1826 product = _SignedInfinity[self._sign ^ other._sign]
44148
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1827 else:
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1828 product = _dec_from_triple(self._sign ^ other._sign,
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1829 str(int(self._int) * int(other._int)),
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1830 self._exp + other._exp)
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1831
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1832 third = _convert_other(third, raiseit=True)
44148
53320d544bc7 fma speedup by avoiding to create a Context. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44121
diff changeset
1833 return product.__add__(third, context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1834
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1835 def _power_modulo(self, other, modulo, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1836 """Three argument version of __pow__"""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1837
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1838 # if can't convert other and modulo to Decimal, raise
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1839 # TypeError; there's no point returning NotImplemented (no
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1840 # equivalent of __rpow__ for three argument pow)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1841 other = _convert_other(other, raiseit=True)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1842 modulo = _convert_other(modulo, raiseit=True)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1843
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1844 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1845 context = getcontext()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1846
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1847 # deal with NaNs: if there are any sNaNs then first one wins,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1848 # (i.e. behaviour for NaNs is identical to that of fma)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1849 self_is_nan = self._isnan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1850 other_is_nan = other._isnan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1851 modulo_is_nan = modulo._isnan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1852 if self_is_nan or other_is_nan or modulo_is_nan:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1853 if self_is_nan == 2:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1854 return context._raise_error(InvalidOperation, 'sNaN',
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
1855 self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1856 if other_is_nan == 2:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1857 return context._raise_error(InvalidOperation, 'sNaN',
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
1858 other)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1859 if modulo_is_nan == 2:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1860 return context._raise_error(InvalidOperation, 'sNaN',
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
1861 modulo)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1862 if self_is_nan:
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
1863 return self._fix_nan(context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1864 if other_is_nan:
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
1865 return other._fix_nan(context)
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
1866 return modulo._fix_nan(context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1867
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1868 # check inputs: we apply same restrictions as Python's pow()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1869 if not (self._isinteger() and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1870 other._isinteger() and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1871 modulo._isinteger()):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1872 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1873 'pow() 3rd argument not allowed '
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1874 'unless all arguments are integers')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1875 if other < 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1876 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1877 'pow() 2nd argument cannot be '
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1878 'negative when 3rd argument specified')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1879 if not modulo:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1880 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1881 'pow() 3rd argument cannot be 0')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1882
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1883 # additional restriction for decimal: the modulus must be less
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1884 # than 10**prec in absolute value
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1885 if modulo.adjusted() >= context.prec:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1886 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1887 'insufficient precision: pow() 3rd '
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1888 'argument must not have more than '
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1889 'precision digits')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1890
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1891 # define 0**0 == NaN, for consistency with two-argument pow
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1892 # (even though it hurts!)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1893 if not other and not self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1894 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1895 'at least one of pow() 1st argument '
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1896 'and 2nd argument must be nonzero ;'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1897 '0**0 is not defined')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1898
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1899 # compute sign of result
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1900 if other._iseven():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1901 sign = 0
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1902 else:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1903 sign = self._sign
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1904
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1905 # convert modulo to a Python integer, and self and other to
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1906 # Decimal integers (i.e. force their exponents to be >= 0)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1907 modulo = abs(int(modulo))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1908 base = _WorkRep(self.to_integral_value())
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1909 exponent = _WorkRep(other.to_integral_value())
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1910
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1911 # compute result using integer pow()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1912 base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1913 for i in xrange(exponent.exp):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1914 base = pow(base, 10, modulo)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1915 base = pow(base, exponent.int, modulo)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1916
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
1917 return _dec_from_triple(sign, str(base), 0)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1918
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1919 def _power_exact(self, other, p):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1920 """Attempt to compute self**other exactly.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1921
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1922 Given Decimals self and other and an integer p, attempt to
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1923 compute an exact result for the power self**other, with p
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1924 digits of precision. Return None if self**other is not
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1925 exactly representable in p digits.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1926
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1927 Assumes that elimination of special cases has already been
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1928 performed: self and other must both be nonspecial; self must
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1929 be positive and not numerically equal to 1; other must be
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1930 nonzero. For efficiency, other._exp should not be too large,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1931 so that 10**abs(other._exp) is a feasible calculation."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1932
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1933 # In the comments below, we write x for the value of self and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1934 # y for the value of other. Write x = xc*10**xe and y =
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1935 # yc*10**ye.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1936
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1937 # The main purpose of this method is to identify the *failure*
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1938 # of x**y to be exactly representable with as little effort as
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1939 # possible. So we look for cheap and easy tests that
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1940 # eliminate the possibility of x**y being exact. Only if all
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1941 # these tests are passed do we go on to actually compute x**y.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1942
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1943 # Here's the main idea. First normalize both x and y. We
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1944 # express y as a rational m/n, with m and n relatively prime
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1945 # and n>0. Then for x**y to be exactly representable (at
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1946 # *any* precision), xc must be the nth power of a positive
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1947 # integer and xe must be divisible by n. If m is negative
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1948 # then additionally xc must be a power of either 2 or 5, hence
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1949 # a power of 2**n or 5**n.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1950 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1951 # There's a limit to how small |y| can be: if y=m/n as above
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1952 # then:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1953 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1954 # (1) if xc != 1 then for the result to be representable we
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1955 # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1956 # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1957 # 2**(1/|y|), hence xc**|y| < 2 and the result is not
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1958 # representable.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1959 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1960 # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1961 # |y| < 1/|xe| then the result is not representable.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1962 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1963 # Note that since x is not equal to 1, at least one of (1) and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1964 # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1965 # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1966 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1967 # There's also a limit to how large y can be, at least if it's
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1968 # positive: the normalized result will have coefficient xc**y,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1969 # so if it's representable then xc**y < 10**p, and y <
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1970 # p/log10(xc). Hence if y*log10(xc) >= p then the result is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1971 # not exactly representable.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1972
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1973 # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1974 # so |y| < 1/xe and the result is not representable.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1975 # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1976 # < 1/nbits(xc).
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1977
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1978 x = _WorkRep(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1979 xc, xe = x.int, x.exp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1980 while xc % 10 == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1981 xc //= 10
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1982 xe += 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1983
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1984 y = _WorkRep(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1985 yc, ye = y.int, y.exp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1986 while yc % 10 == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1987 yc //= 10
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1988 ye += 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1989
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1990 # case where xc == 1: result is 10**(xe*y), with xe*y
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1991 # required to be an integer
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
1992 if xc == 1:
62867
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
1993 xe *= yc
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
1994 # result is now 10**(xe * 10**ye); xe * 10**ye must be integral
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
1995 while xe % 10 == 0:
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
1996 xe //= 10
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
1997 ye += 1
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
1998 if ye < 0:
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
1999 return None
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
2000 exponent = xe * 10**ye
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2001 if y.sign == 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2002 exponent = -exponent
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2003 # if other is a nonnegative integer, use ideal exponent
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2004 if other._isinteger() and other._sign == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2005 ideal_exponent = self._exp*int(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2006 zeros = min(exponent-ideal_exponent, p-1)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2007 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2008 zeros = 0
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2009 return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2010
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2011 # case where y is negative: xc must be either a power
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2012 # of 2 or a power of 5.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2013 if y.sign == 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2014 last_digit = xc % 10
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2015 if last_digit in (2,4,6,8):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2016 # quick test for power of 2
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2017 if xc & -xc != xc:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2018 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2019 # now xc is a power of 2; e is its exponent
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2020 e = _nbits(xc)-1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2021 # find e*y and xe*y; both must be integers
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2022 if ye >= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2023 y_as_int = yc*10**ye
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2024 e = e*y_as_int
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2025 xe = xe*y_as_int
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2026 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2027 ten_pow = 10**-ye
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2028 e, remainder = divmod(e*yc, ten_pow)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2029 if remainder:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2030 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2031 xe, remainder = divmod(xe*yc, ten_pow)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2032 if remainder:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2033 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2034
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2035 if e*65 >= p*93: # 93/65 > log(10)/log(5)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2036 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2037 xc = 5**e
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2038
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2039 elif last_digit == 5:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2040 # e >= log_5(xc) if xc is a power of 5; we have
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2041 # equality all the way up to xc=5**2658
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2042 e = _nbits(xc)*28//65
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2043 xc, remainder = divmod(5**e, xc)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2044 if remainder:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2045 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2046 while xc % 5 == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2047 xc //= 5
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2048 e -= 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2049 if ye >= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2050 y_as_integer = yc*10**ye
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2051 e = e*y_as_integer
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2052 xe = xe*y_as_integer
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2053 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2054 ten_pow = 10**-ye
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2055 e, remainder = divmod(e*yc, ten_pow)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2056 if remainder:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2057 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2058 xe, remainder = divmod(xe*yc, ten_pow)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2059 if remainder:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2060 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2061 if e*3 >= p*10: # 10/3 > log(10)/log(2)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2062 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2063 xc = 2**e
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2064 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2065 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2066
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2067 if xc >= 10**p:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2068 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2069 xe = -e-xe
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2070 return _dec_from_triple(0, str(xc), xe)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2071
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2072 # now y is positive; find m and n such that y = m/n
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2073 if ye >= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2074 m, n = yc*10**ye, 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2075 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2076 if xe != 0 and len(str(abs(yc*xe))) <= -ye:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2077 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2078 xc_bits = _nbits(xc)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2079 if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2080 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2081 m, n = yc, 10**(-ye)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2082 while m % 2 == n % 2 == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2083 m //= 2
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2084 n //= 2
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2085 while m % 5 == n % 5 == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2086 m //= 5
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2087 n //= 5
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2088
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2089 # compute nth root of xc*10**xe
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2090 if n > 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2091 # if 1 < xc < 2**n then xc isn't an nth power
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2092 if xc != 1 and xc_bits <= n:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2093 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2094
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2095 xe, rem = divmod(xe, n)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2096 if rem != 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2097 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2098
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2099 # compute nth root of xc using Newton's method
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2100 a = 1L << -(-_nbits(xc)//n) # initial estimate
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2101 while True:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2102 q, r = divmod(xc, a**(n-1))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2103 if a <= q:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2104 break
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2105 else:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2106 a = (a*(n-1) + q)//n
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2107 if not (a == q and r == 0):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2108 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2109 xc = a
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2110
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2111 # now xc*10**xe is the nth root of the original xc*10**xe
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2112 # compute mth power of xc*10**xe
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2113
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2114 # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2115 # 10**p and the result is not representable.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2116 if xc > 1 and m > p*100//_log10_lb(xc):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2117 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2118 xc = xc**m
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2119 xe *= m
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2120 if xc > 10**p:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2121 return None
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2122
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2123 # by this point the result *is* exactly representable
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2124 # adjust the exponent to get as close as possible to the ideal
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2125 # exponent, if necessary
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2126 str_xc = str(xc)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2127 if other._isinteger() and other._sign == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2128 ideal_exponent = self._exp*int(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2129 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
2130 else:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2131 zeros = 0
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2132 return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2133
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2134 def __pow__(self, other, modulo=None, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2135 """Return self ** other [ % modulo].
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2136
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2137 With two arguments, compute self**other.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2138
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2139 With three arguments, compute (self**other) % modulo. For the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2140 three argument form, the following restrictions on the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2141 arguments hold:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2142
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2143 - all three arguments must be integral
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2144 - other must be nonnegative
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2145 - either self or other (or both) must be nonzero
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2146 - modulo must be nonzero and must have at most p digits,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2147 where p is the context precision.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2148
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2149 If any of these restrictions is violated the InvalidOperation
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2150 flag is raised.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2151
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2152 The result of pow(self, other, modulo) is identical to the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2153 result that would be obtained by computing (self**other) %
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2154 modulo with unbounded precision, but is computed more
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2155 efficiently. It is always exact.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2156 """
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2157
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2158 if modulo is not None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2159 return self._power_modulo(other, modulo, context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2160
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2161 other = _convert_other(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2162 if other is NotImplemented:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2163 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2164
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2165 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2166 context = getcontext()
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2167
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2168 # either argument is a NaN => result is NaN
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2169 ans = self._check_nans(other, context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2170 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2171 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2172
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2173 # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2174 if not other:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2175 if not self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2176 return context._raise_error(InvalidOperation, '0 ** 0')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2177 else:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2178 return _One
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2179
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2180 # result has sign 1 iff self._sign is 1 and other is an odd integer
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2181 result_sign = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2182 if self._sign == 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2183 if other._isinteger():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2184 if not other._iseven():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2185 result_sign = 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2186 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2187 # -ve**noninteger = NaN
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2188 # (-0)**noninteger = 0**noninteger
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2189 if self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2190 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2191 'x ** y with x negative and y not an integer')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2192 # negate self, without doing any unwanted rounding
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2193 self = self.copy_negate()
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2194
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2195 # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2196 if not self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2197 if other._sign == 0:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2198 return _dec_from_triple(result_sign, '0', 0)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2199 else:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2200 return _SignedInfinity[result_sign]
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2201
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2202 # 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
2203 if self._isinfinity():
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2204 if other._sign == 0:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2205 return _SignedInfinity[result_sign]
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2206 else:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2207 return _dec_from_triple(result_sign, '0', 0)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2208
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2209 # 1**other = 1, but the choice of exponent and the flags
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2210 # depend on the exponent of self, and on whether other is a
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2211 # positive integer, a negative integer, or neither
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2212 if self == _One:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2213 if other._isinteger():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2214 # exp = max(self._exp*max(int(other), 0),
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2215 # 1-context.prec) but evaluating int(other) directly
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2216 # is dangerous until we know other is small (other
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2217 # could be 1e999999999)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2218 if other._sign == 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2219 multiplier = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2220 elif other > context.prec:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2221 multiplier = context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2222 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2223 multiplier = int(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2224
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2225 exp = self._exp * multiplier
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2226 if exp < 1-context.prec:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2227 exp = 1-context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2228 context._raise_error(Rounded)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2229 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2230 context._raise_error(Inexact)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2231 context._raise_error(Rounded)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2232 exp = 1-context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2233
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2234 return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2235
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2236 # compute adjusted exponent of self
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2237 self_adj = self.adjusted()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2238
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2239 # self ** infinity is infinity if self > 1, 0 if self < 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2240 # self ** -infinity is infinity if self < 1, 0 if self > 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2241 if other._isinfinity():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2242 if (other._sign == 0) == (self_adj < 0):
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2243 return _dec_from_triple(result_sign, '0', 0)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2244 else:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2245 return _SignedInfinity[result_sign]
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2246
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2247 # from here on, the result always goes through the call
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2248 # to _fix at the end of this function.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2249 ans = None
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2250 exact = False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2251
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2252 # crude test to catch cases of extreme overflow/underflow. If
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2253 # log10(self)*other >= 10**bound and bound >= len(str(Emax))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2254 # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2255 # self**other >= 10**(Emax+1), so overflow occurs. The test
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2256 # for underflow is similar.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2257 bound = self._log10_exp_bound() + other.adjusted()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2258 if (self_adj >= 0) == (other._sign == 0):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2259 # self > 1 and other +ve, or self < 1 and other -ve
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2260 # possibility of overflow
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2261 if bound >= len(str(context.Emax)):
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2262 ans = _dec_from_triple(result_sign, '1', context.Emax+1)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2263 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2264 # self > 1 and other -ve, or self < 1 and other +ve
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2265 # possibility of underflow to 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2266 Etiny = context.Etiny()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2267 if bound >= len(str(-Etiny)):
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2268 ans = _dec_from_triple(result_sign, '1', Etiny-1)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2269
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2270 # try for an exact result with precision +1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2271 if ans is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2272 ans = self._power_exact(other, context.prec + 1)
62867
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
2273 if ans is not None:
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
2274 if result_sign == 1:
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
2275 ans = _dec_from_triple(1, ans._int, ans._exp)
a6318dafb8eb Merged revisions 82646,82649-82650 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61743
diff changeset
2276 exact = True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2277
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2278 # usual case: inexact result, x**y computed directly as exp(y*log(x))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2279 if ans is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2280 p = context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2281 x = _WorkRep(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2282 xc, xe = x.int, x.exp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2283 y = _WorkRep(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2284 yc, ye = y.int, y.exp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2285 if y.sign == 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2286 yc = -yc
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2287
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2288 # compute correctly rounded result: start with precision +3,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2289 # then increase precision until result is unambiguously roundable
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2290 extra = 3
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2291 while True:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2292 coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2293 if coeff % (5*10**(len(str(coeff))-p-1)):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2294 break
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2295 extra += 3
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2296
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2297 ans = _dec_from_triple(result_sign, str(coeff), exp)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2298
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2299 # unlike exp, ln and log10, the power function respects the
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2300 # rounding mode; no need to switch to ROUND_HALF_EVEN here
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2301
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2302 # There's a difficulty here when 'other' is not an integer and
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2303 # the result is exact. In this case, the specification
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2304 # requires that the Inexact flag be raised (in spite of
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2305 # exactness), but since the result is exact _fix won't do this
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2306 # for us. (Correspondingly, the Underflow signal should also
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2307 # be raised for subnormal results.) We can't directly raise
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2308 # these signals either before or after calling _fix, since
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2309 # that would violate the precedence for signals. So we wrap
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2310 # the ._fix call in a temporary context, and reraise
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2311 # afterwards.
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2312 if exact and not other._isinteger():
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2313 # pad with zeros up to length context.prec+1 if necessary; this
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2314 # ensures that the Rounded signal will be raised.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2315 if len(ans._int) <= context.prec:
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2316 expdiff = context.prec + 1 - len(ans._int)
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2317 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2318 ans._exp-expdiff)
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2319
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2320 # create a copy of the current context, with cleared flags/traps
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2321 newcontext = context.copy()
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2322 newcontext.clear_flags()
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2323 for exception in _signals:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2324 newcontext.traps[exception] = 0
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2325
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2326 # round in the new context
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2327 ans = ans._fix(newcontext)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2328
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2329 # raise Inexact, and if necessary, Underflow
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2330 newcontext._raise_error(Inexact)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2331 if newcontext.flags[Subnormal]:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2332 newcontext._raise_error(Underflow)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2333
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2334 # propagate signals to the original context; _fix could
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2335 # have raised any of Overflow, Underflow, Subnormal,
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2336 # Inexact, Rounded, Clamped. Overflow needs the correct
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2337 # arguments. Note that the order of the exceptions is
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2338 # important here.
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2339 if newcontext.flags[Overflow]:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2340 context._raise_error(Overflow, 'above Emax', ans._sign)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2341 for exception in Underflow, Subnormal, Inexact, Rounded, Clamped:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2342 if newcontext.flags[exception]:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2343 context._raise_error(exception)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2344
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2345 else:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2346 ans = ans._fix(context)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2347
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2348 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2349
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2350 def __rpow__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2351 """Swaps self/other and returns __pow__."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2352 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
2353 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
2354 return other
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2355 return other.__pow__(self, context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2356
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2357 def normalize(self, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2358 """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
2359
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2360 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2361 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2362
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2363 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2364 ans = self._check_nans(context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2365 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2366 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2367
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
2368 dup = self._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2369 if dup._isinfinity():
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2370 return dup
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2371
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2372 if not dup:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2373 return _dec_from_triple(dup._sign, '0', 0)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2374 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
2375 end = len(dup._int)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2376 exp = dup._exp
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2377 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
2378 exp += 1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2379 end -= 1
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2380 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
2381
43362
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2382 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
2383 """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
2384
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2385 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
2386 """
43362
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2387 exp = _convert_other(exp, raiseit=True)
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2388
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2389 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2390 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2391 if rounding is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2392 rounding = context.rounding
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2393
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2394 if self._is_special or exp._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2395 ans = self._check_nans(exp, context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2396 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2397 return ans
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2398
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2399 if exp._isinfinity() or self._isinfinity():
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2400 if exp._isinfinity() and self._isinfinity():
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2401 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
2402 return context._raise_error(InvalidOperation,
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2403 'quantize with one INF')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2404
43362
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2405 # if we're not watching exponents, do a simple rescale
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2406 if not watchexp:
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2407 ans = self._rescale(exp._exp, rounding)
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2408 # raise Inexact and Rounded where appropriate
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2409 if ans._exp > self._exp:
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2410 context._raise_error(Rounded)
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2411 if ans != self:
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2412 context._raise_error(Inexact)
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2413 return ans
c8c7a947a641 Put the parameter watchexp back in (changed watchexp from an int
Facundo Batista <facundobatista@gmail.com>
parents: 43360
diff changeset
2414
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2415 # exp._exp should be between Etiny and Emax
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2416 if not (context.Etiny() <= exp._exp <= context.Emax):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2417 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2418 'target exponent out of bounds in quantize')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2419
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2420 if not self:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2421 ans = _dec_from_triple(self._sign, '0', exp._exp)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2422 return ans._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2423
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2424 self_adjusted = self.adjusted()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2425 if self_adjusted > context.Emax:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2426 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2427 'exponent of quantize result too large for current context')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2428 if self_adjusted - exp._exp + 1 > context.prec:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2429 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2430 'quantize result has too many digits for current context')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2431
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2432 ans = self._rescale(exp._exp, rounding)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2433 if ans.adjusted() > context.Emax:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2434 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2435 'exponent of quantize result too large for current context')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2436 if len(ans._int) > context.prec:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2437 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2438 'quantize result has too many digits for current context')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2439
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2440 # raise appropriate flags
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2441 if ans and ans.adjusted() < context.Emin:
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2442 context._raise_error(Subnormal)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2443 if ans._exp > self._exp:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2444 if ans != self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2445 context._raise_error(Inexact)
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2446 context._raise_error(Rounded)
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2447
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2448 # call to fix takes care of any necessary folddown, and
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2449 # signals Clamped if necessary
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2450 ans = ans._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2451 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2452
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2453 def same_quantum(self, other):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2454 """Return True if self and other have the same exponent; otherwise
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2455 return False.
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2456
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2457 If either operand is a special value, the following rules are used:
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2458 * return True if both operands are infinities
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2459 * return True if both operands are NaNs
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2460 * otherwise, return False.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2461 """
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2462 other = _convert_other(other, raiseit=True)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2463 if self._is_special or other._is_special:
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2464 return (self.is_nan() and other.is_nan() or
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2465 self.is_infinite() and other.is_infinite())
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2466 return self._exp == other._exp
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2467
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2468 def _rescale(self, exp, rounding):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2469 """Rescale self so that the exponent is exp, either by padding with zeros
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2470 or by truncating digits, using the given rounding mode.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2471
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2472 Specials are returned without change. This operation is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2473 quiet: it raises no flags, and uses no information from the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2474 context.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2475
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2476 exp = exp to scale to (an integer)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2477 rounding = rounding mode
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2478 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2479 if self._is_special:
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2480 return Decimal(self)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2481 if not self:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2482 return _dec_from_triple(self._sign, '0', exp)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2483
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2484 if self._exp >= exp:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2485 # pad answer with zeros if necessary
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2486 return _dec_from_triple(self._sign,
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2487 self._int + '0'*(self._exp - exp), exp)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2488
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2489 # too many digits; round and lose data. If self.adjusted() <
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2490 # exp-1, replace self by 10**(exp-1) before rounding
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2491 digits = len(self._int) + self._exp - exp
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2492 if digits < 0:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2493 self = _dec_from_triple(self._sign, '1', exp-1)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2494 digits = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2495 this_function = getattr(self, self._pick_rounding_function[rounding])
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
2496 changed = this_function(digits)
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
2497 coeff = self._int[:digits] or '0'
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
2498 if changed == 1:
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
2499 coeff = str(int(coeff)+1)
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
2500 return _dec_from_triple(self._sign, coeff, exp)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2501
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2502 def _round(self, places, rounding):
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2503 """Round a nonzero, nonspecial Decimal to a fixed number of
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2504 significant figures, using the given rounding mode.
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2505
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2506 Infinities, NaNs and zeros are returned unaltered.
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2507
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2508 This operation is quiet: it raises no flags, and uses no
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2509 information from the context.
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2510
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2511 """
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2512 if places <= 0:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2513 raise ValueError("argument should be at least 1 in _round")
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2514 if self._is_special or not self:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2515 return Decimal(self)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2516 ans = self._rescale(self.adjusted()+1-places, rounding)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2517 # it can happen that the rescale alters the adjusted exponent;
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2518 # for example when rounding 99.97 to 3 significant figures.
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2519 # When this happens we end up with an extra 0 at the end of
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2520 # the number; a second rescale fixes this.
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2521 if ans.adjusted() != self.adjusted():
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2522 ans = ans._rescale(ans.adjusted()+1-places, rounding)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2523 return ans
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2524
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2525 def to_integral_exact(self, rounding=None, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2526 """Rounds to a nearby integer.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2527
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2528 If no rounding mode is specified, take the rounding mode from
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2529 the context. This method raises the Rounded and Inexact flags
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2530 when appropriate.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2531
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2532 See also: to_integral_value, which does exactly the same as
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2533 this method except that it doesn't raise Inexact or Rounded.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2534 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2535 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2536 ans = self._check_nans(context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2537 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2538 return ans
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2539 return Decimal(self)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2540 if self._exp >= 0:
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2541 return Decimal(self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2542 if not self:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2543 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
2544 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2545 context = getcontext()
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2546 if rounding is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2547 rounding = context.rounding
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2548 ans = self._rescale(0, rounding)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2549 if ans != self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2550 context._raise_error(Inexact)
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
2551 context._raise_error(Rounded)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2552 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2553
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2554 def to_integral_value(self, rounding=None, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2555 """Rounds to the nearest integer, without raising inexact, rounded."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2556 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2557 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2558 if rounding is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2559 rounding = context.rounding
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2560 if self._is_special:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2561 ans = self._check_nans(context=context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2562 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2563 return ans
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2564 return Decimal(self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2565 if self._exp >= 0:
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2566 return Decimal(self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2567 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2568 return self._rescale(0, rounding)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2569
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2570 # the method name changed, but we provide also the old one, for compatibility
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2571 to_integral = to_integral_value
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2572
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2573 def sqrt(self, context=None):
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2574 """Return the square root of self."""
46082
22bd02293efa Issue #2478: Decimal(sqrt(0)) failed when the decimal context
Mark Dickinson <dickinsm@gmail.com>
parents: 45568
diff changeset
2575 if context is None:
22bd02293efa Issue #2478: Decimal(sqrt(0)) failed when the decimal context
Mark Dickinson <dickinsm@gmail.com>
parents: 45568
diff changeset
2576 context = getcontext()
22bd02293efa Issue #2478: Decimal(sqrt(0)) failed when the decimal context
Mark Dickinson <dickinsm@gmail.com>
parents: 45568
diff changeset
2577
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2578 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2579 ans = self._check_nans(context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2580 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2581 return ans
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2582
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2583 if self._isinfinity() and self._sign == 0:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2584 return Decimal(self)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2585
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2586 if not self:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2587 # exponent = self._exp // 2. sqrt(-0) = -0
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2588 ans = _dec_from_triple(self._sign, '0', self._exp // 2)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2589 return ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2590
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2591 if self._sign == 1:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2592 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
2593
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2594 # At this point self represents a positive number. Let p be
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2595 # the desired precision and express self in the form c*100**e
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2596 # with c a positive real number and e an integer, c and e
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2597 # being chosen so that 100**(p-1) <= c < 100**p. Then the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2598 # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2599 # <= sqrt(c) < 10**p, so the closest representable Decimal at
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2600 # precision p is n*10**e where n = round_half_even(sqrt(c)),
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2601 # the closest integer to sqrt(c) with the even integer chosen
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2602 # in the case of a tie.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2603 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2604 # To ensure correct rounding in all cases, we use the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2605 # following trick: we compute the square root to an extra
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2606 # place (precision p+1 instead of precision p), rounding down.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2607 # Then, if the result is inexact and its last digit is 0 or 5,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2608 # we increase the last digit to 1 or 6 respectively; if it's
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2609 # exact we leave the last digit alone. Now the final round to
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2610 # p places (or fewer in the case of underflow) will round
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2611 # correctly and raise the appropriate flags.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2612
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2613 # use an extra digit of precision
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2614 prec = context.prec+1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2615
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2616 # write argument in the form c*100**e where e = self._exp//2
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2617 # is the 'ideal' exponent, to be used if the square root is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2618 # exactly representable. l is the number of 'digits' of c in
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2619 # base 100, so that 100**(l-1) <= c < 100**l.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2620 op = _WorkRep(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2621 e = op.exp >> 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2622 if op.exp & 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2623 c = op.int * 10
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2624 l = (len(self._int) >> 1) + 1
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2625 else:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2626 c = op.int
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2627 l = len(self._int)+1 >> 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2628
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2629 # rescale so that c has exactly prec base 100 'digits'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2630 shift = prec-l
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2631 if shift >= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2632 c *= 100**shift
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2633 exact = True
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2634 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2635 c, remainder = divmod(c, 100**-shift)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2636 exact = not remainder
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2637 e -= shift
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2638
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2639 # find n = floor(sqrt(c)) using Newton's method
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2640 n = 10**prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2641 while True:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2642 q = c//n
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2643 if n <= q:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2644 break
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2645 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2646 n = n + q >> 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2647 exact = exact and n*n == c
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2648
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2649 if exact:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2650 # result is exact; rescale to use ideal exponent e
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2651 if shift >= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2652 # assert n % 10**shift == 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2653 n //= 10**shift
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2654 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2655 n *= 10**-shift
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2656 e += shift
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2657 else:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2658 # result is not exact; fix last digit as described above
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2659 if n % 5 == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2660 n += 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2661
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2662 ans = _dec_from_triple(0, str(n), e)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2663
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2664 # round, and fit to current context
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2665 context = context._shallow_copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2666 rounding = context._set_rounding(ROUND_HALF_EVEN)
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
2667 ans = ans._fix(context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2668 context.rounding = rounding
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2669
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2670 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2671
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2672 def max(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2673 """Returns the larger value.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2674
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2675 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
2676 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
2677 """
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2678 other = _convert_other(other, raiseit=True)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2679
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2680 if context is None:
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2681 context = getcontext()
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2682
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2683 if self._is_special or other._is_special:
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
2684 # 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
2685 # number is always returned
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2686 sn = self._isnan()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2687 on = other._isnan()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2688 if sn or on:
50116
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
2689 if on == 1 and sn == 0:
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
2690 return self._fix(context)
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
2691 if sn == 1 and on == 0:
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
2692 return other._fix(context)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2693 return self._check_nans(other, context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2694
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
2695 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
2696 if c == 0:
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
2697 # 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
2698 # 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
2699 #
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
2700 # 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
2701 # 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
2702 #
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
2703 # If the signs are the same then the exponent is used to select
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2704 # the result. This is exactly the ordering used in compare_total.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2705 c = self.compare_total(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2706
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2707 if c == -1:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2708 ans = other
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2709 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2710 ans = self
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2711
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
2712 return ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2713
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2714 def min(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2715 """Returns the smaller value.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2716
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
2717 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
2718 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
2719 """
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2720 other = _convert_other(other, raiseit=True)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2721
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2722 if context is None:
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2723 context = getcontext()
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
2724
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2725 if self._is_special or other._is_special:
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
2726 # 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
2727 # number is always returned
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2728 sn = self._isnan()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2729 on = other._isnan()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2730 if sn or on:
50116
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
2731 if on == 1 and sn == 0:
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
2732 return self._fix(context)
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
2733 if sn == 1 and on == 0:
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
2734 return other._fix(context)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2735 return self._check_nans(other, context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2736
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
2737 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
2738 if c == 0:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2739 c = self.compare_total(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2740
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2741 if c == -1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2742 ans = self
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2743 else:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2744 ans = other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2745
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
2746 return ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2747
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2748 def _isinteger(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2749 """Returns whether self is an integer"""
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2750 if self._is_special:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2751 return False
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2752 if self._exp >= 0:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2753 return True
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2754 rest = self._int[self._exp:]
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2755 return rest == '0'*len(rest)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2756
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2757 def _iseven(self):
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2758 """Returns True if self is even. Assumes self is an integer."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2759 if not self or self._exp > 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2760 return True
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2761 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
2762
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2763 def adjusted(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2764 """Return the adjusted exponent of self"""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2765 try:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2766 return self._exp + len(self._int) - 1
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
2767 # 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
2768 except TypeError:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2769 return 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2770
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2771 def canonical(self, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2772 """Returns the same Decimal object.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2773
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2774 As we do not have different encodings for the same number, the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2775 received object already is in its canonical form.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2776 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2777 return self
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2778
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2779 def compare_signal(self, other, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2780 """Compares self to the other operand numerically.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2781
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2782 It's pretty much like compare(), but all NaNs signal, with signaling
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2783 NaNs taking precedence over quiet NaNs.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2784 """
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
2785 other = _convert_other(other, raiseit = True)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
2786 ans = self._compare_check_nans(other, context)
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
2787 if ans:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
2788 return ans
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2789 return self.compare(other, context=context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2790
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2791 def compare_total(self, other):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2792 """Compares self to other using the abstract representations.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2793
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2794 This is not like the standard compare, which use their numerical
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2795 value. Note that a total ordering is defined for all possible abstract
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2796 representations.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2797 """
56969
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
2798 other = _convert_other(other, raiseit=True)
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
2799
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2800 # if one is negative and the other is positive, it's easy
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2801 if self._sign and not other._sign:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2802 return _NegativeOne
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2803 if not self._sign and other._sign:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2804 return _One
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2805 sign = self._sign
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2806
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2807 # let's handle both NaN types
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2808 self_nan = self._isnan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2809 other_nan = other._isnan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2810 if self_nan or other_nan:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2811 if self_nan == other_nan:
55740
f29b59a49246 Issue #6794: Fix handling of NaNs in Decimal.compare_total and
Mark Dickinson <dickinsm@gmail.com>
parents: 55518
diff changeset
2812 # compare payloads as though they're integers
f29b59a49246 Issue #6794: Fix handling of NaNs in Decimal.compare_total and
Mark Dickinson <dickinsm@gmail.com>
parents: 55518
diff changeset
2813 self_key = len(self._int), self._int
f29b59a49246 Issue #6794: Fix handling of NaNs in Decimal.compare_total and
Mark Dickinson <dickinsm@gmail.com>
parents: 55518
diff changeset
2814 other_key = len(other._int), other._int
f29b59a49246 Issue #6794: Fix handling of NaNs in Decimal.compare_total and
Mark Dickinson <dickinsm@gmail.com>
parents: 55518
diff changeset
2815 if self_key < other_key:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2816 if sign:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2817 return _One
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2818 else:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2819 return _NegativeOne
55740
f29b59a49246 Issue #6794: Fix handling of NaNs in Decimal.compare_total and
Mark Dickinson <dickinsm@gmail.com>
parents: 55518
diff changeset
2820 if self_key > other_key:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2821 if sign:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2822 return _NegativeOne
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2823 else:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2824 return _One
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2825 return _Zero
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2826
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2827 if sign:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2828 if self_nan == 1:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2829 return _NegativeOne
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2830 if other_nan == 1:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2831 return _One
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2832 if self_nan == 2:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2833 return _NegativeOne
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2834 if other_nan == 2:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2835 return _One
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2836 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2837 if self_nan == 1:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2838 return _One
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2839 if other_nan == 1:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2840 return _NegativeOne
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2841 if self_nan == 2:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2842 return _One
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2843 if other_nan == 2:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2844 return _NegativeOne
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2845
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2846 if self < other:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2847 return _NegativeOne
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2848 if self > other:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2849 return _One
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2850
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2851 if self._exp < other._exp:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2852 if sign:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2853 return _One
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2854 else:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2855 return _NegativeOne
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2856 if self._exp > other._exp:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2857 if sign:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2858 return _NegativeOne
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2859 else:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2860 return _One
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2861 return _Zero
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2862
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2863
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2864 def compare_total_mag(self, other):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2865 """Compares self to other using abstract repr., ignoring sign.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2866
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2867 Like compare_total, but with operand's sign ignored and assumed to be 0.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2868 """
56969
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
2869 other = _convert_other(other, raiseit=True)
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
2870
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2871 s = self.copy_abs()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2872 o = other.copy_abs()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2873 return s.compare_total(o)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2874
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2875 def copy_abs(self):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2876 """Returns a copy with the sign set to 0. """
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2877 return _dec_from_triple(0, self._int, self._exp, self._is_special)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2878
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2879 def copy_negate(self):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2880 """Returns a copy with the sign inverted."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2881 if self._sign:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2882 return _dec_from_triple(0, self._int, self._exp, self._is_special)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2883 else:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2884 return _dec_from_triple(1, self._int, self._exp, self._is_special)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2885
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2886 def copy_sign(self, other):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2887 """Returns self with the sign of other."""
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
2888 other = _convert_other(other, raiseit=True)
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2889 return _dec_from_triple(other._sign, self._int,
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2890 self._exp, self._is_special)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2891
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2892 def exp(self, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2893 """Returns e ** self."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2894
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2895 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2896 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2897
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2898 # exp(NaN) = NaN
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2899 ans = self._check_nans(context=context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2900 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2901 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2902
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2903 # exp(-Infinity) = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2904 if self._isinfinity() == -1:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2905 return _Zero
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2906
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2907 # exp(0) = 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2908 if not self:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
2909 return _One
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2910
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2911 # exp(Infinity) = Infinity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2912 if self._isinfinity() == 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2913 return Decimal(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2914
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2915 # the result is now guaranteed to be inexact (the true
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2916 # mathematical result is transcendental). There's no need to
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2917 # raise Rounded and Inexact here---they'll always be raised as
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2918 # a result of the call to _fix.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2919 p = context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2920 adj = self.adjusted()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2921
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2922 # we only need to do any computation for quite a small range
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2923 # of adjusted exponents---for example, -29 <= adj <= 10 for
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2924 # the default context. For smaller exponent the result is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2925 # indistinguishable from 1 at the given precision, while for
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2926 # larger exponent the result either overflows or underflows.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2927 if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2928 # overflow
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2929 ans = _dec_from_triple(0, '1', context.Emax+1)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2930 elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2931 # underflow to 0
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2932 ans = _dec_from_triple(0, '1', context.Etiny()-1)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2933 elif self._sign == 0 and adj < -p:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2934 # p+1 digits; final round will raise correct flags
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2935 ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2936 elif self._sign == 1 and adj < -p-1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2937 # p+1 digits; final round will raise correct flags
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2938 ans = _dec_from_triple(0, '9'*(p+1), -p-1)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2939 # general case
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2940 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2941 op = _WorkRep(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2942 c, e = op.int, op.exp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2943 if op.sign == 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2944 c = -c
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2945
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2946 # compute correctly rounded result: increase precision by
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2947 # 3 digits at a time until we get an unambiguously
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2948 # roundable result
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2949 extra = 3
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2950 while True:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2951 coeff, exp = _dexp(c, e, p+extra)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2952 if coeff % (5*10**(len(str(coeff))-p-1)):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2953 break
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2954 extra += 3
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2955
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
2956 ans = _dec_from_triple(0, str(coeff), exp)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2957
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2958 # at this stage, ans should round correctly with *any*
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2959 # rounding mode, not just with ROUND_HALF_EVEN
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2960 context = context._shallow_copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2961 rounding = context._set_rounding(ROUND_HALF_EVEN)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2962 ans = ans._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2963 context.rounding = rounding
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2964
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2965 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2966
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2967 def is_canonical(self):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2968 """Return True if self is canonical; otherwise return False.
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2969
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2970 Currently, the encoding of a Decimal instance is always
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2971 canonical, so this method returns True for any Decimal.
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2972 """
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2973 return True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2974
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2975 def is_finite(self):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2976 """Return True if self is finite; otherwise return False.
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2977
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2978 A Decimal instance is considered finite if it is neither
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2979 infinite nor a NaN.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2980 """
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2981 return not self._is_special
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2982
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2983 def is_infinite(self):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2984 """Return True if self is infinite; otherwise return False."""
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2985 return self._exp == 'F'
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2986
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2987 def is_nan(self):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2988 """Return True if self is a qNaN or sNaN; otherwise return False."""
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2989 return self._exp in ('n', 'N')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2990
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2991 def is_normal(self, context=None):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2992 """Return True if self is a normal number; otherwise return False."""
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2993 if self._is_special or not self:
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
2994 return False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2995 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2996 context = getcontext()
56642
1b602a2d81ef Issue #7099: Decimal.is_normal should return True for all nonzero
Mark Dickinson <dickinsm@gmail.com>
parents: 56409
diff changeset
2997 return context.Emin <= self.adjusted()
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2998
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
2999 def is_qnan(self):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3000 """Return True if self is a quiet NaN; otherwise return False."""
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3001 return self._exp == 'n'
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3002
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3003 def is_signed(self):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3004 """Return True if self is negative; otherwise return False."""
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3005 return self._sign == 1
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3006
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3007 def is_snan(self):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3008 """Return True if self is a signaling NaN; otherwise return False."""
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3009 return self._exp == 'N'
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3010
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3011 def is_subnormal(self, context=None):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3012 """Return True if self is subnormal; otherwise return False."""
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3013 if self._is_special or not self:
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3014 return False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3015 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3016 context = getcontext()
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3017 return self.adjusted() < context.Emin
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3018
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3019 def is_zero(self):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
3020 """Return True if self is a zero; otherwise return False."""
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3021 return not self._is_special and self._int == '0'
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3022
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3023 def _ln_exp_bound(self):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3024 """Compute a lower bound for the adjusted exponent of self.ln().
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3025 In other words, compute r such that self.ln() >= 10**r. Assumes
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3026 that self is finite and positive and that self != 1.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3027 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3028
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3029 # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3030 adj = self._exp + len(self._int) - 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3031 if adj >= 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3032 # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3033 return len(str(adj*23//10)) - 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3034 if adj <= -2:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3035 # argument <= 0.1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3036 return len(str((-1-adj)*23//10)) - 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3037 op = _WorkRep(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3038 c, e = op.int, op.exp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3039 if adj == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3040 # 1 < self < 10
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3041 num = str(c-10**-e)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3042 den = str(c)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3043 return len(num) - len(den) - (num < den)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3044 # adj == -1, 0.1 <= self < 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3045 return e + len(str(10**-e - c)) - 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3046
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3047
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3048 def ln(self, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3049 """Returns the natural (base e) logarithm of self."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3050
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3051 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3052 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3053
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3054 # ln(NaN) = NaN
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3055 ans = self._check_nans(context=context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3056 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3057 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3058
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3059 # ln(0.0) == -Infinity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3060 if not self:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
3061 return _NegativeInfinity
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3062
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3063 # ln(Infinity) = Infinity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3064 if self._isinfinity() == 1:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
3065 return _Infinity
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3066
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3067 # ln(1.0) == 0.0
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
3068 if self == _One:
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
3069 return _Zero
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3070
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3071 # ln(negative) raises InvalidOperation
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3072 if self._sign == 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3073 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3074 'ln of a negative value')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3075
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3076 # result is irrational, so necessarily inexact
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3077 op = _WorkRep(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3078 c, e = op.int, op.exp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3079 p = context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3080
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3081 # correctly rounded result: repeatedly increase precision by 3
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3082 # until we get an unambiguously roundable result
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3083 places = p - self._ln_exp_bound() + 2 # at least p+3 places
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3084 while True:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3085 coeff = _dlog(c, e, places)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3086 # assert len(str(abs(coeff)))-p >= 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3087 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3088 break
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3089 places += 3
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3090 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3091
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3092 context = context._shallow_copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3093 rounding = context._set_rounding(ROUND_HALF_EVEN)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3094 ans = ans._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3095 context.rounding = rounding
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3096 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3097
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3098 def _log10_exp_bound(self):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3099 """Compute a lower bound for the adjusted exponent of self.log10().
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3100 In other words, find r such that self.log10() >= 10**r.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3101 Assumes that self is finite and positive and that self != 1.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3102 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3103
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3104 # For x >= 10 or x < 0.1 we only need a bound on the integer
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3105 # part of log10(self), and this comes directly from the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3106 # exponent of x. For 0.1 <= x <= 10 we use the inequalities
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3107 # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3108 # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3109
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3110 adj = self._exp + len(self._int) - 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3111 if adj >= 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3112 # self >= 10
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3113 return len(str(adj))-1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3114 if adj <= -2:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3115 # self < 0.1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3116 return len(str(-1-adj))-1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3117 op = _WorkRep(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3118 c, e = op.int, op.exp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3119 if adj == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3120 # 1 < self < 10
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3121 num = str(c-10**-e)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3122 den = str(231*c)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3123 return len(num) - len(den) - (num < den) + 2
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3124 # adj == -1, 0.1 <= self < 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3125 num = str(10**-e-c)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3126 return len(num) + e - (num < "231") - 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3127
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3128 def log10(self, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3129 """Returns the base 10 logarithm of self."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3130
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3131 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3132 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3133
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3134 # log10(NaN) = NaN
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3135 ans = self._check_nans(context=context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3136 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3137 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3138
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3139 # log10(0.0) == -Infinity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3140 if not self:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
3141 return _NegativeInfinity
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3142
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3143 # log10(Infinity) = Infinity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3144 if self._isinfinity() == 1:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
3145 return _Infinity
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3146
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3147 # log10(negative or -Infinity) raises InvalidOperation
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3148 if self._sign == 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3149 return context._raise_error(InvalidOperation,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3150 'log10 of a negative value')
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3151
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3152 # log10(10**n) = n
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3153 if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3154 # answer may need rounding
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3155 ans = Decimal(self._exp + len(self._int) - 1)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3156 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3157 # result is irrational, so necessarily inexact
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3158 op = _WorkRep(self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3159 c, e = op.int, op.exp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3160 p = context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3161
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3162 # correctly rounded result: repeatedly increase precision
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3163 # until result is unambiguously roundable
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3164 places = p-self._log10_exp_bound()+2
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3165 while True:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3166 coeff = _dlog10(c, e, places)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3167 # assert len(str(abs(coeff)))-p >= 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3168 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3169 break
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3170 places += 3
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3171 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3172
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3173 context = context._shallow_copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3174 rounding = context._set_rounding(ROUND_HALF_EVEN)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3175 ans = ans._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3176 context.rounding = rounding
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3177 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3178
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3179 def logb(self, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3180 """ Returns the exponent of the magnitude of self's MSD.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3181
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3182 The result is the integer which is the exponent of the magnitude
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3183 of the most significant digit of self (as though it were truncated
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3184 to a single digit while maintaining the value of that digit and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3185 without limiting the resulting exponent).
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3186 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3187 # logb(NaN) = NaN
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3188 ans = self._check_nans(context=context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3189 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3190 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3191
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3192 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3193 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3194
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3195 # logb(+/-Inf) = +Inf
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3196 if self._isinfinity():
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
3197 return _Infinity
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3198
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3199 # logb(0) = -Inf, DivisionByZero
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3200 if not self:
43391
b9236a75a6e5 Speed up of the various division operations (remainder, divide,
Facundo Batista <facundobatista@gmail.com>
parents: 43383
diff changeset
3201 return context._raise_error(DivisionByZero, 'logb(0)', 1)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3202
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3203 # otherwise, simply return the adjusted exponent of self, as a
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3204 # Decimal. Note that no attempt is made to fit the result
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3205 # into the current context.
56409
c5a3d4314676 Issue #7048: logb should round its result when that result doesn't fit
Mark Dickinson <dickinsm@gmail.com>
parents: 55890
diff changeset
3206 ans = Decimal(self.adjusted())
c5a3d4314676 Issue #7048: logb should round its result when that result doesn't fit
Mark Dickinson <dickinsm@gmail.com>
parents: 55890
diff changeset
3207 return ans._fix(context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3208
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3209 def _islogical(self):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3210 """Return True if self is a logical operand.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3211
44701
2f11f7d9bdc8 Docstring typos
Andrew M. Kuchling <amk@amk.ca>
parents: 44650
diff changeset
3212 For being logical, it must be a finite number with a sign of 0,
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3213 an exponent of 0, and a coefficient whose digits must all be
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3214 either 0 or 1.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3215 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3216 if self._sign != 0 or self._exp != 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3217 return False
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3218 for dig in self._int:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3219 if dig not in '01':
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3220 return False
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3221 return True
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3222
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3223 def _fill_logical(self, context, opa, opb):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3224 dif = context.prec - len(opa)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3225 if dif > 0:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3226 opa = '0'*dif + opa
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3227 elif dif < 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3228 opa = opa[-context.prec:]
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3229 dif = context.prec - len(opb)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3230 if dif > 0:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3231 opb = '0'*dif + opb
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3232 elif dif < 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3233 opb = opb[-context.prec:]
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3234 return opa, opb
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3235
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3236 def logical_and(self, other, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3237 """Applies an 'and' operation between self and other's digits."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3238 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3239 context = getcontext()
56969
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3240
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3241 other = _convert_other(other, raiseit=True)
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3242
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3243 if not self._islogical() or not other._islogical():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3244 return context._raise_error(InvalidOperation)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3245
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3246 # fill to context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3247 (opa, opb) = self._fill_logical(context, self._int, other._int)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3248
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3249 # make the operation, and clean starting zeroes
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3250 result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3251 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3252
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3253 def logical_invert(self, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3254 """Invert all its digits."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3255 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3256 context = getcontext()
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3257 return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3258 context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3259
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3260 def logical_or(self, other, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3261 """Applies an 'or' operation between self and other's digits."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3262 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3263 context = getcontext()
56969
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3264
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3265 other = _convert_other(other, raiseit=True)
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3266
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3267 if not self._islogical() or not other._islogical():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3268 return context._raise_error(InvalidOperation)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3269
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3270 # fill to context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3271 (opa, opb) = self._fill_logical(context, self._int, other._int)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3272
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3273 # make the operation, and clean starting zeroes
50598
09a498eb1820 More Python 2.3 compatibility fixes for decimal.py.
Mark Dickinson <dickinsm@gmail.com>
parents: 50595
diff changeset
3274 result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)])
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3275 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3276
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3277 def logical_xor(self, other, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3278 """Applies an 'xor' operation between self and other's digits."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3279 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3280 context = getcontext()
56969
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3281
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3282 other = _convert_other(other, raiseit=True)
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3283
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3284 if not self._islogical() or not other._islogical():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3285 return context._raise_error(InvalidOperation)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3286
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3287 # fill to context.prec
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3288 (opa, opb) = self._fill_logical(context, self._int, other._int)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3289
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3290 # make the operation, and clean starting zeroes
50598
09a498eb1820 More Python 2.3 compatibility fixes for decimal.py.
Mark Dickinson <dickinsm@gmail.com>
parents: 50595
diff changeset
3291 result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)])
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3292 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3293
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3294 def max_mag(self, other, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3295 """Compares the values numerically with their sign ignored."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3296 other = _convert_other(other, raiseit=True)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3297
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
3298 if context is None:
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
3299 context = getcontext()
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
3300
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3301 if self._is_special or other._is_special:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3302 # If one operand is a quiet NaN and the other is number, then the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3303 # number is always returned
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3304 sn = self._isnan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3305 on = other._isnan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3306 if sn or on:
50116
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
3307 if on == 1 and sn == 0:
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
3308 return self._fix(context)
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
3309 if sn == 1 and on == 0:
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
3310 return other._fix(context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3311 return self._check_nans(other, context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3312
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
3313 c = self.copy_abs()._cmp(other.copy_abs())
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3314 if c == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3315 c = self.compare_total(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3316
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3317 if c == -1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3318 ans = other
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3319 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3320 ans = self
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3321
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
3322 return ans._fix(context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3323
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3324 def min_mag(self, other, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3325 """Compares the values numerically with their sign ignored."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3326 other = _convert_other(other, raiseit=True)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3327
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
3328 if context is None:
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
3329 context = getcontext()
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
3330
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3331 if self._is_special or other._is_special:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3332 # If one operand is a quiet NaN and the other is number, then the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3333 # number is always returned
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3334 sn = self._isnan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3335 on = other._isnan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3336 if sn or on:
50116
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
3337 if on == 1 and sn == 0:
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
3338 return self._fix(context)
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
3339 if sn == 1 and on == 0:
01c023d9218e Merged revisions 67694 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 48847
diff changeset
3340 return other._fix(context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3341 return self._check_nans(other, context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3342
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
3343 c = self.copy_abs()._cmp(other.copy_abs())
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3344 if c == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3345 c = self.compare_total(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3346
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3347 if c == -1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3348 ans = self
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3349 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3350 ans = other
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3351
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
3352 return ans._fix(context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3353
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3354 def next_minus(self, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3355 """Returns the largest representable number smaller than itself."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3356 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3357 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3358
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3359 ans = self._check_nans(context=context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3360 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3361 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3362
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3363 if self._isinfinity() == -1:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
3364 return _NegativeInfinity
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3365 if self._isinfinity() == 1:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3366 return _dec_from_triple(0, '9'*context.prec, context.Etop())
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3367
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3368 context = context.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3369 context._set_rounding(ROUND_FLOOR)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3370 context._ignore_all_flags()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3371 new_self = self._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3372 if new_self != self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3373 return new_self
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3374 return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3375 context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3376
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3377 def next_plus(self, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3378 """Returns the smallest representable number larger than itself."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3379 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3380 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3381
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3382 ans = self._check_nans(context=context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3383 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3384 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3385
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3386 if self._isinfinity() == 1:
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
3387 return _Infinity
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3388 if self._isinfinity() == -1:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3389 return _dec_from_triple(1, '9'*context.prec, context.Etop())
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3390
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3391 context = context.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3392 context._set_rounding(ROUND_CEILING)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3393 context._ignore_all_flags()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3394 new_self = self._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3395 if new_self != self:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3396 return new_self
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3397 return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3398 context)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3399
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3400 def next_toward(self, other, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3401 """Returns the number closest to self, in the direction towards other.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3402
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3403 The result is the closest representable number to self
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3404 (excluding self) that is in the direction towards other,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3405 unless both have the same value. If the two operands are
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3406 numerically equal, then the result is a copy of self with the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3407 sign set to be the same as the sign of other.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3408 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3409 other = _convert_other(other, raiseit=True)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3410
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3411 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3412 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3413
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3414 ans = self._check_nans(other, context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3415 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3416 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3417
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
3418 comparison = self._cmp(other)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3419 if comparison == 0:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3420 return self.copy_sign(other)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3421
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3422 if comparison == -1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3423 ans = self.next_plus(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3424 else: # comparison == 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3425 ans = self.next_minus(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3426
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3427 # decide which flags to raise using value of ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3428 if ans._isinfinity():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3429 context._raise_error(Overflow,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3430 'Infinite result from next_toward',
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3431 ans._sign)
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
3432 context._raise_error(Inexact)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3433 context._raise_error(Rounded)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3434 elif ans.adjusted() < context.Emin:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3435 context._raise_error(Underflow)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3436 context._raise_error(Subnormal)
61211
c0ea07925400 Issue #8567: Fix incorrect precedence of signals in Decimal module.
Mark Dickinson <dickinsm@gmail.com>
parents: 60173
diff changeset
3437 context._raise_error(Inexact)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3438 context._raise_error(Rounded)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3439 # if precision == 1 then we don't raise Clamped for a
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3440 # result 0E-Etiny.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3441 if not ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3442 context._raise_error(Clamped)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3443
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3444 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3445
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3446 def number_class(self, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3447 """Returns an indication of the class of self.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3448
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3449 The class is one of the following strings:
44352
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
3450 sNaN
f7bc79112bcf Some minor cleanups. Thanks Mark Dickinson.
Facundo Batista <facundobatista@gmail.com>
parents: 44328
diff changeset
3451 NaN
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3452 -Infinity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3453 -Normal
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3454 -Subnormal
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3455 -Zero
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3456 +Zero
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3457 +Subnormal
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3458 +Normal
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3459 +Infinity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3460 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3461 if self.is_snan():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3462 return "sNaN"
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3463 if self.is_qnan():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3464 return "NaN"
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3465 inf = self._isinfinity()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3466 if inf == 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3467 return "+Infinity"
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3468 if inf == -1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3469 return "-Infinity"
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3470 if self.is_zero():
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3471 if self._sign:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3472 return "-Zero"
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3473 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3474 return "+Zero"
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3475 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3476 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3477 if self.is_subnormal(context=context):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3478 if self._sign:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3479 return "-Subnormal"
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3480 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3481 return "+Subnormal"
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3482 # just a normal, regular, boring number, :)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3483 if self._sign:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3484 return "-Normal"
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3485 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3486 return "+Normal"
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3487
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3488 def radix(self):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3489 """Just returns 10, as this is Decimal, :)"""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3490 return Decimal(10)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3491
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3492 def rotate(self, other, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3493 """Returns a rotated copy of self, value-of-other times."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3494 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3495 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3496
56969
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3497 other = _convert_other(other, raiseit=True)
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3498
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3499 ans = self._check_nans(other, context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3500 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3501 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3502
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3503 if other._exp != 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3504 return context._raise_error(InvalidOperation)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3505 if not (-context.prec <= int(other) <= context.prec):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3506 return context._raise_error(InvalidOperation)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3507
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3508 if self._isinfinity():
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
3509 return Decimal(self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3510
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3511 # get values, pad if necessary
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3512 torot = int(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3513 rotdig = self._int
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3514 topad = context.prec - len(rotdig)
56970
d5a34ef2fca7 Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
Mark Dickinson <dickinsm@gmail.com>
parents: 56969
diff changeset
3515 if topad > 0:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3516 rotdig = '0'*topad + rotdig
56970
d5a34ef2fca7 Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
Mark Dickinson <dickinsm@gmail.com>
parents: 56969
diff changeset
3517 elif topad < 0:
d5a34ef2fca7 Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
Mark Dickinson <dickinsm@gmail.com>
parents: 56969
diff changeset
3518 rotdig = rotdig[-topad:]
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3519
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3520 # let's rotate!
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3521 rotated = rotdig[torot:] + rotdig[:torot]
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3522 return _dec_from_triple(self._sign,
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3523 rotated.lstrip('0') or '0', self._exp)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3524
56969
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3525 def scaleb(self, other, context=None):
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3526 """Returns self operand after adding the second value to its exp."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3527 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3528 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3529
56969
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3530 other = _convert_other(other, raiseit=True)
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3531
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3532 ans = self._check_nans(other, context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3533 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3534 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3535
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3536 if other._exp != 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3537 return context._raise_error(InvalidOperation)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3538 liminf = -2 * (context.Emax + context.prec)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3539 limsup = 2 * (context.Emax + context.prec)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3540 if not (liminf <= int(other) <= limsup):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3541 return context._raise_error(InvalidOperation)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3542
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3543 if self._isinfinity():
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
3544 return Decimal(self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3545
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3546 d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3547 d = d._fix(context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3548 return d
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3549
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3550 def shift(self, other, context=None):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3551 """Returns a shifted copy of self, value-of-other times."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3552 if context is None:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3553 context = getcontext()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3554
56969
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3555 other = _convert_other(other, raiseit=True)
63eb2883926b Issue #7233: A number of two-argument Decimal methods were failing to
Mark Dickinson <dickinsm@gmail.com>
parents: 56642
diff changeset
3556
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3557 ans = self._check_nans(other, context)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3558 if ans:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3559 return ans
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3560
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3561 if other._exp != 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3562 return context._raise_error(InvalidOperation)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3563 if not (-context.prec <= int(other) <= context.prec):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3564 return context._raise_error(InvalidOperation)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3565
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3566 if self._isinfinity():
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
3567 return Decimal(self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3568
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3569 # get values, pad if necessary
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3570 torot = int(other)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3571 rotdig = self._int
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3572 topad = context.prec - len(rotdig)
56970
d5a34ef2fca7 Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
Mark Dickinson <dickinsm@gmail.com>
parents: 56969
diff changeset
3573 if topad > 0:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3574 rotdig = '0'*topad + rotdig
56970
d5a34ef2fca7 Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
Mark Dickinson <dickinsm@gmail.com>
parents: 56969
diff changeset
3575 elif topad < 0:
d5a34ef2fca7 Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
Mark Dickinson <dickinsm@gmail.com>
parents: 56969
diff changeset
3576 rotdig = rotdig[-topad:]
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3577
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3578 # let's shift!
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3579 if torot < 0:
56970
d5a34ef2fca7 Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
Mark Dickinson <dickinsm@gmail.com>
parents: 56969
diff changeset
3580 shifted = rotdig[:torot]
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3581 else:
56970
d5a34ef2fca7 Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
Mark Dickinson <dickinsm@gmail.com>
parents: 56969
diff changeset
3582 shifted = rotdig + '0'*torot
d5a34ef2fca7 Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
Mark Dickinson <dickinsm@gmail.com>
parents: 56969
diff changeset
3583 shifted = shifted[-context.prec:]
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3584
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3585 return _dec_from_triple(self._sign,
56970
d5a34ef2fca7 Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
Mark Dickinson <dickinsm@gmail.com>
parents: 56969
diff changeset
3586 shifted.lstrip('0') or '0', self._exp)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3587
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3588 # Support for pickling, copy, and deepcopy
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3589 def __reduce__(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3590 return (self.__class__, (str(self),))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3591
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3592 def __copy__(self):
58485
fbfe5e42349f compare types with is not ==
Benjamin Peterson <benjamin@python.org>
parents: 58484
diff changeset
3593 if type(self) is Decimal:
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
3594 return self # I'm immutable; therefore I am my own clone
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3595 return self.__class__(str(self))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3596
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3597 def __deepcopy__(self, memo):
58485
fbfe5e42349f compare types with is not ==
Benjamin Peterson <benjamin@python.org>
parents: 58484
diff changeset
3598 if type(self) is Decimal:
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
3599 return self # My components are also immutable
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3600 return self.__class__(str(self))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3601
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3602 # PEP 3101 support. the _localeconv keyword argument should be
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3603 # considered private: it's provided for ease of testing only.
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3604 def __format__(self, specifier, context=None, _localeconv=None):
45568
facf01f15b15 Fix docstring typo.
Mark Dickinson <dickinsm@gmail.com>
parents: 45566
diff changeset
3605 """Format a Decimal instance according to the given specifier.
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3606
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3607 The specifier should be a standard format specifier, with the
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3608 form described in PEP 3101. Formatting types 'e', 'E', 'f',
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3609 'F', 'g', 'G', 'n' and '%' are supported. If the formatting
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3610 type is omitted it defaults to 'g' or 'G', depending on the
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3611 value of context.capitals.
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3612 """
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3613
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3614 # Note: PEP 3101 says that if the type is not present then
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3615 # there should be at least one digit after the decimal point.
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3616 # We take the liberty of ignoring this requirement for
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3617 # Decimal---it's presumably there to make sure that
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3618 # format(float, '') behaves similarly to str(float).
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3619 if context is None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3620 context = getcontext()
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3621
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3622 spec = _parse_format_specifier(specifier, _localeconv=_localeconv)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3623
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3624 # special values don't care about the type or precision
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3625 if self._is_special:
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3626 sign = _format_sign(self._sign, spec)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3627 body = str(self.copy_abs())
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3628 return _format_align(sign, body, spec)
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3629
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3630 # a type of None defaults to 'g' or 'G', depending on context
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3631 if spec['type'] is None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3632 spec['type'] = ['g', 'G'][context.capitals]
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3633
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3634 # if type is '%', adjust exponent of self accordingly
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3635 if spec['type'] == '%':
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3636 self = _dec_from_triple(self._sign, self._int, self._exp+2)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3637
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3638 # round if necessary, taking rounding mode from the context
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3639 rounding = context.rounding
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3640 precision = spec['precision']
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3641 if precision is not None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3642 if spec['type'] in 'eE':
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3643 self = self._round(precision+1, rounding)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3644 elif spec['type'] in 'fF%':
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3645 self = self._rescale(-precision, rounding)
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3646 elif spec['type'] in 'gG' and len(self._int) > precision:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3647 self = self._round(precision, rounding)
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3648 # special case: zeros with a positive exponent can't be
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3649 # represented in fixed point; rescale them to 0e0.
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3650 if not self and self._exp > 0 and spec['type'] in 'fF%':
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3651 self = self._rescale(0, rounding)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3652
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3653 # figure out placement of the decimal point
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3654 leftdigits = self._exp + len(self._int)
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3655 if spec['type'] in 'eE':
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3656 if not self and precision is not None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3657 dotplace = 1 - precision
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3658 else:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3659 dotplace = 1
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3660 elif spec['type'] in 'fF%':
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3661 dotplace = leftdigits
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3662 elif spec['type'] in 'gG':
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3663 if self._exp <= 0 and leftdigits > -6:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3664 dotplace = leftdigits
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3665 else:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3666 dotplace = 1
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3667
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3668 # find digits before and after decimal point, and get exponent
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3669 if dotplace < 0:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3670 intpart = '0'
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3671 fracpart = '0'*(-dotplace) + self._int
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3672 elif dotplace > len(self._int):
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3673 intpart = self._int + '0'*(dotplace-len(self._int))
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3674 fracpart = ''
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3675 else:
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3676 intpart = self._int[:dotplace] or '0'
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3677 fracpart = self._int[dotplace:]
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3678 exp = leftdigits-dotplace
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3679
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3680 # done with the decimal-specific stuff; hand over the rest
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3681 # of the formatting to the _format_number function
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3682 return _format_number(self._sign, intpart, fracpart, exp, spec)
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3683
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3684 def _dec_from_triple(sign, coefficient, exponent, special=False):
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3685 """Create a decimal instance directly, without any validation,
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3686 normalization (e.g. removal of leading zeros) or argument
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3687 conversion.
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3688
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3689 This function is for *internal use only*.
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3690 """
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3691
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3692 self = object.__new__(Decimal)
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3693 self._sign = sign
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3694 self._int = coefficient
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3695 self._exp = exponent
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3696 self._is_special = special
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3697
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3698 return self
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
3699
51293
5c254795aa07 Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51027
diff changeset
3700 # Register Decimal as a kind of Number (an abstract base class).
5c254795aa07 Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51027
diff changeset
3701 # However, do not register it as Real (because Decimals are not
5c254795aa07 Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51027
diff changeset
3702 # interoperable with floats).
5c254795aa07 Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51027
diff changeset
3703 _numbers.Number.register(Decimal)
5c254795aa07 Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51027
diff changeset
3704
5c254795aa07 Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51027
diff changeset
3705
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3706 ##### Context class #######################################################
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
3707
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
3708
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
3709 # get rounding method function:
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3710 rounding_functions = [name for name in Decimal.__dict__.keys()
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3711 if name.startswith('_round_')]
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3712 for name in rounding_functions:
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3713 # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3714 globalname = name[1:].upper()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3715 val = globals()[globalname]
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3716 Decimal._pick_rounding_function[val] = name
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3717
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3718 del name, val, globalname, rounding_functions
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3719
39721
2f086d58ca10 Make decimal.ContextManager a private implementation detail of decimal.localcontext()
Nick Coghlan <ncoghlan@gmail.com>
parents: 39707
diff changeset
3720 class _ContextManager(object):
39707
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
3721 """Context manager class to support localcontext().
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
3722
39721
2f086d58ca10 Make decimal.ContextManager a private implementation detail of decimal.localcontext()
Nick Coghlan <ncoghlan@gmail.com>
parents: 39707
diff changeset
3723 Sets a copy of the supplied context in __enter__() and restores
39707
a83957c91fdb Fix the wrongheaded implementation of context management in the decimal module and add unit tests. (python-dev discussion is ongoing regarding what we do about Python 2.5)
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
3724 the previous decimal context in __exit__()
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3725 """
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3726 def __init__(self, new_context):
39721
2f086d58ca10 Make decimal.ContextManager a private implementation detail of decimal.localcontext()
Nick Coghlan <ncoghlan@gmail.com>
parents: 39707
diff changeset
3727 self.new_context = new_context.copy()
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3728 def __enter__(self):
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3729 self.saved_context = getcontext()
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3730 setcontext(self.new_context)
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3731 return self.new_context
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3732 def __exit__(self, t, v, tb):
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3733 setcontext(self.saved_context)
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3734
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3735 class Context(object):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3736 """Contains the context for a Decimal instance.
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 Contains:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3739 prec - precision (for use in rounding, division, square roots..)
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3740 rounding - rounding type (how you round)
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
3741 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
3742 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
3743 substituted in.
46643
ec09ad5bed1a Backport Raymond's changes in r60508 to Python 2.6.
Mark Dickinson <dickinsm@gmail.com>
parents: 46625
diff changeset
3744 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
3745 (Whether or not the trap_enabler is set)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3746 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
3747 Emin - Minimum exponent
ab0a2b74ddfd Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents: 32487
diff changeset
3748 Emax - Maximum exponent
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3749 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
3750 If 0, printed as 1e1
32496
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
3751 _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
3752 """
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3753
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3754 def __init__(self, prec=None, rounding=None,
33722
74a57e6684f3 Don't use mutable values for method defaults.
Raymond Hettinger <python@rcn.com>
parents: 33695
diff changeset
3755 traps=None, flags=None,
32489
ab0a2b74ddfd Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents: 32487
diff changeset
3756 Emin=None, Emax=None,
32496
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
3757 capitals=None, _clamp=0,
33722
74a57e6684f3 Don't use mutable values for method defaults.
Raymond Hettinger <python@rcn.com>
parents: 33695
diff changeset
3758 _ignored_flags=None):
62871
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3759 # Set defaults; for everything except flags and _ignored_flags,
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3760 # inherit from DefaultContext.
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3761 try:
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3762 dc = DefaultContext
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3763 except NameError:
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3764 pass
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3765
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3766 self.prec = prec if prec is not None else dc.prec
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3767 self.rounding = rounding if rounding is not None else dc.rounding
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3768 self.Emin = Emin if Emin is not None else dc.Emin
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3769 self.Emax = Emax if Emax is not None else dc.Emax
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3770 self.capitals = capitals if capitals is not None else dc.capitals
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3771 self._clamp = _clamp if _clamp is not None else dc._clamp
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3772
33722
74a57e6684f3 Don't use mutable values for method defaults.
Raymond Hettinger <python@rcn.com>
parents: 33695
diff changeset
3773 if _ignored_flags is None:
62871
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3774 self._ignored_flags = []
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3775 else:
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3776 self._ignored_flags = _ignored_flags
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3777
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3778 if traps is None:
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3779 self.traps = dc.traps.copy()
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3780 elif not isinstance(traps, dict):
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3781 self.traps = dict((s, int(s in traps)) for s in _signals)
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3782 else:
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3783 self.traps = traps
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3784
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3785 if flags is None:
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3786 self.flags = dict.fromkeys(_signals, 0)
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3787 elif not isinstance(flags, dict):
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3788 self.flags = dict((s, int(s in flags)) for s in _signals)
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3789 else:
6edc3e2a7da4 Merged revisions 82654 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62867
diff changeset
3790 self.flags = flags
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3791
32487
fa23a9b18967 Fix clear_flags(). Make a readable (not evalable) Context repr.
Raymond Hettinger <python@rcn.com>
parents: 32482
diff changeset
3792 def __repr__(self):
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
3793 """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
3794 s = []
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3795 s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3796 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3797 % vars(self))
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3798 names = [f.__name__ for f, v in self.flags.items() if v]
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3799 s.append('flags=[' + ', '.join(names) + ']')
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3800 names = [t.__name__ for t, v in self.traps.items() if v]
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3801 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
3802 return ', '.join(s) + ')'
fa23a9b18967 Fix clear_flags(). Make a readable (not evalable) Context repr.
Raymond Hettinger <python@rcn.com>
parents: 32482
diff changeset
3803
32477
bc586db9945a Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents: 32456
diff changeset
3804 def clear_flags(self):
bc586db9945a Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents: 32456
diff changeset
3805 """Reset all flags to zero"""
bc586db9945a Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents: 32456
diff changeset
3806 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
3807 self.flags[flag] = 0
32477
bc586db9945a Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents: 32456
diff changeset
3808
33044
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
3809 def _shallow_copy(self):
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
3810 """Returns a shallow copy from self."""
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
3811 nc = Context(self.prec, self.rounding, self.traps,
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
3812 self.flags, self.Emin, self.Emax,
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
3813 self.capitals, self._clamp, self._ignored_flags)
33044
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
3814 return nc
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
3815
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3816 def copy(self):
33044
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
3817 """Returns a deep copy from self."""
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3818 nc = Context(self.prec, self.rounding, self.traps.copy(),
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
3819 self.flags.copy(), self.Emin, self.Emax,
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
3820 self.capitals, self._clamp, self._ignored_flags)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3821 return nc
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3822 __copy__ = copy
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3823
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
3824 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
3825 """Handles an error
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3826
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3827 If the flag is in _ignored_flags, returns the default response.
46643
ec09ad5bed1a Backport Raymond's changes in r60508 to Python 2.6.
Mark Dickinson <dickinsm@gmail.com>
parents: 46625
diff changeset
3828 Otherwise, it sets the flag, then, if the corresponding
61743
8c6f981699e8 Fix typos in docstrings.
Stefan Krah <stefan@bytereef.org>
parents: 61211
diff changeset
3829 trap_enabler is set, it reraises the exception. Otherwise, it returns
46643
ec09ad5bed1a Backport Raymond's changes in r60508 to Python 2.6.
Mark Dickinson <dickinsm@gmail.com>
parents: 46625
diff changeset
3830 the default value after setting the flag.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3831 """
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
3832 error = _condition_map.get(condition, condition)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3833 if error in self._ignored_flags:
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3834 # Don't touch the flag
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3835 return error().handle(self, *args)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3836
46643
ec09ad5bed1a Backport Raymond's changes in r60508 to Python 2.6.
Mark Dickinson <dickinsm@gmail.com>
parents: 46625
diff changeset
3837 self.flags[error] = 1
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
3838 if not self.traps[error]:
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3839 # The errors define how to handle themselves.
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
3840 return condition().handle(self, *args)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3841
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3842 # Errors should only be risked on copies of the context
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3843 # self._ignored_flags = []
46651
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
3844 raise error(explanation)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3845
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3846 def _ignore_all_flags(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3847 """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
3848 return self._ignore_flags(*_signals)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3849
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3850 def _ignore_flags(self, *flags):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3851 """Ignore the flags, if they are raised"""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3852 # 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
3853 # alone.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3854 self._ignored_flags = (self._ignored_flags + list(flags))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3855 return list(flags)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3856
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3857 def _regard_flags(self, *flags):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3858 """Stop ignoring the flags, if they are raised"""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3859 if flags and isinstance(flags[0], (tuple,list)):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3860 flags = flags[0]
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3861 for flag in flags:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3862 self._ignored_flags.remove(flag)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3863
47961
f9b80a820a25 Issue 2235: __hash__ is once again inherited by default, but inheritance can be blocked explicitly so that collections.Hashable remains meaningful
Nick Coghlan <ncoghlan@gmail.com>
parents: 47872
diff changeset
3864 # We inherit object.__hash__, so we must deny this explicitly
f9b80a820a25 Issue 2235: __hash__ is once again inherited by default, but inheritance can be blocked explicitly so that collections.Hashable remains meaningful
Nick Coghlan <ncoghlan@gmail.com>
parents: 47872
diff changeset
3865 __hash__ = None
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
3866
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3867 def Etiny(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3868 """Returns Etiny (= Emin - prec + 1)"""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3869 return int(self.Emin - self.prec + 1)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3870
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3871 def Etop(self):
32496
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
3872 """Returns maximum exponent (= Emax - prec + 1)"""
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3873 return int(self.Emax - self.prec + 1)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3874
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3875 def _set_rounding(self, type):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3876 """Sets the rounding type.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3877
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3878 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
3879 rounding type. Often used like:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3880
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3881 context = context.copy()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3882 # so you don't change the calling context
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3883 # if an error occurs in the middle.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3884 rounding = context._set_rounding(ROUND_UP)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3885 val = self.__sub__(other, context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3886 context._set_rounding(rounding)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3887
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3888 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
3889 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3890 rounding = self.rounding
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3891 self.rounding= type
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3892 return rounding
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3893
32666
c13d911ae05b * Rename "Signals" to "_signals" making it non-public.
Raymond Hettinger <python@rcn.com>
parents: 32576
diff changeset
3894 def create_decimal(self, num='0'):
44650
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3895 """Creates a new Decimal instance but using self as context.
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3896
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3897 This method implements the to-number operation of the
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3898 IBM Decimal specification."""
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3899
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3900 if isinstance(num, basestring) and num != num.strip():
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3901 return self._raise_error(ConversionSyntax,
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3902 "no trailing or leading whitespace is "
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3903 "permitted.")
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3904
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3905 d = Decimal(num, context=self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3906 if d._isnan() and len(d._int) > self.prec - self._clamp:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3907 return self._raise_error(ConversionSyntax,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3908 "diagnostic info too long in NaN")
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
3909 return d._fix(self)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3910
50496
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3911 def create_decimal_from_float(self, f):
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3912 """Creates a new Decimal instance from a float but rounding using self
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3913 as the context.
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3914
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3915 >>> context = Context(prec=5, rounding=ROUND_DOWN)
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3916 >>> context.create_decimal_from_float(3.1415926535897932)
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3917 Decimal('3.1415')
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3918 >>> context = Context(prec=5, traps=[Inexact])
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3919 >>> context.create_decimal_from_float(3.1415926535897932)
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3920 Traceback (most recent call last):
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3921 ...
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3922 Inexact: None
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3923
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3924 """
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3925 d = Decimal.from_float(f) # An exact conversion
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3926 return d._fix(self) # Apply the context rounding
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3927
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3928 # Methods
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3929 def abs(self, a):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3930 """Returns the absolute value of the operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3931
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3932 If the operand is negative, the result is the same as using the minus
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
3933 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
3934 the plus operation on the operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3935
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3936 >>> ExtendedContext.abs(Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
3937 Decimal('2.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3938 >>> ExtendedContext.abs(Decimal('-100'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
3939 Decimal('100')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3940 >>> ExtendedContext.abs(Decimal('101.5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
3941 Decimal('101.5')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3942 >>> ExtendedContext.abs(Decimal('-101.5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
3943 Decimal('101.5')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3944 >>> ExtendedContext.abs(-1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3945 Decimal('1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3946 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3947 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3948 return a.__abs__(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3949
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3950 def add(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3951 """Return the sum of the two operands.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3952
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3953 >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
3954 Decimal('19.00')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3955 >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
3956 Decimal('1.02E+4')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3957 >>> ExtendedContext.add(1, Decimal(2))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3958 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3959 >>> ExtendedContext.add(Decimal(8), 5)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3960 Decimal('13')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3961 >>> ExtendedContext.add(5, 5)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3962 Decimal('10')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3963 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3964 a = _convert_other(a, raiseit=True)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3965 r = a.__add__(b, context=self)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3966 if r is NotImplemented:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3967 raise TypeError("Unable to convert %s to Decimal" % b)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3968 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3969 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3970
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3971 def _apply(self, a):
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
3972 return str(a._fix(self))
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3973
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3974 def canonical(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3975 """Returns the same Decimal object.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3976
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3977 As we do not have different encodings for the same number, the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3978 received object already is in its canonical form.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3979
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3980 >>> ExtendedContext.canonical(Decimal('2.50'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
3981 Decimal('2.50')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3982 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3983 return a.canonical(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
3984
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3985 def compare(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3986 """Compares values numerically.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3987
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3988 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
3989 ('-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
3990 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
3991 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
3992 operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3993
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3994 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
3995 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
3996 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
3997 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
3998
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3999 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4000 Decimal('-1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4001 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4002 Decimal('0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4003 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4004 Decimal('0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4005 >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4006 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4007 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4008 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4009 >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4010 Decimal('-1')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4011 >>> ExtendedContext.compare(1, 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4012 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4013 >>> ExtendedContext.compare(Decimal(1), 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4014 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4015 >>> ExtendedContext.compare(1, Decimal(2))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4016 Decimal('-1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4017 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4018 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4019 return a.compare(b, context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4020
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4021 def compare_signal(self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4022 """Compares the values of the two operands numerically.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4023
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4024 It's pretty much like compare(), but all NaNs signal, with signaling
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4025 NaNs taking precedence over quiet NaNs.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4026
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4027 >>> c = ExtendedContext
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4028 >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4029 Decimal('-1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4030 >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4031 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4032 >>> c.flags[InvalidOperation] = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4033 >>> print c.flags[InvalidOperation]
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4034 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4035 >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4036 Decimal('NaN')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4037 >>> print c.flags[InvalidOperation]
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4038 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4039 >>> c.flags[InvalidOperation] = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4040 >>> print c.flags[InvalidOperation]
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4041 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4042 >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4043 Decimal('NaN')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4044 >>> print c.flags[InvalidOperation]
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4045 1
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4046 >>> c.compare_signal(-1, 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4047 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4048 >>> c.compare_signal(Decimal(-1), 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4049 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4050 >>> c.compare_signal(-1, Decimal(2))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4051 Decimal('-1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4052 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4053 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4054 return a.compare_signal(b, context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4055
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4056 def compare_total(self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4057 """Compares two operands using their abstract representation.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4058
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4059 This is not like the standard compare, which use their numerical
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4060 value. Note that a total ordering is defined for all possible abstract
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4061 representations.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4062
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4063 >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4064 Decimal('-1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4065 >>> ExtendedContext.compare_total(Decimal('-127'), Decimal('12'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4066 Decimal('-1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4067 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4068 Decimal('-1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4069 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4070 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4071 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('12.300'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4072 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4073 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4074 Decimal('-1')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4075 >>> ExtendedContext.compare_total(1, 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4076 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4077 >>> ExtendedContext.compare_total(Decimal(1), 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4078 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4079 >>> ExtendedContext.compare_total(1, Decimal(2))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4080 Decimal('-1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4081 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4082 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4083 return a.compare_total(b)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4084
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4085 def compare_total_mag(self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4086 """Compares two operands using their abstract representation ignoring sign.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4087
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4088 Like compare_total, but with operand's sign ignored and assumed to be 0.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4089 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4090 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4091 return a.compare_total_mag(b)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4092
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4093 def copy_abs(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4094 """Returns a copy of the operand with the sign set to 0.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4095
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4096 >>> ExtendedContext.copy_abs(Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4097 Decimal('2.1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4098 >>> ExtendedContext.copy_abs(Decimal('-100'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4099 Decimal('100')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4100 >>> ExtendedContext.copy_abs(-1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4101 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4102 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4103 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4104 return a.copy_abs()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4105
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4106 def copy_decimal(self, a):
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4107 """Returns a copy of the decimal object.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4108
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4109 >>> ExtendedContext.copy_decimal(Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4110 Decimal('2.1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4111 >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4112 Decimal('-1.00')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4113 >>> ExtendedContext.copy_decimal(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4114 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4115 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4116 a = _convert_other(a, raiseit=True)
43383
8890be9386b7 The methods always return Decimal classes, even if they're
Facundo Batista <facundobatista@gmail.com>
parents: 43362
diff changeset
4117 return Decimal(a)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4118
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4119 def copy_negate(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4120 """Returns a copy of the operand with the sign inverted.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4121
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4122 >>> ExtendedContext.copy_negate(Decimal('101.5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4123 Decimal('-101.5')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4124 >>> ExtendedContext.copy_negate(Decimal('-101.5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4125 Decimal('101.5')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4126 >>> ExtendedContext.copy_negate(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4127 Decimal('-1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4128 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4129 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4130 return a.copy_negate()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4131
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4132 def copy_sign(self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4133 """Copies the second operand's sign to the first one.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4134
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4135 In detail, it returns a copy of the first operand with the sign
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4136 equal to the sign of the second operand.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4137
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4138 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4139 Decimal('1.50')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4140 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4141 Decimal('1.50')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4142 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4143 Decimal('-1.50')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4144 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4145 Decimal('-1.50')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4146 >>> ExtendedContext.copy_sign(1, -2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4147 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4148 >>> ExtendedContext.copy_sign(Decimal(1), -2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4149 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4150 >>> ExtendedContext.copy_sign(1, Decimal(-2))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4151 Decimal('-1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4152 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4153 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4154 return a.copy_sign(b)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4155
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4156 def divide(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4157 """Decimal division in a specified context.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4158
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4159 >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4160 Decimal('0.333333333')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4161 >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4162 Decimal('0.666666667')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4163 >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4164 Decimal('2.5')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4165 >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4166 Decimal('0.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4167 >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4168 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4169 >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4170 Decimal('4.00')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4171 >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4172 Decimal('1.20')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4173 >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4174 Decimal('10')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4175 >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4176 Decimal('1000')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4177 >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4178 Decimal('1.20E+6')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4179 >>> ExtendedContext.divide(5, 5)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4180 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4181 >>> ExtendedContext.divide(Decimal(5), 5)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4182 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4183 >>> ExtendedContext.divide(5, Decimal(5))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4184 Decimal('1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4185 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4186 a = _convert_other(a, raiseit=True)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4187 r = a.__div__(b, context=self)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4188 if r is NotImplemented:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4189 raise TypeError("Unable to convert %s to Decimal" % b)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4190 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4191 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4192
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4193 def divide_int(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4194 """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
4195
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4196 >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4197 Decimal('0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4198 >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4199 Decimal('3')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4200 >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4201 Decimal('3')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4202 >>> ExtendedContext.divide_int(10, 3)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4203 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4204 >>> ExtendedContext.divide_int(Decimal(10), 3)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4205 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4206 >>> ExtendedContext.divide_int(10, Decimal(3))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4207 Decimal('3')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4208 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4209 a = _convert_other(a, raiseit=True)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4210 r = a.__floordiv__(b, context=self)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4211 if r is NotImplemented:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4212 raise TypeError("Unable to convert %s to Decimal" % b)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4213 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4214 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4215
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4216 def divmod(self, a, b):
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4217 """Return (a // b, a % b).
58168
882c9e711a2d Add missing docstring for Context.divmod. Thanks Juan José Conti.
Mark Dickinson <dickinsm@gmail.com>
parents: 56970
diff changeset
4218
882c9e711a2d Add missing docstring for Context.divmod. Thanks Juan José Conti.
Mark Dickinson <dickinsm@gmail.com>
parents: 56970
diff changeset
4219 >>> ExtendedContext.divmod(Decimal(8), Decimal(3))
882c9e711a2d Add missing docstring for Context.divmod. Thanks Juan José Conti.
Mark Dickinson <dickinsm@gmail.com>
parents: 56970
diff changeset
4220 (Decimal('2'), Decimal('2'))
882c9e711a2d Add missing docstring for Context.divmod. Thanks Juan José Conti.
Mark Dickinson <dickinsm@gmail.com>
parents: 56970
diff changeset
4221 >>> ExtendedContext.divmod(Decimal(8), Decimal(4))
882c9e711a2d Add missing docstring for Context.divmod. Thanks Juan José Conti.
Mark Dickinson <dickinsm@gmail.com>
parents: 56970
diff changeset
4222 (Decimal('2'), Decimal('0'))
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4223 >>> ExtendedContext.divmod(8, 4)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4224 (Decimal('2'), Decimal('0'))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4225 >>> ExtendedContext.divmod(Decimal(8), 4)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4226 (Decimal('2'), Decimal('0'))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4227 >>> ExtendedContext.divmod(8, Decimal(4))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4228 (Decimal('2'), Decimal('0'))
58168
882c9e711a2d Add missing docstring for Context.divmod. Thanks Juan José Conti.
Mark Dickinson <dickinsm@gmail.com>
parents: 56970
diff changeset
4229 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4230 a = _convert_other(a, raiseit=True)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4231 r = a.__divmod__(b, context=self)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4232 if r is NotImplemented:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4233 raise TypeError("Unable to convert %s to Decimal" % b)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4234 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4235 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4236
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4237 def exp(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4238 """Returns e ** a.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4239
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4240 >>> c = ExtendedContext.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4241 >>> c.Emin = -999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4242 >>> c.Emax = 999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4243 >>> c.exp(Decimal('-Infinity'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4244 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4245 >>> c.exp(Decimal('-1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4246 Decimal('0.367879441')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4247 >>> c.exp(Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4248 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4249 >>> c.exp(Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4250 Decimal('2.71828183')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4251 >>> c.exp(Decimal('0.693147181'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4252 Decimal('2.00000000')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4253 >>> c.exp(Decimal('+Infinity'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4254 Decimal('Infinity')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4255 >>> c.exp(10)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4256 Decimal('22026.4658')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4257 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4258 a =_convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4259 return a.exp(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4260
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4261 def fma(self, a, b, c):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4262 """Returns a multiplied by b, plus c.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4263
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4264 The first two operands are multiplied together, using multiply,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4265 the third operand is then added to the result of that
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4266 multiplication, using add, all with only one final rounding.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4267
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4268 >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4269 Decimal('22')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4270 >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4271 Decimal('-8')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4272 >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4273 Decimal('1.38435736E+12')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4274 >>> ExtendedContext.fma(1, 3, 4)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4275 Decimal('7')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4276 >>> ExtendedContext.fma(1, Decimal(3), 4)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4277 Decimal('7')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4278 >>> ExtendedContext.fma(1, 3, Decimal(4))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4279 Decimal('7')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4280 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4281 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4282 return a.fma(b, c, context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4283
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4284 def is_canonical(self, a):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4285 """Return True if the operand is canonical; otherwise return False.
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4286
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4287 Currently, the encoding of a Decimal instance is always
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4288 canonical, so this method returns True for any Decimal.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4289
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4290 >>> ExtendedContext.is_canonical(Decimal('2.50'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4291 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4292 """
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4293 return a.is_canonical()
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4294
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4295 def is_finite(self, a):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4296 """Return True if the operand is finite; otherwise return False.
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4297
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4298 A Decimal instance is considered finite if it is neither
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4299 infinite nor a NaN.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4300
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4301 >>> ExtendedContext.is_finite(Decimal('2.50'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4302 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4303 >>> ExtendedContext.is_finite(Decimal('-0.3'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4304 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4305 >>> ExtendedContext.is_finite(Decimal('0'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4306 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4307 >>> ExtendedContext.is_finite(Decimal('Inf'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4308 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4309 >>> ExtendedContext.is_finite(Decimal('NaN'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4310 False
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4311 >>> ExtendedContext.is_finite(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4312 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4313 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4314 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4315 return a.is_finite()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4316
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4317 def is_infinite(self, a):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4318 """Return True if the operand is infinite; otherwise return False.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4319
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4320 >>> ExtendedContext.is_infinite(Decimal('2.50'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4321 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4322 >>> ExtendedContext.is_infinite(Decimal('-Inf'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4323 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4324 >>> ExtendedContext.is_infinite(Decimal('NaN'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4325 False
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4326 >>> ExtendedContext.is_infinite(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4327 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4328 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4329 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4330 return a.is_infinite()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4331
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4332 def is_nan(self, a):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4333 """Return True if the operand is a qNaN or sNaN;
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4334 otherwise return False.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4335
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4336 >>> ExtendedContext.is_nan(Decimal('2.50'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4337 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4338 >>> ExtendedContext.is_nan(Decimal('NaN'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4339 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4340 >>> ExtendedContext.is_nan(Decimal('-sNaN'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4341 True
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4342 >>> ExtendedContext.is_nan(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4343 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4344 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4345 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4346 return a.is_nan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4347
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4348 def is_normal(self, a):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4349 """Return True if the operand is a normal number;
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4350 otherwise return False.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4351
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4352 >>> c = ExtendedContext.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4353 >>> c.Emin = -999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4354 >>> c.Emax = 999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4355 >>> c.is_normal(Decimal('2.50'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4356 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4357 >>> c.is_normal(Decimal('0.1E-999'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4358 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4359 >>> c.is_normal(Decimal('0.00'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4360 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4361 >>> c.is_normal(Decimal('-Inf'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4362 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4363 >>> c.is_normal(Decimal('NaN'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4364 False
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4365 >>> c.is_normal(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4366 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4367 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4368 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4369 return a.is_normal(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4370
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4371 def is_qnan(self, a):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4372 """Return True if the operand is a quiet NaN; otherwise return False.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4373
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4374 >>> ExtendedContext.is_qnan(Decimal('2.50'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4375 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4376 >>> ExtendedContext.is_qnan(Decimal('NaN'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4377 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4378 >>> ExtendedContext.is_qnan(Decimal('sNaN'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4379 False
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4380 >>> ExtendedContext.is_qnan(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4381 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4382 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4383 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4384 return a.is_qnan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4385
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4386 def is_signed(self, a):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4387 """Return True if the operand is negative; otherwise return False.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4388
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4389 >>> ExtendedContext.is_signed(Decimal('2.50'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4390 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4391 >>> ExtendedContext.is_signed(Decimal('-12'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4392 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4393 >>> ExtendedContext.is_signed(Decimal('-0'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4394 True
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4395 >>> ExtendedContext.is_signed(8)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4396 False
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4397 >>> ExtendedContext.is_signed(-8)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4398 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4399 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4400 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4401 return a.is_signed()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4402
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4403 def is_snan(self, a):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4404 """Return True if the operand is a signaling NaN;
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4405 otherwise return False.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4406
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4407 >>> ExtendedContext.is_snan(Decimal('2.50'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4408 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4409 >>> ExtendedContext.is_snan(Decimal('NaN'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4410 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4411 >>> ExtendedContext.is_snan(Decimal('sNaN'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4412 True
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4413 >>> ExtendedContext.is_snan(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4414 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4415 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4416 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4417 return a.is_snan()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4418
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4419 def is_subnormal(self, a):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4420 """Return True if the operand is subnormal; otherwise return False.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4421
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4422 >>> c = ExtendedContext.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4423 >>> c.Emin = -999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4424 >>> c.Emax = 999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4425 >>> c.is_subnormal(Decimal('2.50'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4426 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4427 >>> c.is_subnormal(Decimal('0.1E-999'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4428 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4429 >>> c.is_subnormal(Decimal('0.00'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4430 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4431 >>> c.is_subnormal(Decimal('-Inf'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4432 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4433 >>> c.is_subnormal(Decimal('NaN'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4434 False
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4435 >>> c.is_subnormal(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4436 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4437 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4438 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4439 return a.is_subnormal(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4440
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4441 def is_zero(self, a):
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4442 """Return True if the operand is a zero; otherwise return False.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4443
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4444 >>> ExtendedContext.is_zero(Decimal('0'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4445 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4446 >>> ExtendedContext.is_zero(Decimal('2.50'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4447 False
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4448 >>> ExtendedContext.is_zero(Decimal('-0E+2'))
43454
9d6d9ac95ae1 Made the various is_* operations return booleans. This was discussed
Facundo Batista <facundobatista@gmail.com>
parents: 43409
diff changeset
4449 True
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4450 >>> ExtendedContext.is_zero(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4451 False
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4452 >>> ExtendedContext.is_zero(0)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4453 True
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4454 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4455 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4456 return a.is_zero()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4457
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4458 def ln(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4459 """Returns the natural (base e) logarithm of the operand.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4460
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4461 >>> c = ExtendedContext.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4462 >>> c.Emin = -999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4463 >>> c.Emax = 999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4464 >>> c.ln(Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4465 Decimal('-Infinity')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4466 >>> c.ln(Decimal('1.000'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4467 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4468 >>> c.ln(Decimal('2.71828183'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4469 Decimal('1.00000000')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4470 >>> c.ln(Decimal('10'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4471 Decimal('2.30258509')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4472 >>> c.ln(Decimal('+Infinity'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4473 Decimal('Infinity')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4474 >>> c.ln(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4475 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4476 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4477 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4478 return a.ln(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4479
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4480 def log10(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4481 """Returns the base 10 logarithm of the operand.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4482
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4483 >>> c = ExtendedContext.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4484 >>> c.Emin = -999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4485 >>> c.Emax = 999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4486 >>> c.log10(Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4487 Decimal('-Infinity')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4488 >>> c.log10(Decimal('0.001'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4489 Decimal('-3')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4490 >>> c.log10(Decimal('1.000'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4491 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4492 >>> c.log10(Decimal('2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4493 Decimal('0.301029996')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4494 >>> c.log10(Decimal('10'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4495 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4496 >>> c.log10(Decimal('70'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4497 Decimal('1.84509804')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4498 >>> c.log10(Decimal('+Infinity'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4499 Decimal('Infinity')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4500 >>> c.log10(0)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4501 Decimal('-Infinity')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4502 >>> c.log10(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4503 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4504 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4505 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4506 return a.log10(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4507
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4508 def logb(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4509 """ Returns the exponent of the magnitude of the operand's MSD.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4510
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4511 The result is the integer which is the exponent of the magnitude
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4512 of the most significant digit of the operand (as though the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4513 operand were truncated to a single digit while maintaining the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4514 value of that digit and without limiting the resulting exponent).
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4515
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4516 >>> ExtendedContext.logb(Decimal('250'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4517 Decimal('2')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4518 >>> ExtendedContext.logb(Decimal('2.50'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4519 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4520 >>> ExtendedContext.logb(Decimal('0.03'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4521 Decimal('-2')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4522 >>> ExtendedContext.logb(Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4523 Decimal('-Infinity')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4524 >>> ExtendedContext.logb(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4525 Decimal('0')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4526 >>> ExtendedContext.logb(10)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4527 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4528 >>> ExtendedContext.logb(100)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4529 Decimal('2')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4530 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4531 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4532 return a.logb(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4533
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4534 def logical_and(self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4535 """Applies the logical operation 'and' between each operand's digits.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4536
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4537 The operands must be both logical numbers.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4538
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4539 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4540 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4541 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4542 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4543 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4544 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4545 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4546 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4547 >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4548 Decimal('1000')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4549 >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4550 Decimal('10')
58935
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4551 >>> ExtendedContext.logical_and(110, 1101)
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4552 Decimal('100')
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4553 >>> ExtendedContext.logical_and(Decimal(110), 1101)
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4554 Decimal('100')
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4555 >>> ExtendedContext.logical_and(110, Decimal(1101))
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4556 Decimal('100')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4557 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4558 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4559 return a.logical_and(b, context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4560
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4561 def logical_invert(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4562 """Invert all the digits in the operand.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4563
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4564 The operand must be a logical number.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4565
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4566 >>> ExtendedContext.logical_invert(Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4567 Decimal('111111111')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4568 >>> ExtendedContext.logical_invert(Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4569 Decimal('111111110')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4570 >>> ExtendedContext.logical_invert(Decimal('111111111'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4571 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4572 >>> ExtendedContext.logical_invert(Decimal('101010101'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4573 Decimal('10101010')
58935
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4574 >>> ExtendedContext.logical_invert(1101)
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4575 Decimal('111110010')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4576 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4577 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4578 return a.logical_invert(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4579
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4580 def logical_or(self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4581 """Applies the logical operation 'or' between each operand's digits.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4582
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4583 The operands must be both logical numbers.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4584
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4585 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4586 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4587 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4588 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4589 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4590 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4591 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4592 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4593 >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4594 Decimal('1110')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4595 >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4596 Decimal('1110')
58935
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4597 >>> ExtendedContext.logical_or(110, 1101)
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4598 Decimal('1111')
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4599 >>> ExtendedContext.logical_or(Decimal(110), 1101)
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4600 Decimal('1111')
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4601 >>> ExtendedContext.logical_or(110, Decimal(1101))
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4602 Decimal('1111')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4603 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4604 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4605 return a.logical_or(b, context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4606
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4607 def logical_xor(self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4608 """Applies the logical operation 'xor' between each operand's digits.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4609
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4610 The operands must be both logical numbers.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4611
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4612 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4613 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4614 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4615 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4616 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4617 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4618 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4619 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4620 >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4621 Decimal('110')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4622 >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4623 Decimal('1101')
58935
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4624 >>> ExtendedContext.logical_xor(110, 1101)
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4625 Decimal('1011')
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4626 >>> ExtendedContext.logical_xor(Decimal(110), 1101)
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4627 Decimal('1011')
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4628 >>> ExtendedContext.logical_xor(110, Decimal(1101))
ea1adc6835cc Doctest fixes for decimal.py: add an integer-argument doctest for logical_invert; don't use integer literals with a leading zero.
Mark Dickinson <dickinsm@gmail.com>
parents: 58934
diff changeset
4629 Decimal('1011')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4630 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4631 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4632 return a.logical_xor(b, context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4633
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4634 def max(self, a, b):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4635 """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
4636
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4637 If either operand is a NaN then the general rules apply.
44701
2f11f7d9bdc8 Docstring typos
Andrew M. Kuchling <amk@amk.ca>
parents: 44650
diff changeset
4638 Otherwise, the operands are compared as though by the compare
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
4639 operation. If they are numerically equal then the left-hand operand
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
4640 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
4641 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
4642
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4643 >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4644 Decimal('3')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4645 >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4646 Decimal('3')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4647 >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4648 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
4649 >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4650 Decimal('7')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4651 >>> ExtendedContext.max(1, 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4652 Decimal('2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4653 >>> ExtendedContext.max(Decimal(1), 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4654 Decimal('2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4655 >>> ExtendedContext.max(1, Decimal(2))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4656 Decimal('2')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4657 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4658 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4659 return a.max(b, context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4660
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4661 def max_mag(self, a, b):
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4662 """Compares the values numerically with their sign ignored.
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4663
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4664 >>> ExtendedContext.max_mag(Decimal('7'), Decimal('NaN'))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4665 Decimal('7')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4666 >>> ExtendedContext.max_mag(Decimal('7'), Decimal('-10'))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4667 Decimal('-10')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4668 >>> ExtendedContext.max_mag(1, -2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4669 Decimal('-2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4670 >>> ExtendedContext.max_mag(Decimal(1), -2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4671 Decimal('-2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4672 >>> ExtendedContext.max_mag(1, Decimal(-2))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4673 Decimal('-2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4674 """
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4675 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4676 return a.max_mag(b, context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4677
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4678 def min(self, a, b):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4679 """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
4680
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4681 If either operand is a NaN then the general rules apply.
44701
2f11f7d9bdc8 Docstring typos
Andrew M. Kuchling <amk@amk.ca>
parents: 44650
diff changeset
4682 Otherwise, the operands are compared as though by the compare
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
4683 operation. If they are numerically equal then the left-hand operand
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
4684 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
4685 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
4686
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4687 >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4688 Decimal('2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4689 >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4690 Decimal('-10')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4691 >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4692 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
4693 >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4694 Decimal('7')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4695 >>> ExtendedContext.min(1, 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4696 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4697 >>> ExtendedContext.min(Decimal(1), 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4698 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4699 >>> ExtendedContext.min(1, Decimal(29))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4700 Decimal('1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4701 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4702 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4703 return a.min(b, context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4704
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4705 def min_mag(self, a, b):
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4706 """Compares the values numerically with their sign ignored.
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4707
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4708 >>> ExtendedContext.min_mag(Decimal('3'), Decimal('-2'))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4709 Decimal('-2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4710 >>> ExtendedContext.min_mag(Decimal('-3'), Decimal('NaN'))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4711 Decimal('-3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4712 >>> ExtendedContext.min_mag(1, -2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4713 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4714 >>> ExtendedContext.min_mag(Decimal(1), -2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4715 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4716 >>> ExtendedContext.min_mag(1, Decimal(-2))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4717 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4718 """
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4719 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4720 return a.min_mag(b, context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4721
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4722 def minus(self, a):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4723 """Minus corresponds to unary prefix minus in Python.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4724
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4725 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
4726 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
4727 has the same exponent as the operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4728
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4729 >>> ExtendedContext.minus(Decimal('1.3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4730 Decimal('-1.3')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4731 >>> ExtendedContext.minus(Decimal('-1.3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4732 Decimal('1.3')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4733 >>> ExtendedContext.minus(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4734 Decimal('-1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4735 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4736 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4737 return a.__neg__(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4738
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4739 def multiply(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4740 """multiply multiplies two operands.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4741
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
4742 If either operand is a special value then the general rules apply.
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4743 Otherwise, the operands are multiplied together
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4744 ('long multiplication'), resulting in a number which may be as long as
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4745 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
4746
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4747 >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4748 Decimal('3.60')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4749 >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4750 Decimal('21')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4751 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4752 Decimal('0.72')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4753 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4754 Decimal('-0.0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4755 >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4756 Decimal('4.28135971E+11')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4757 >>> ExtendedContext.multiply(7, 7)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4758 Decimal('49')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4759 >>> ExtendedContext.multiply(Decimal(7), 7)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4760 Decimal('49')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4761 >>> ExtendedContext.multiply(7, Decimal(7))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4762 Decimal('49')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4763 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4764 a = _convert_other(a, raiseit=True)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4765 r = a.__mul__(b, context=self)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4766 if r is NotImplemented:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4767 raise TypeError("Unable to convert %s to Decimal" % b)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4768 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4769 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4770
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4771 def next_minus(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4772 """Returns the largest representable number smaller than a.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4773
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4774 >>> c = ExtendedContext.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4775 >>> c.Emin = -999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4776 >>> c.Emax = 999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4777 >>> ExtendedContext.next_minus(Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4778 Decimal('0.999999999')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4779 >>> c.next_minus(Decimal('1E-1007'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4780 Decimal('0E-1007')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4781 >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4782 Decimal('-1.00000004')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4783 >>> c.next_minus(Decimal('Infinity'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4784 Decimal('9.99999999E+999')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4785 >>> c.next_minus(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4786 Decimal('0.999999999')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4787 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4788 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4789 return a.next_minus(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4790
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4791 def next_plus(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4792 """Returns the smallest representable number larger than a.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4793
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4794 >>> c = ExtendedContext.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4795 >>> c.Emin = -999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4796 >>> c.Emax = 999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4797 >>> ExtendedContext.next_plus(Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4798 Decimal('1.00000001')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4799 >>> c.next_plus(Decimal('-1E-1007'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4800 Decimal('-0E-1007')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4801 >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4802 Decimal('-1.00000002')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4803 >>> c.next_plus(Decimal('-Infinity'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4804 Decimal('-9.99999999E+999')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4805 >>> c.next_plus(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4806 Decimal('1.00000001')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4807 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4808 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4809 return a.next_plus(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4810
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4811 def next_toward(self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4812 """Returns the number closest to a, in direction towards b.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4813
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4814 The result is the closest representable number from the first
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4815 operand (but not the first operand) that is in the direction
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4816 towards the second operand, unless the operands have the same
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4817 value.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4818
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4819 >>> c = ExtendedContext.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4820 >>> c.Emin = -999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4821 >>> c.Emax = 999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4822 >>> c.next_toward(Decimal('1'), Decimal('2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4823 Decimal('1.00000001')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4824 >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4825 Decimal('-0E-1007')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4826 >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4827 Decimal('-1.00000002')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4828 >>> c.next_toward(Decimal('1'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4829 Decimal('0.999999999')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4830 >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4831 Decimal('0E-1007')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4832 >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4833 Decimal('-1.00000004')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4834 >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4835 Decimal('-0.00')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4836 >>> c.next_toward(0, 1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4837 Decimal('1E-1007')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4838 >>> c.next_toward(Decimal(0), 1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4839 Decimal('1E-1007')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4840 >>> c.next_toward(0, Decimal(1))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4841 Decimal('1E-1007')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4842 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4843 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4844 return a.next_toward(b, context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4845
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4846 def normalize(self, a):
32496
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
4847 """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
4848
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4849 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
4850 result.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4851
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4852 >>> ExtendedContext.normalize(Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4853 Decimal('2.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4854 >>> ExtendedContext.normalize(Decimal('-2.0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4855 Decimal('-2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4856 >>> ExtendedContext.normalize(Decimal('1.200'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4857 Decimal('1.2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4858 >>> ExtendedContext.normalize(Decimal('-120'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4859 Decimal('-1.2E+2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4860 >>> ExtendedContext.normalize(Decimal('120.00'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4861 Decimal('1.2E+2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4862 >>> ExtendedContext.normalize(Decimal('0.00'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4863 Decimal('0')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4864 >>> ExtendedContext.normalize(6)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4865 Decimal('6')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4866 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4867 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4868 return a.normalize(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4869
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4870 def number_class(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4871 """Returns an indication of the class of the operand.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4872
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4873 The class is one of the following strings:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4874 -sNaN
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4875 -NaN
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4876 -Infinity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4877 -Normal
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4878 -Subnormal
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4879 -Zero
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4880 +Zero
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4881 +Subnormal
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4882 +Normal
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4883 +Infinity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4884
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4885 >>> c = Context(ExtendedContext)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4886 >>> c.Emin = -999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4887 >>> c.Emax = 999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4888 >>> c.number_class(Decimal('Infinity'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4889 '+Infinity'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4890 >>> c.number_class(Decimal('1E-10'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4891 '+Normal'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4892 >>> c.number_class(Decimal('2.50'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4893 '+Normal'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4894 >>> c.number_class(Decimal('0.1E-999'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4895 '+Subnormal'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4896 >>> c.number_class(Decimal('0'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4897 '+Zero'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4898 >>> c.number_class(Decimal('-0'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4899 '-Zero'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4900 >>> c.number_class(Decimal('-0.1E-999'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4901 '-Subnormal'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4902 >>> c.number_class(Decimal('-1E-10'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4903 '-Normal'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4904 >>> c.number_class(Decimal('-2.50'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4905 '-Normal'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4906 >>> c.number_class(Decimal('-Infinity'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4907 '-Infinity'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4908 >>> c.number_class(Decimal('NaN'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4909 'NaN'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4910 >>> c.number_class(Decimal('-NaN'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4911 'NaN'
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4912 >>> c.number_class(Decimal('sNaN'))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4913 'sNaN'
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4914 >>> c.number_class(123)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4915 '+Normal'
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4916 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4917 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4918 return a.number_class(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4919
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4920 def plus(self, a):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4921 """Plus corresponds to unary prefix plus in Python.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4922
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4923 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
4924 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
4925 has the same exponent as the operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4926
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4927 >>> ExtendedContext.plus(Decimal('1.3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4928 Decimal('1.3')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4929 >>> ExtendedContext.plus(Decimal('-1.3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4930 Decimal('-1.3')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4931 >>> ExtendedContext.plus(-1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4932 Decimal('-1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4933 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4934 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4935 return a.__pos__(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4936
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4937 def power(self, a, b, modulo=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4938 """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
4939
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4940 With two arguments, compute a**b. If a is negative then b
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4941 must be integral. The result will be inexact unless b is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4942 integral and the result is finite and can be expressed exactly
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4943 in 'precision' digits.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4944
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4945 With three arguments, compute (a**b) % modulo. For the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4946 three argument form, the following restrictions on the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4947 arguments hold:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4948
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4949 - all three arguments must be integral
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4950 - b must be nonnegative
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4951 - at least one of a or b must be nonzero
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4952 - modulo must be nonzero and have at most 'precision' digits
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4953
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4954 The result of pow(a, b, modulo) is identical to the result
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4955 that would be obtained by computing (a**b) % modulo with
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4956 unbounded precision, but is computed more efficiently. It is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4957 always exact.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4958
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4959 >>> c = ExtendedContext.copy()
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4960 >>> c.Emin = -999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4961 >>> c.Emax = 999
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4962 >>> c.power(Decimal('2'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4963 Decimal('8')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4964 >>> c.power(Decimal('-2'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4965 Decimal('-8')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4966 >>> c.power(Decimal('2'), Decimal('-3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4967 Decimal('0.125')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4968 >>> c.power(Decimal('1.7'), Decimal('8'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4969 Decimal('69.7575744')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4970 >>> c.power(Decimal('10'), Decimal('0.301029996'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4971 Decimal('2.00000000')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4972 >>> c.power(Decimal('Infinity'), Decimal('-1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4973 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4974 >>> c.power(Decimal('Infinity'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4975 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4976 >>> c.power(Decimal('Infinity'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4977 Decimal('Infinity')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4978 >>> c.power(Decimal('-Infinity'), Decimal('-1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4979 Decimal('-0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4980 >>> c.power(Decimal('-Infinity'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4981 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4982 >>> c.power(Decimal('-Infinity'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4983 Decimal('-Infinity')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4984 >>> c.power(Decimal('-Infinity'), Decimal('2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4985 Decimal('Infinity')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4986 >>> c.power(Decimal('0'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4987 Decimal('NaN')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4988
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4989 >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4990 Decimal('11')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4991 >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4992 Decimal('-11')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4993 >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4994 Decimal('1')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4995 >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4996 Decimal('11')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4997 >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
4998 Decimal('11729830')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
4999 >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5000 Decimal('-0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5001 >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5002 Decimal('1')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5003 >>> ExtendedContext.power(7, 7)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5004 Decimal('823543')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5005 >>> ExtendedContext.power(Decimal(7), 7)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5006 Decimal('823543')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5007 >>> ExtendedContext.power(7, Decimal(7), 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5008 Decimal('1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5009 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5010 a = _convert_other(a, raiseit=True)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5011 r = a.__pow__(b, modulo, context=self)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5012 if r is NotImplemented:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5013 raise TypeError("Unable to convert %s to Decimal" % b)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5014 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5015 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5016
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5017 def quantize(self, a, b):
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5018 """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
5019
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5020 The coefficient of the result is derived from that of the left-hand
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5021 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
5022 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
5023 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
5024 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
5025
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5026 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
5027 quantize operation would be greater than precision then an Invalid
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5028 operation condition is raised. This guarantees that, unless there is
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5029 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
5030 equal to that of the right-hand operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5031
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5032 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
5033 if the result is subnormal and inexact.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5034
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5035 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5036 Decimal('2.170')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5037 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5038 Decimal('2.17')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5039 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5040 Decimal('2.2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5041 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5042 Decimal('2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5043 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5044 Decimal('0E+1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5045 >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5046 Decimal('-Infinity')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5047 >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5048 Decimal('NaN')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5049 >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5050 Decimal('-0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5051 >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5052 Decimal('-0E+5')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5053 >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5054 Decimal('NaN')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5055 >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5056 Decimal('NaN')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5057 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5058 Decimal('217.0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5059 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5060 Decimal('217')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5061 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5062 Decimal('2.2E+2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5063 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5064 Decimal('2E+2')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5065 >>> ExtendedContext.quantize(1, 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5066 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5067 >>> ExtendedContext.quantize(Decimal(1), 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5068 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5069 >>> ExtendedContext.quantize(1, Decimal(2))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5070 Decimal('1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5071 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5072 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5073 return a.quantize(b, context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5074
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5075 def radix(self):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5076 """Just returns 10, as this is Decimal, :)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5077
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5078 >>> ExtendedContext.radix()
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5079 Decimal('10')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5080 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5081 return Decimal(10)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5082
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5083 def remainder(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5084 """Returns the remainder from integer division.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5085
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5086 The result is the residue of the dividend after the operation of
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5087 calculating integer division as described for divide-integer, rounded
41532
4b9fa8092e82 Whitespace normalization. Ugh, we really need to do this more often.
Neal Norwitz <nnorwitz@gmail.com>
parents: 41418
diff changeset
5088 to precision digits if necessary. The sign of the result, if
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5089 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
5090
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5091 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
5092 (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
5093 remainder cannot be calculated).
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5094
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5095 >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5096 Decimal('2.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5097 >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5098 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5099 >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5100 Decimal('-1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5101 >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5102 Decimal('0.2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5103 >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5104 Decimal('0.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5105 >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5106 Decimal('1.0')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5107 >>> ExtendedContext.remainder(22, 6)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5108 Decimal('4')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5109 >>> ExtendedContext.remainder(Decimal(22), 6)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5110 Decimal('4')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5111 >>> ExtendedContext.remainder(22, Decimal(6))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5112 Decimal('4')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5113 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5114 a = _convert_other(a, raiseit=True)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5115 r = a.__mod__(b, context=self)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5116 if r is NotImplemented:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5117 raise TypeError("Unable to convert %s to Decimal" % b)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5118 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5119 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5120
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5121 def remainder_near(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5122 """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
5123 value of "x / b" (if two integers are equally near then the even one
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5124 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
5125 sign of a.
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 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
5128 (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
5129 remainder cannot be calculated).
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.remainder_near(Decimal('2.1'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5132 Decimal('-0.9')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5133 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5134 Decimal('-2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5135 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5136 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5137 >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5138 Decimal('-1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5139 >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5140 Decimal('0.2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5141 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5142 Decimal('0.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5143 >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5144 Decimal('-0.3')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5145 >>> ExtendedContext.remainder_near(3, 11)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5146 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5147 >>> ExtendedContext.remainder_near(Decimal(3), 11)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5148 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5149 >>> ExtendedContext.remainder_near(3, Decimal(11))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5150 Decimal('3')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5151 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5152 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5153 return a.remainder_near(b, context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5154
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5155 def rotate(self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5156 """Returns a rotated copy of a, b times.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5157
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5158 The coefficient of the result is a rotated copy of the digits in
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5159 the coefficient of the first operand. The number of places of
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5160 rotation is taken from the absolute value of the second operand,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5161 with the rotation being to the left if the second operand is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5162 positive or to the right otherwise.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5163
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5164 >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5165 Decimal('400000003')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5166 >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5167 Decimal('12')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5168 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5169 Decimal('891234567')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5170 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5171 Decimal('123456789')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5172 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5173 Decimal('345678912')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5174 >>> ExtendedContext.rotate(1333333, 1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5175 Decimal('13333330')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5176 >>> ExtendedContext.rotate(Decimal(1333333), 1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5177 Decimal('13333330')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5178 >>> ExtendedContext.rotate(1333333, Decimal(1))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5179 Decimal('13333330')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5180 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5181 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5182 return a.rotate(b, context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5183
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5184 def same_quantum(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5185 """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
5186
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5187 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
5188 either operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5189
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5190 >>> 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
5191 False
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5192 >>> 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
5193 True
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5194 >>> 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
5195 False
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5196 >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5197 True
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5198 >>> ExtendedContext.same_quantum(10000, -1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5199 True
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5200 >>> ExtendedContext.same_quantum(Decimal(10000), -1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5201 True
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5202 >>> ExtendedContext.same_quantum(10000, Decimal(-1))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5203 True
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5204 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5205 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5206 return a.same_quantum(b)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5207
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5208 def scaleb (self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5209 """Returns the first operand after adding the second value its exp.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5210
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5211 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5212 Decimal('0.0750')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5213 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5214 Decimal('7.50')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5215 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5216 Decimal('7.50E+3')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5217 >>> ExtendedContext.scaleb(1, 4)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5218 Decimal('1E+4')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5219 >>> ExtendedContext.scaleb(Decimal(1), 4)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5220 Decimal('1E+4')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5221 >>> ExtendedContext.scaleb(1, Decimal(4))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5222 Decimal('1E+4')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5223 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5224 a = _convert_other(a, raiseit=True)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5225 return a.scaleb(b, context=self)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5226
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5227 def shift(self, a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5228 """Returns a shifted copy of a, b times.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5229
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5230 The coefficient of the result is a shifted copy of the digits
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5231 in the coefficient of the first operand. The number of places
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5232 to shift is taken from the absolute value of the second operand,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5233 with the shift being to the left if the second operand is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5234 positive or to the right otherwise. Digits shifted into the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5235 coefficient are zeros.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5236
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5237 >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5238 Decimal('400000000')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5239 >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5240 Decimal('0')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5241 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5242 Decimal('1234567')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5243 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5244 Decimal('123456789')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5245 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5246 Decimal('345678900')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5247 >>> ExtendedContext.shift(88888888, 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5248 Decimal('888888800')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5249 >>> ExtendedContext.shift(Decimal(88888888), 2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5250 Decimal('888888800')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5251 >>> ExtendedContext.shift(88888888, Decimal(2))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5252 Decimal('888888800')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5253 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5254 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5255 return a.shift(b, context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5256
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5257 def sqrt(self, a):
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5258 """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
5259
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5260 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
5261 algorithm.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5262
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5263 >>> ExtendedContext.sqrt(Decimal('0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5264 Decimal('0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5265 >>> ExtendedContext.sqrt(Decimal('-0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5266 Decimal('-0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5267 >>> ExtendedContext.sqrt(Decimal('0.39'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5268 Decimal('0.624499800')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5269 >>> ExtendedContext.sqrt(Decimal('100'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5270 Decimal('10')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5271 >>> ExtendedContext.sqrt(Decimal('1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5272 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5273 >>> ExtendedContext.sqrt(Decimal('1.0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5274 Decimal('1.0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5275 >>> ExtendedContext.sqrt(Decimal('1.00'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5276 Decimal('1.0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5277 >>> ExtendedContext.sqrt(Decimal('7'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5278 Decimal('2.64575131')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5279 >>> ExtendedContext.sqrt(Decimal('10'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5280 Decimal('3.16227766')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5281 >>> ExtendedContext.sqrt(2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5282 Decimal('1.41421356')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5283 >>> ExtendedContext.prec
32481
b835d5c61d86 * Make the tests independent of the default precision.
Raymond Hettinger <python@rcn.com>
parents: 32477
diff changeset
5284 9
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5285 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5286 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5287 return a.sqrt(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5288
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5289 def subtract(self, a, b):
35379
43211be0de41 bug [ 1266296 ] Mistakes in decimal.Context.subtract documentation
Georg Brandl <georg@python.org>
parents: 35113
diff changeset
5290 """Return the difference between the two operands.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5291
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5292 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5293 Decimal('0.23')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5294 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5295 Decimal('0.00')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5296 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5297 Decimal('-0.77')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5298 >>> ExtendedContext.subtract(8, 5)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5299 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5300 >>> ExtendedContext.subtract(Decimal(8), 5)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5301 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5302 >>> ExtendedContext.subtract(8, Decimal(5))
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5303 Decimal('3')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5304 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5305 a = _convert_other(a, raiseit=True)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5306 r = a.__sub__(b, context=self)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5307 if r is NotImplemented:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5308 raise TypeError("Unable to convert %s to Decimal" % b)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5309 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5310 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5311
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5312 def to_eng_string(self, a):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5313 """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
5314
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5315 The operation is not affected by the context.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5316 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5317 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5318 return a.to_eng_string(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5319
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5320 def to_sci_string(self, a):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5321 """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
5322
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5323 The operation is not affected by the context.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5324 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5325 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5326 return a.__str__(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5327
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5328 def to_integral_exact(self, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5329 """Rounds to an integer.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5330
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5331 When the operand has a negative exponent, the result is the same
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5332 as using the quantize() operation using the given operand as the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5333 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5334 of the operand as the precision setting; Inexact and Rounded flags
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5335 are allowed in this operation. The rounding mode is taken from the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5336 context.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5337
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5338 >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5339 Decimal('2')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5340 >>> ExtendedContext.to_integral_exact(Decimal('100'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5341 Decimal('100')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5342 >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5343 Decimal('100')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5344 >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5345 Decimal('102')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5346 >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5347 Decimal('-102')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5348 >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5349 Decimal('1.0E+6')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5350 >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5351 Decimal('7.89E+77')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5352 >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5353 Decimal('-Infinity')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5354 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5355 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5356 return a.to_integral_exact(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5357
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5358 def to_integral_value(self, a):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5359 """Rounds to an integer.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5360
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5361 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
5362 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
5363 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
5364 of the operand as the precision setting, except that no flags will
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5365 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
5366
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5367 >>> ExtendedContext.to_integral_value(Decimal('2.1'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5368 Decimal('2')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5369 >>> ExtendedContext.to_integral_value(Decimal('100'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5370 Decimal('100')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5371 >>> ExtendedContext.to_integral_value(Decimal('100.0'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5372 Decimal('100')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5373 >>> ExtendedContext.to_integral_value(Decimal('101.5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5374 Decimal('102')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5375 >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5376 Decimal('-102')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5377 >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5378 Decimal('1.0E+6')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5379 >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5380 Decimal('7.89E+77')
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5381 >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
45321
33122ff83405 Fix decimal repr which should have used single quotes like other reprs.
Raymond Hettinger <python@rcn.com>
parents: 45293
diff changeset
5382 Decimal('-Infinity')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5383 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5384 a = _convert_other(a, raiseit=True)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5385 return a.to_integral_value(context=self)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5386
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5387 # the method name changed, but we provide also the old one, for compatibility
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5388 to_integral = to_integral_value
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5389
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5390 class _WorkRep(object):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5391 __slots__ = ('sign','int','exp')
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5392 # sign: 0 or 1
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5393 # int: int or long
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5394 # exp: None, int, or string
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5395
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5396 def __init__(self, value=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5397 if value is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5398 self.sign = None
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5399 self.int = 0
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5400 self.exp = None
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5401 elif isinstance(value, Decimal):
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5402 self.sign = value._sign
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5403 self.int = int(value._int)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5404 self.exp = value._exp
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5405 else:
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5406 # assert isinstance(value, tuple)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5407 self.sign = value[0]
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5408 self.int = value[1]
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5409 self.exp = value[2]
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5410
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5411 def __repr__(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5412 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
5413
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5414 __str__ = __repr__
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5415
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5416
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5417
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
5418 def _normalize(op1, op2, prec = 0):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5419 """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
5420
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5421 Done during addition.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5422 """
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5423 if op1.exp < op2.exp:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5424 tmp = op2
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5425 other = op1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5426 else:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5427 tmp = op1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5428 other = op2
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5429
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5430 # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5431 # Then adding 10**exp to tmp has the same effect (after rounding)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5432 # as adding any positive quantity smaller than 10**exp; similarly
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5433 # for subtraction. So if other is smaller than 10**exp we replace
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5434 # it with 10**exp. This avoids tmp.exp - other.exp getting too large.
44328
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
5435 tmp_len = len(str(tmp.int))
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
5436 other_len = len(str(other.int))
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
5437 exp = tmp.exp + min(-1, tmp_len - prec - 2)
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
5438 if other_len + other.exp - 1 < exp:
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
5439 other.int = 1
09f74316d5fb Removed the private _rounding_decision: it was not needed, and the code
Facundo Batista <facundobatista@gmail.com>
parents: 44148
diff changeset
5440 other.exp = exp
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5441
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5442 tmp.int *= 10 ** (tmp.exp - other.exp)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5443 tmp.exp = other.exp
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5444 return op1, op2
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5445
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5446 ##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5447
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5448 # This function from Tim Peters was taken from here:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5449 # http://mail.python.org/pipermail/python-list/1999-July/007758.html
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5450 # The correction being in the function definition is for speed, and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5451 # the whole function is not resolved with math.log because of avoiding
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5452 # the use of floats.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5453 def _nbits(n, correction = {
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5454 '0': 4, '1': 3, '2': 2, '3': 2,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5455 '4': 1, '5': 1, '6': 1, '7': 1,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5456 '8': 0, '9': 0, 'a': 0, 'b': 0,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5457 'c': 0, 'd': 0, 'e': 0, 'f': 0}):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5458 """Number of bits in binary representation of the positive integer n,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5459 or 0 if n == 0.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5460 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5461 if n < 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5462 raise ValueError("The argument to _nbits should be nonnegative.")
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5463 hex_n = "%x" % n
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5464 return 4*len(hex_n) - correction[hex_n[0]]
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5465
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5466 def _sqrt_nearest(n, a):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5467 """Closest integer to the square root of the positive integer n. a is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5468 an initial approximation to the square root. Any positive integer
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5469 will do for a, but the closer a is to the square root of n the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5470 faster convergence will be.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5471
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5472 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5473 if n <= 0 or a <= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5474 raise ValueError("Both arguments to _sqrt_nearest should be positive.")
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5475
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5476 b=0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5477 while a != b:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5478 b, a = a, a--n//a>>1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5479 return a
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5480
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5481 def _rshift_nearest(x, shift):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5482 """Given an integer x and a nonnegative integer shift, return closest
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5483 integer to x / 2**shift; use round-to-even in case of a tie.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5484
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5485 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5486 b, q = 1L << shift, x >> shift
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5487 return q + (2*(x & (b-1)) + (q&1) > b)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5488
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5489 def _div_nearest(a, b):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5490 """Closest integer to a/b, a and b positive integers; rounds to even
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5491 in the case of a tie.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5492
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5493 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5494 q, r = divmod(a, b)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5495 return q + (2*r + (q&1) > b)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5496
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5497 def _ilog(x, M, L = 8):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5498 """Integer approximation to M*log(x/M), with absolute error boundable
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5499 in terms only of x/M.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5500
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5501 Given positive integers x and M, return an integer approximation to
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5502 M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5503 between the approximation and the exact result is at most 22. For
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5504 L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5505 both cases these are upper bounds on the error; it will usually be
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5506 much smaller."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5507
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5508 # The basic algorithm is the following: let log1p be the function
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5509 # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5510 # the reduction
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5511 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5512 # log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5513 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5514 # repeatedly until the argument to log1p is small (< 2**-L in
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5515 # absolute value). For small y we can use the Taylor series
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5516 # expansion
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5517 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5518 # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5519 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5520 # truncating at T such that y**T is small enough. The whole
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5521 # computation is carried out in a form of fixed-point arithmetic,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5522 # with a real number z being represented by an integer
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5523 # approximation to z*M. To avoid loss of precision, the y below
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5524 # is actually an integer approximation to 2**R*y*M, where R is the
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5525 # number of reductions performed so far.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5526
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5527 y = x-M
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5528 # argument reduction; R = number of reductions performed
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5529 R = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5530 while (R <= L and long(abs(y)) << L-R >= M or
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5531 R > L and abs(y) >> R-L >= M):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5532 y = _div_nearest(long(M*y) << 1,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5533 M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5534 R += 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5535
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5536 # Taylor series with T terms
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5537 T = -int(-10*len(str(M))//(3*L))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5538 yshift = _rshift_nearest(y, R)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5539 w = _div_nearest(M, T)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5540 for k in xrange(T-1, 0, -1):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5541 w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5542
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5543 return _div_nearest(w*y, M)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5544
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5545 def _dlog10(c, e, p):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5546 """Given integers c, e and p with c > 0, p >= 0, compute an integer
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5547 approximation to 10**p * log10(c*10**e), with an absolute error of
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5548 at most 1. Assumes that c*10**e is not exactly 1."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5549
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5550 # increase precision by 2; compensate for this by dividing
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5551 # final result by 100
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5552 p += 2
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5553
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5554 # write c*10**e as d*10**f with either:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5555 # f >= 0 and 1 <= d <= 10, or
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5556 # f <= 0 and 0.1 <= d <= 1.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5557 # Thus for c*10**e close to 1, f = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5558 l = len(str(c))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5559 f = e+l - (e+l >= 1)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5560
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5561 if p > 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5562 M = 10**p
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5563 k = e+p-f
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5564 if k >= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5565 c *= 10**k
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5566 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5567 c = _div_nearest(c, 10**-k)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5568
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5569 log_d = _ilog(c, M) # error < 5 + 22 = 27
43455
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5570 log_10 = _log10_digits(p) # error < 1
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5571 log_d = _div_nearest(log_d*M, log_10)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5572 log_tenpower = f*M # exact
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5573 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5574 log_d = 0 # error < 2.31
48847
Neal Norwitz <nnorwitz@gmail.com>
parents: 47961
diff changeset
5575 log_tenpower = _div_nearest(f, 10**-p) # error < 0.5
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5576
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5577 return _div_nearest(log_tenpower+log_d, 100)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5578
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5579 def _dlog(c, e, p):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5580 """Given integers c, e and p with c > 0, compute an integer
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5581 approximation to 10**p * log(c*10**e), with an absolute error of
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5582 at most 1. Assumes that c*10**e is not exactly 1."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5583
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5584 # Increase precision by 2. The precision increase is compensated
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5585 # for at the end with a division by 100.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5586 p += 2
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5587
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5588 # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5589 # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5590 # as 10**p * log(d) + 10**p*f * log(10).
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5591 l = len(str(c))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5592 f = e+l - (e+l >= 1)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5593
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5594 # compute approximation to 10**p*log(d), with error < 27
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5595 if p > 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5596 k = e+p-f
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5597 if k >= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5598 c *= 10**k
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5599 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5600 c = _div_nearest(c, 10**-k) # error of <= 0.5 in c
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5601
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5602 # _ilog magnifies existing error in c by a factor of at most 10
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5603 log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5604 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5605 # p <= 0: just approximate the whole thing by 0; error < 2.31
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5606 log_d = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5607
43455
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5608 # compute approximation to f*10**p*log(10), with error < 11.
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5609 if f:
43455
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5610 extra = len(str(abs(f)))-1
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5611 if p + extra >= 0:
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5612 # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5613 # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5614 f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5615 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5616 f_log_ten = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5617 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5618 f_log_ten = 0
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5619
43455
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5620 # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5621 return _div_nearest(f_log_ten + log_d, 100)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5622
43455
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5623 class _Log10Memoize(object):
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5624 """Class to compute, store, and allow retrieval of, digits of the
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5625 constant log(10) = 2.302585.... This constant is needed by
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5626 Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5627 def __init__(self):
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5628 self.digits = "23025850929940456840179914546843642076011014886"
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5629
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5630 def getdigits(self, p):
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5631 """Given an integer p >= 0, return floor(10**p)*log(10).
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5632
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5633 For example, self.getdigits(3) returns 2302.
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5634 """
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5635 # digits are stored as a string, for quick conversion to
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5636 # integer in the case that we've already computed enough
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5637 # digits; the stored digits should always be correct
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5638 # (truncated, not rounded to nearest).
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5639 if p < 0:
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5640 raise ValueError("p should be nonnegative")
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5641
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5642 if p >= len(self.digits):
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5643 # compute p+3, p+6, p+9, ... digits; continue until at
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5644 # least one of the extra digits is nonzero
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5645 extra = 3
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5646 while True:
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5647 # compute p+extra digits, correct to within 1ulp
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5648 M = 10**(p+extra+2)
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5649 digits = str(_div_nearest(_ilog(10*M, M), 100))
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5650 if digits[-extra:] != '0'*extra:
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5651 break
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5652 extra += 3
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5653 # keep all reliable digits so far; remove trailing zeros
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5654 # and next nonzero digit
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5655 self.digits = digits.rstrip('0')[:-1]
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5656 return int(self.digits[:p+1])
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5657
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5658 _log10_digits = _Log10Memoize().getdigits
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5659
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5660 def _iexp(x, M, L=8):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5661 """Given integers x and M, M > 0, such that x/M is small in absolute
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5662 value, compute an integer approximation to M*exp(x/M). For 0 <=
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5663 x/M <= 2.4, the absolute error in the result is bounded by 60 (and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5664 is usually much smaller)."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5665
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5666 # Algorithm: to compute exp(z) for a real number z, first divide z
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5667 # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5668 # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5669 # series
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5670 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5671 # expm1(x) = x + x**2/2! + x**3/3! + ...
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5672 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5673 # Now use the identity
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5674 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5675 # expm1(2x) = expm1(x)*(expm1(x)+2)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5676 #
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5677 # R times to compute the sequence expm1(z/2**R),
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5678 # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5679
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5680 # Find R such that x/2**R/M <= 2**-L
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5681 R = _nbits((long(x)<<L)//M)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5682
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5683 # Taylor series. (2**L)**T > M
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5684 T = -int(-10*len(str(M))//(3*L))
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5685 y = _div_nearest(x, T)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5686 Mshift = long(M)<<R
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5687 for i in xrange(T-1, 0, -1):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5688 y = _div_nearest(x*(Mshift + y), Mshift * i)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5689
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5690 # Expansion
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5691 for k in xrange(R-1, -1, -1):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5692 Mshift = long(M)<<(k+2)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5693 y = _div_nearest(y*(y+Mshift), Mshift)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5694
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5695 return M+y
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5696
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5697 def _dexp(c, e, p):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5698 """Compute an approximation to exp(c*10**e), with p decimal places of
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5699 precision.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5700
43455
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5701 Returns integers d, f such that:
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5702
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5703 10**(p-1) <= d <= 10**p, and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5704 (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5705
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5706 In other words, d*10**f is an approximation to exp(c*10**e) with p
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5707 digits of precision, and with an error in d of at most 1. This is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5708 almost, but not quite, the same as the error being < 1ulp: when d
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5709 = 10**(p-1) the error could be up to 10 ulp."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5710
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5711 # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5712 p += 2
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5713
43455
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5714 # compute log(10) with extra precision = adjusted exponent of c*10**e
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5715 extra = max(0, e + len(str(c)) - 1)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5716 q = p + extra
43455
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5717
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5718 # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5719 # rounding down
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5720 shift = e+q
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5721 if shift >= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5722 cshift = c*10**shift
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5723 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5724 cshift = c//10**-shift
43455
7943262e5fc4 Added a class to store the digits of log(10), so that they can be made
Facundo Batista <facundobatista@gmail.com>
parents: 43454
diff changeset
5725 quot, rem = divmod(cshift, _log10_digits(q))
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5726
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5727 # reduce remainder back to original precision
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5728 rem = _div_nearest(rem, 10**extra)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5729
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5730 # error in result of _iexp < 120; error after division < 0.62
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5731 return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5732
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5733 def _dpower(xc, xe, yc, ye, p):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5734 """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5735 y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5736
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5737 10**(p-1) <= c <= 10**p, and
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5738 (c-1)*10**e < x**y < (c+1)*10**e
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5739
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5740 in other words, c*10**e is an approximation to x**y with p digits
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5741 of precision, and with an error in c of at most 1. (This is
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5742 almost, but not quite, the same as the error being < 1ulp: when c
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5743 == 10**(p-1) we can only guarantee error < 10ulp.)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5744
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5745 We assume that: x is positive and not equal to 1, and y is nonzero.
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5746 """
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5747
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5748 # Find b such that 10**(b-1) <= |y| <= 10**b
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5749 b = len(str(abs(yc))) + ye
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5750
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5751 # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5752 lxc = _dlog(xc, xe, p+b+1)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5753
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5754 # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5755 shift = ye-b
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5756 if shift >= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5757 pc = lxc*yc*10**shift
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5758 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5759 pc = _div_nearest(lxc*yc, 10**-shift)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5760
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5761 if pc == 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5762 # we prefer a result that isn't exactly 1; this makes it
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5763 # easier to compute a correctly rounded result in __pow__
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5764 if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5765 coeff, exp = 10**(p-1)+1, 1-p
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5766 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5767 coeff, exp = 10**p-1, -p
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5768 else:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5769 coeff, exp = _dexp(pc, -(p+1), p+1)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5770 coeff = _div_nearest(coeff, 10)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5771 exp += 1
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5772
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5773 return coeff, exp
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5774
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5775 def _log10_lb(c, correction = {
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5776 '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5777 '6': 23, '7': 16, '8': 10, '9': 5}):
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5778 """Compute a lower bound for 100*log10(c) for a positive integer c."""
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5779 if c <= 0:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5780 raise ValueError("The argument to _log10_lb should be nonnegative.")
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5781 str_c = str(c)
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5782 return 100*len(str_c) - correction[str_c[0]]
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5783
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5784 ##### Helper Functions ####################################################
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5785
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
5786 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
5787 """Convert other to Decimal.
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5788
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5789 Verifies that it's ok to use in an implicit construction.
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
5790 If allow_float is true, allow conversion from float; this
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
5791 is used in the comparison methods (__eq__ and friends).
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
5792
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5793 """
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5794 if isinstance(other, Decimal):
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5795 return other
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5796 if isinstance(other, (int, long)):
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5797 return Decimal(other)
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
5798 if allow_float and isinstance(other, float):
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
5799 return Decimal.from_float(other)
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
5800
43360
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5801 if raiseit:
63f3154c731d Merged the decimal-branch (revisions 54886 to 58140). Decimal is now
Facundo Batista <facundobatista@gmail.com>
parents: 42605
diff changeset
5802 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
5803 return NotImplemented
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5804
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
5805 ##### Setup Specific Contexts ############################################
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5806
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5807 # 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
5808 # 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
5809
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5810 DefaultContext = Context(
32481
b835d5c61d86 * Make the tests independent of the default precision.
Raymond Hettinger <python@rcn.com>
parents: 32477
diff changeset
5811 prec=28, rounding=ROUND_HALF_EVEN,
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5812 traps=[DivisionByZero, Overflow, InvalidOperation],
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5813 flags=[],
32674
3479610fb288 Factor out two unnecessary global variables.
Raymond Hettinger <python@rcn.com>
parents: 32667
diff changeset
5814 Emax=999999999,
3479610fb288 Factor out two unnecessary global variables.
Raymond Hettinger <python@rcn.com>
parents: 32667
diff changeset
5815 Emin=-999999999,
32496
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
5816 capitals=1
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5817 )
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5818
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5819 # Pre-made alternate contexts offered by the specification
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5820 # 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
5821 # 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
5822 # of the spec.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5823
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5824 BasicContext = Context(
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5825 prec=9, rounding=ROUND_HALF_UP,
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5826 traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5827 flags=[],
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5828 )
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5829
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5830 ExtendedContext = Context(
32481
b835d5c61d86 * Make the tests independent of the default precision.
Raymond Hettinger <python@rcn.com>
parents: 32477
diff changeset
5831 prec=9, rounding=ROUND_HALF_EVEN,
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5832 traps=[],
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5833 flags=[],
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5834 )
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5835
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5836
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5837 ##### crud for parsing strings #############################################
45505
bf8ee593cbad Remove duplicate 'import re' in decimal.py
Mark Dickinson <dickinsm@gmail.com>
parents: 45321
diff changeset
5838 #
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5839 # Regular expression used for parsing numeric strings. Additional
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5840 # comments:
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5841 #
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5842 # 1. Uncomment the two '\s*' lines to allow leading and/or trailing
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5843 # whitespace. But note that the specification disallows whitespace in
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5844 # a numeric string.
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5845 #
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5846 # 2. For finite numbers (not infinities and NaNs) the body of the
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5847 # number between the optional sign and the optional exponent must have
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5848 # at least one decimal digit, possibly after the decimal point. The
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5849 # lookahead expression '(?=\d|\.\d)' checks this.
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5850
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5851 import re
47872
65af544da121 Replace occurrences of '\d' with '[0-9]' in Decimal regex, to make sure
Mark Dickinson <dickinsm@gmail.com>
parents: 46653
diff changeset
5852 _parser = re.compile(r""" # A numeric string consists of:
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5853 # \s*
47872
65af544da121 Replace occurrences of '\d' with '[0-9]' in Decimal regex, to make sure
Mark Dickinson <dickinsm@gmail.com>
parents: 46653
diff changeset
5854 (?P<sign>[-+])? # an optional sign, followed by either...
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5855 (
55518
7c23f0bcca85 Issue #6595: Allow Decimal constructor to accept non-European decimal
Mark Dickinson <dickinsm@gmail.com>
parents: 53551
diff changeset
5856 (?=\d|\.\d) # ...a number (with at least one digit)
7c23f0bcca85 Issue #6595: Allow Decimal constructor to accept non-European decimal
Mark Dickinson <dickinsm@gmail.com>
parents: 53551
diff changeset
5857 (?P<int>\d*) # having a (possibly empty) integer part
7c23f0bcca85 Issue #6595: Allow Decimal constructor to accept non-European decimal
Mark Dickinson <dickinsm@gmail.com>
parents: 53551
diff changeset
5858 (\.(?P<frac>\d*))? # followed by an optional fractional part
7c23f0bcca85 Issue #6595: Allow Decimal constructor to accept non-European decimal
Mark Dickinson <dickinsm@gmail.com>
parents: 53551
diff changeset
5859 (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5860 |
47872
65af544da121 Replace occurrences of '\d' with '[0-9]' in Decimal regex, to make sure
Mark Dickinson <dickinsm@gmail.com>
parents: 46653
diff changeset
5861 Inf(inity)? # ...an infinity, or...
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5862 |
47872
65af544da121 Replace occurrences of '\d' with '[0-9]' in Decimal regex, to make sure
Mark Dickinson <dickinsm@gmail.com>
parents: 46653
diff changeset
5863 (?P<signal>s)? # ...an (optionally signaling)
65af544da121 Replace occurrences of '\d' with '[0-9]' in Decimal regex, to make sure
Mark Dickinson <dickinsm@gmail.com>
parents: 46653
diff changeset
5864 NaN # NaN
55518
7c23f0bcca85 Issue #6595: Allow Decimal constructor to accept non-European decimal
Mark Dickinson <dickinsm@gmail.com>
parents: 53551
diff changeset
5865 (?P<diag>\d*) # with (possibly empty) diagnostic info.
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5866 )
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5867 # \s*
44650
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
5868 \Z
55518
7c23f0bcca85 Issue #6595: Allow Decimal constructor to accept non-European decimal
Mark Dickinson <dickinsm@gmail.com>
parents: 53551
diff changeset
5869 """, re.VERBOSE | re.IGNORECASE | re.UNICODE).match
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5870
44121
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
5871 _all_zeros = re.compile('0*$').match
30f54977828b Faster _fix function, and some reordering for a more elegant
Facundo Batista <facundobatista@gmail.com>
parents: 44120
diff changeset
5872 _exact_half = re.compile('50*$').match
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5873
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5874 ##### PEP3101 support functions ##############################################
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5875 # The functions in this section have little to do with the Decimal
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5876 # class, and could potentially be reused or adapted for other pure
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5877 # Python numeric classes that want to implement __format__
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5878 #
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5879 # A format specifier for Decimal looks like:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5880 #
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5881 # [[fill]align][sign][0][minimumwidth][,][.precision][type]
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5882
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5883 _parse_format_specifier_regex = re.compile(r"""\A
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5884 (?:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5885 (?P<fill>.)?
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5886 (?P<align>[<>=^])
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5887 )?
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5888 (?P<sign>[-+ ])?
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5889 (?P<zeropad>0)?
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5890 (?P<minimumwidth>(?!0)\d+)?
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5891 (?P<thousands_sep>,)?
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5892 (?:\.(?P<precision>0|(?!0)\d+))?
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5893 (?P<type>[eEfFgGn%])?
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5894 \Z
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5895 """, re.VERBOSE)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5896
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5897 del re
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
5898
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5899 # The locale module is only needed for the 'n' format specifier. The
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5900 # rest of the PEP 3101 code functions quite happily without it, so we
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5901 # don't care too much if locale isn't present.
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5902 try:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5903 import locale as _locale
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5904 except ImportError:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5905 pass
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5906
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5907 def _parse_format_specifier(format_spec, _localeconv=None):
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5908 """Parse and validate a format specifier.
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5909
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5910 Turns a standard numeric format specifier into a dict, with the
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5911 following entries:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5912
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5913 fill: fill character to pad field to minimum width
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5914 align: alignment type, either '<', '>', '=' or '^'
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5915 sign: either '+', '-' or ' '
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5916 minimumwidth: nonnegative integer giving minimum width
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5917 zeropad: boolean, indicating whether to pad with zeros
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5918 thousands_sep: string to use as thousands separator, or ''
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5919 grouping: grouping for thousands separators, in format
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5920 used by localeconv
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5921 decimal_point: string to use for decimal point
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5922 precision: nonnegative integer giving precision, or None
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5923 type: one of the characters 'eEfFgG%', or None
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5924 unicode: boolean (always True for Python 3.x)
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5925
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5926 """
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5927 m = _parse_format_specifier_regex.match(format_spec)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5928 if m is None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5929 raise ValueError("Invalid format specifier: " + format_spec)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5930
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5931 # get the dictionary
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5932 format_dict = m.groupdict()
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5933
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5934 # zeropad; defaults for fill and alignment. If zero padding
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5935 # is requested, the fill and align fields should be absent.
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5936 fill = format_dict['fill']
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5937 align = format_dict['align']
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5938 format_dict['zeropad'] = (format_dict['zeropad'] is not None)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5939 if format_dict['zeropad']:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5940 if fill is not None:
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5941 raise ValueError("Fill character conflicts with '0'"
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5942 " in format specifier: " + format_spec)
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5943 if align is not None:
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5944 raise ValueError("Alignment conflicts with '0' in "
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5945 "format specifier: " + format_spec)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5946 format_dict['fill'] = fill or ' '
55890
40fd8fd96d96 Issue #6857: Fix Decimal formatting to be consistent with existing float
Mark Dickinson <dickinsm@gmail.com>
parents: 55877
diff changeset
5947 # PEP 3101 originally specified that the default alignment should
40fd8fd96d96 Issue #6857: Fix Decimal formatting to be consistent with existing float
Mark Dickinson <dickinsm@gmail.com>
parents: 55877
diff changeset
5948 # be left; it was later agreed that right-aligned makes more sense
40fd8fd96d96 Issue #6857: Fix Decimal formatting to be consistent with existing float
Mark Dickinson <dickinsm@gmail.com>
parents: 55877
diff changeset
5949 # for numeric types. See http://bugs.python.org/issue6857.
40fd8fd96d96 Issue #6857: Fix Decimal formatting to be consistent with existing float
Mark Dickinson <dickinsm@gmail.com>
parents: 55877
diff changeset
5950 format_dict['align'] = align or '>'
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5951
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5952 # default sign handling: '-' for negative, '' for positive
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5953 if format_dict['sign'] is None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5954 format_dict['sign'] = '-'
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5955
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5956 # minimumwidth defaults to 0; precision remains None if not given
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5957 format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5958 if format_dict['precision'] is not None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5959 format_dict['precision'] = int(format_dict['precision'])
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5960
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5961 # if format type is 'g' or 'G' then a precision of 0 makes little
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5962 # sense; convert it to 1. Same if format type is unspecified.
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5963 if format_dict['precision'] == 0:
55873
0f7333aca455 Issue #6850: Fix bug in Decimal._parse_format_specifier for formats
Mark Dickinson <dickinsm@gmail.com>
parents: 55740
diff changeset
5964 if format_dict['type'] is None or format_dict['type'] in 'gG':
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5965 format_dict['precision'] = 1
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5966
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5967 # determine thousands separator, grouping, and decimal separator, and
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5968 # add appropriate entries to format_dict
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5969 if format_dict['type'] == 'n':
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5970 # apart from separators, 'n' behaves just like 'g'
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5971 format_dict['type'] = 'g'
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5972 if _localeconv is None:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5973 _localeconv = _locale.localeconv()
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5974 if format_dict['thousands_sep'] is not None:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5975 raise ValueError("Explicit thousands separator conflicts with "
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5976 "'n' type in format specifier: " + format_spec)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5977 format_dict['thousands_sep'] = _localeconv['thousands_sep']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5978 format_dict['grouping'] = _localeconv['grouping']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5979 format_dict['decimal_point'] = _localeconv['decimal_point']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5980 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5981 if format_dict['thousands_sep'] is None:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5982 format_dict['thousands_sep'] = ''
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5983 format_dict['grouping'] = [3, 0]
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5984 format_dict['decimal_point'] = '.'
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5985
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5986 # record whether return type should be str or unicode
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5987 format_dict['unicode'] = isinstance(format_spec, unicode)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5988
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5989 return format_dict
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5990
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5991 def _format_align(sign, body, spec):
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5992 """Given an unpadded, non-aligned numeric string 'body' and sign
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5993 string 'sign', add padding and aligment conforming to the given
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5994 format specifier dictionary 'spec' (as produced by
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5995 parse_format_specifier).
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5996
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5997 Also converts result to unicode if necessary.
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5998
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5999 """
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6000 # how much extra space do we have to play with?
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6001 minimumwidth = spec['minimumwidth']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6002 fill = spec['fill']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6003 padding = fill*(minimumwidth - len(sign) - len(body))
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6004
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6005 align = spec['align']
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6006 if align == '<':
52188
6b738b6f7fc6 Fix bug in Decimal __format__ method that swapped left and right
Mark Dickinson <dickinsm@gmail.com>
parents: 52114
diff changeset
6007 result = sign + body + padding
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6008 elif align == '>':
52188
6b738b6f7fc6 Fix bug in Decimal __format__ method that swapped left and right
Mark Dickinson <dickinsm@gmail.com>
parents: 52114
diff changeset
6009 result = padding + sign + body
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6010 elif align == '=':
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6011 result = sign + padding + body
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6012 elif align == '^':
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6013 half = len(padding)//2
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6014 result = padding[:half] + sign + body + padding[half:]
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6015 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6016 raise ValueError('Unrecognised alignment field')
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6017
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6018 # make sure that result is unicode if necessary
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6019 if spec['unicode']:
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6020 result = unicode(result)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6021
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6022 return result
43993
a4a140486691 Major change in the internal structure of the Decimal
Facundo Batista <facundobatista@gmail.com>
parents: 43602
diff changeset
6023
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6024 def _group_lengths(grouping):
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6025 """Convert a localeconv-style grouping into a (possibly infinite)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6026 iterable of integers representing group lengths.
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6027
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6028 """
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6029 # The result from localeconv()['grouping'], and the input to this
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6030 # function, should be a list of integers in one of the
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6031 # following three forms:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6032 #
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6033 # (1) an empty list, or
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6034 # (2) nonempty list of positive integers + [0]
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6035 # (3) list of positive integers + [locale.CHAR_MAX], or
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6036
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6037 from itertools import chain, repeat
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6038 if not grouping:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6039 return []
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6040 elif grouping[-1] == 0 and len(grouping) >= 2:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6041 return chain(grouping[:-1], repeat(grouping[-2]))
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6042 elif grouping[-1] == _locale.CHAR_MAX:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6043 return grouping[:-1]
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6044 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6045 raise ValueError('unrecognised format for grouping')
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6046
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6047 def _insert_thousands_sep(digits, spec, min_width=1):
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6048 """Insert thousands separators into a digit string.
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6049
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6050 spec is a dictionary whose keys should include 'thousands_sep' and
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6051 'grouping'; typically it's the result of parsing the format
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6052 specifier using _parse_format_specifier.
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6053
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6054 The min_width keyword argument gives the minimum length of the
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6055 result, which will be padded on the left with zeros if necessary.
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6056
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6057 If necessary, the zero padding adds an extra '0' on the left to
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6058 avoid a leading thousands separator. For example, inserting
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6059 commas every three digits in '123456', with min_width=8, gives
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6060 '0,123,456', even though that has length 9.
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6061
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6062 """
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6063
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6064 sep = spec['thousands_sep']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6065 grouping = spec['grouping']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6066
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6067 groups = []
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6068 for l in _group_lengths(grouping):
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6069 if l <= 0:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6070 raise ValueError("group length should be positive")
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6071 # max(..., 1) forces at least 1 digit to the left of a separator
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6072 l = min(max(len(digits), min_width, 1), l)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6073 groups.append('0'*(l - len(digits)) + digits[-l:])
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6074 digits = digits[:-l]
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6075 min_width -= l
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6076 if not digits and min_width <= 0:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6077 break
52200
2d94c8fed376 Fix bug in _insert_thousands_sep: too much zero padding could be
Mark Dickinson <dickinsm@gmail.com>
parents: 52195
diff changeset
6078 min_width -= len(sep)
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6079 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6080 l = max(len(digits), min_width, 1)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6081 groups.append('0'*(l - len(digits)) + digits[-l:])
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6082 return sep.join(reversed(groups))
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6083
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6084 def _format_sign(is_negative, spec):
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6085 """Determine sign character."""
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6086
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6087 if is_negative:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6088 return '-'
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6089 elif spec['sign'] in ' +':
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6090 return spec['sign']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6091 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6092 return ''
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6093
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6094 def _format_number(is_negative, intpart, fracpart, exp, spec):
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6095 """Format a number, given the following data:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6096
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6097 is_negative: true if the number is negative, else false
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6098 intpart: string of digits that must appear before the decimal point
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6099 fracpart: string of digits that must come after the point
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6100 exp: exponent, as an integer
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6101 spec: dictionary resulting from parsing the format specifier
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6102
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6103 This function uses the information in spec to:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6104 insert separators (decimal separator and thousands separators)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6105 format the sign
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6106 format the exponent
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6107 add trailing '%' for the '%' type
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6108 zero-pad if necessary
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6109 fill and align if necessary
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6110 """
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6111
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6112 sign = _format_sign(is_negative, spec)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6113
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6114 if fracpart:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6115 fracpart = spec['decimal_point'] + fracpart
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6116
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6117 if exp != 0 or spec['type'] in 'eE':
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6118 echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6119 fracpart += "{0}{1:+}".format(echar, exp)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6120 if spec['type'] == '%':
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6121 fracpart += '%'
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6122
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6123 if spec['zeropad']:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6124 min_width = spec['minimumwidth'] - len(fracpart) - len(sign)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6125 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6126 min_width = 0
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6127 intpart = _insert_thousands_sep(intpart, spec, min_width)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6128
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6129 return _format_align(sign, intpart+fracpart, spec)
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6130
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6131
41418
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
6132 ##### Useful Constants (internal use only) ################################
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
6133
ae4ced28a839 General clean-up. Lot of margin corrections, comments, some typos.
Facundo Batista <facundobatista@gmail.com>
parents: 40770
diff changeset
6134 # Reusable defaults
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
6135 _Infinity = Decimal('Inf')
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
6136 _NegativeInfinity = Decimal('-Inf')
50471
94ff3de1e1a4 Merged revisions 68182 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50116
diff changeset
6137 _NaN = Decimal('NaN')
50497
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
6138 _Zero = Decimal(0)
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
6139 _One = Decimal(1)
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
6140 _NegativeOne = Decimal(-1)
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
6141
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
6142 # _SignedInfinity[sign] is infinity w/ that sign
e78dcd87d733 Reapply r68191.
Raymond Hettinger <python@rcn.com>
parents: 50496
diff changeset
6143 _SignedInfinity = (_Infinity, _NegativeInfinity)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6144
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6145
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6146
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6147 if __name__ == '__main__':
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6148 import doctest, sys
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6149 doctest.testmod(sys.modules[__name__])