annotate Lib/decimal.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents 5dd5f824428c
children 44ed0cd3dc6d
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
72067
b1af3aeba523 Update link to the decimal arithmetic specification.
Raymond Hettinger <python@rcn.com>
parents: 70637
diff changeset
24 http://speleotrove.com/decimal/decarith.html
32451
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
32 The purpose of this module is to support arithmetic using familiar
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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',
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
39729
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
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
51294
aea90f5f398b Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51028
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
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
148
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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'
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
157 ROUND_05UP = 'ROUND_05UP'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
158
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
61744
68525ef36b66 Merged revisions 81350 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61212
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
189 representation. This may occur when the exponent of a zero result would
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
190 be outside the bounds of a representation, or when a large normal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
203 0 * (+-)INF
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
213
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
214 The result of the operation after these is a quiet positive NaN,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
215 except when the cause is a signaling NaN, in which case the result is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
216 also a quiet NaN, but with the original sign, and an optional
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
221 ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
248 def handle(self, context, sign, *args):
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
292 was specified. These aspects of the context need only be checked when
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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],
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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.
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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,
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
346 ROUND_HALF_DOWN, ROUND_UP):
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
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:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
350 return _SignedInfinity[sign]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
351 return _dec_from_triple(sign, '9'*context.prec,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
355 return _SignedInfinity[sign]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
356 return _dec_from_triple(sign, '9'*context.prec,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
409 # To fix reloading, force it to create a new context
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
39729
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
464 def localcontext(ctx=None):
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
465 """Return a context manager for a copy of the supplied context
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
466
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
467 Uses a copy of the current context if no context is specified
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
468 The returned context manager creates a local decimal context
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
469 in a with statement:
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
470 def sin(x):
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
471 with localcontext() as ctx:
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
472 ctx.prec += 2
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
473 # Rest of sin calculation algorithm
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
474 # uses a precision 2 greater than normal
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
475 return +s # Convert result to normal precision
39729
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
476
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
477 def sin(x):
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
478 with localcontext(ExtendedContext):
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
479 # Rest of sin calculation algorithm
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
480 # uses the Extended Context from the
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
481 # General Decimal Arithmetic Specification
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
482 return +s # Convert result to normal context
39729
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
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)
39729
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
485 >>> print getcontext().prec
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
486 28
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
487 >>> with localcontext():
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
488 ... ctx = getcontext()
40769
a04c781546ed Fix docstring bug
Raymond Hettinger <python@rcn.com>
parents: 39732
diff changeset
489 ... ctx.prec += 2
39729
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
490 ... print ctx.prec
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
491 ...
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
492 30
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
493 >>> with localcontext(ExtendedContext):
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
494 ... print getcontext().prec
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
495 ...
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
496 9
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
497 >>> print getcontext().prec
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
498 28
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
499 """
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
500 if ctx is None: ctx = getcontext()
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
501 return _ContextManager(ctx)
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
530 # Note that the coefficient, self._int, is actually stored as
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
531 # a string rather than as a tuple of digits. This speeds up
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
532 # the "digits to integer" and "integer to digits" conversions
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
533 # that are used in almost every arithmetic operation on
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
534 # Decimals. This is an internal detail: the as_tuple function
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
535 # and the Decimal constructor still deal with tuples of
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
536 # digits.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
539
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
540 # From a string
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
541 # REs insist on real strings, so we can too.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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())
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
544 if m is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
545 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
546 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
547 return context._raise_error(ConversionSyntax,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
548 "Invalid literal for Decimal: %r" % value)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
549
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
550 if m.group('sign') == "-":
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
551 self._sign = 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
552 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
553 self._sign = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
554 intpart = m.group('int')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
555 if intpart is not None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
556 # finite number
55519
8b48b282eba9 Merged revisions 74281 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52189
diff changeset
557 fracpart = m.group('frac') or ''
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
558 exp = int(m.group('exp') or '0')
55519
8b48b282eba9 Merged revisions 74281 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52189
diff changeset
559 self._int = str(int(intpart+fracpart))
8b48b282eba9 Merged revisions 74281 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52189
diff changeset
560 self._exp = exp - len(fracpart)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
561 self._is_special = False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
562 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
563 diag = m.group('diag')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
564 if diag is not None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
565 # NaN
55519
8b48b282eba9 Merged revisions 74281 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52189
diff changeset
566 self._int = str(int(diag or '0')).lstrip('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
567 if m.group('signal'):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
568 self._exp = 'N'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
569 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
570 self._exp = 'n'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
571 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
572 # infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
573 self._int = '0'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
574 self._exp = 'F'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
585 self._int = str(abs(value))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
586 self._is_special = False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
587 return self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
588
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
589 # From another decimal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
590 if isinstance(value, Decimal):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
591 self._exp = value._exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
592 self._sign = value._sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
593 self._int = value._int
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
594 self._is_special = value._is_special
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
595 return self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
596
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
597 # From an internal working value
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
598 if isinstance(value, _WorkRep):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
599 self._sign = value.sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
600 self._int = str(value.int)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
601 self._exp = int(value.exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
608 raise ValueError('Invalid tuple size in creation of Decimal '
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
609 'from list or tuple. The list or tuple '
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
610 'should have exactly three elements.')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
611 # process sign. The isinstance test rejects floats
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
612 if not (isinstance(value[0], (int, long)) and value[0] in (0,1)):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
613 raise ValueError("Invalid sign. The first value in the tuple "
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
614 "should be an integer; either 0 for a "
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
617 if value[2] == 'F':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
618 # infinity: value[1] is ignored
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
623 # process and validate the digits in value[1]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
624 digits = []
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
625 for digit in value[1]:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
626 if isinstance(digit, (int, long)) and 0 <= digit <= 9:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
627 # skip leading zeros
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
628 if digits or digit != 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
629 digits.append(digit)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
630 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
631 raise ValueError("The second value in the tuple must "
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
632 "be composed of integers in the range "
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
633 "0 through 9.")
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
634 if value[2] in ('n', 'N'):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
635 # NaN: digits form the diagnostic
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
636 self._int = ''.join(map(str, digits))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
637 self._exp = value[2]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
638 self._is_special = True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
639 elif isinstance(value[2], (int, long)):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
640 # finite number: digits give the coefficient
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
641 self._int = ''.join(map(str, digits or [0]))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
642 self._exp = value[2]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
643 self._is_special = False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
644 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
645 raise ValueError("The third value in the tuple must "
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
646 "be an integer, or one of the "
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
704 1 if NaN
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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',
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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',
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
755 return self._fix_nan(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
756
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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):
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
794 """Return True if self is nonzero; otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
795
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
798 return self._is_special or self._int != '0'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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:
51028
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
807 self_inf = self._isinfinity()
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
808 other_inf = other._isinfinity()
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
809 if self_inf == other_inf:
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
810 return 0
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
811 elif self_inf < other_inf:
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
812 return -1
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
813 else:
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
814 return 1
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
815
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
816 # check for zeros; Decimal('0') == Decimal('-0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
817 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
818 if not other:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
819 return 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
820 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
821 return -((-1)**other._sign)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
822 if not other:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
823 return (-1)**self._sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
824
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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()
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
833 if self_adjusted == other_adjusted:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
834 self_padded = self._int + '0'*(self._exp - other._exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
835 other_padded = other._int + '0'*(other._exp - self._exp)
51028
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
836 if self_padded == other_padded:
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
837 return 0
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
838 elif self_padded < other_padded:
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
839 return -(-1)**self._sign
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
840 else:
99c10d647f32 Merged revisions 68920 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50601
diff changeset
841 return (-1)**self._sign
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
925 other = _convert_other(other, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
926
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
938 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
939 # The hash of a nonspecial noninteger Decimal must depend only
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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.
34758
50509ee96364 Bug #1163325: "special" decimals aren't hashable
Raymond Hettinger <python@rcn.com>
parents: 34638
diff changeset
948 if self._is_special:
60156
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
970 if self._isinteger():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
971 op = _WorkRep(self.to_integral_value())
43409
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))
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
979 # The value of a nonzero nonspecial Decimal instance is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
980 # faithfully represented by the triple consisting of its sign,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
981 # its adjusted exponent, and its coefficient with trailing
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
982 # zeros removed.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
983 return hash((self._sign,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
984 self._exp+len(self._int),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1007 if self._exp == 'F':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1008 return sign + 'Infinity'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1009 elif self._exp == 'n':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1010 return sign + 'NaN' + self._int
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1011 else: # self._exp == 'N'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1012 return sign + 'sNaN' + self._int
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1013
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1014 # number of digits of self._int to left of decimal point
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1015 leftdigits = self._exp + len(self._int)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1016
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1017 # dotplace is number of digits of self._int to the left of the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1018 # decimal point in the mantissa of the output string (that is,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1019 # after adjusting the exponent)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1020 if self._exp <= 0 and leftdigits > -6:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1021 # no exponent required
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1022 dotplace = leftdigits
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1023 elif not eng:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1024 # usual scientific notation: 1 digit on left of the point
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1025 dotplace = 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1026 elif self._int == '0':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1027 # engineering notation, zero
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1030 # engineering notation, nonzero
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1031 dotplace = (leftdigits - 1) % 3 + 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1032
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1033 if dotplace <= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1034 intpart = '0'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1035 fracpart = '.' + '0'*(-dotplace) + self._int
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1036 elif dotplace >= len(self._int):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1037 intpart = self._int+'0'*(dotplace-len(self._int))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1038 fracpart = ''
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1039 else:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1040 intpart = self._int[:dotplace]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1041 fracpart = '.' + self._int[dotplace:]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1042 if leftdigits == dotplace:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1043 exp = ''
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1044 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1045 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1046 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1047 exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1048
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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
68394
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1071 if context is None:
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1072 context = getcontext()
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1073
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1074 if not self and context.rounding != ROUND_FLOOR:
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1075 # -Decimal('0') is Decimal('0'), not Decimal('-0'), except
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1076 # in ROUND_FLOOR rounding mode.
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1077 ans = self.copy_abs()
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1078 else:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1079 ans = self.copy_negate()
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1080
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1081 return ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1082
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1083 def __pos__(self, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1084 """Returns a copy, unless it is a sNaN.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1085
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1086 Rounds the number (if more then precision digits)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1087 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1088 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1089 ans = self._check_nans(context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1090 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1091 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1092
68394
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1093 if context is None:
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1094 context = getcontext()
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1095
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1096 if not self and context.rounding != ROUND_FLOOR:
d5fe8b33f711 Issue 11131: Fix sign of zero result on plus and minus operations in ROUND_FLOOR rounding mode.
Mark Dickinson <mdickinson@enthought.com>
parents: 68256
diff changeset
1097 # + (-0) = 0, except in ROUND_FLOOR rounding mode.
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1098 ans = self.copy_abs()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1099 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1100 ans = Decimal(self)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1101
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1102 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1103
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1104 def __abs__(self, round=True, context=None):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1105 """Returns the absolute value of self.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1106
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1107 If the keyword argument 'round' is false, do not round. The
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1108 expression self.__abs__(round=False) is equivalent to
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1109 self.copy_abs().
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1110 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1111 if not round:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1112 return self.copy_abs()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1113
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1114 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1115 ans = self._check_nans(context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1116 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1117 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1118
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1119 if self._sign:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1120 ans = self.__neg__(context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1121 else:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1122 ans = self.__pos__(context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1123
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1124 return ans
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 def __add__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1127 """Returns self + other.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1128
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1129 -INF + INF (or the reverse) cause InvalidOperation errors.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1130 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1131 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
1132 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1133 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1134
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1135 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1136 context = getcontext()
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1137
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1138 if self._is_special or other._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1139 ans = self._check_nans(other, context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1140 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1141 return ans
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1142
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1143 if self._isinfinity():
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1144 # 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
1145 if self._sign != other._sign and other._isinfinity():
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1146 return context._raise_error(InvalidOperation, '-INF + INF')
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1147 return Decimal(self)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1148 if other._isinfinity():
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1149 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
1150
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1151 exp = min(self._exp, other._exp)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1152 negativezero = 0
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1153 if context.rounding == ROUND_FLOOR and self._sign != other._sign:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1154 # 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
1155 negativezero = 1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1156
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1157 if not self and not other:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1158 sign = min(self._sign, other._sign)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1159 if negativezero:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1160 sign = 1
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1161 ans = _dec_from_triple(sign, '0', exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1162 ans = ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1163 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1164 if not self:
33845
032f342efcd2 Very few little improvements.
Facundo Batista <facundobatista@gmail.com>
parents: 33803
diff changeset
1165 exp = max(exp, other._exp - context.prec-1)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1166 ans = other._rescale(exp, context.rounding)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1167 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1168 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1169 if not other:
33845
032f342efcd2 Very few little improvements.
Facundo Batista <facundobatista@gmail.com>
parents: 33803
diff changeset
1170 exp = max(exp, self._exp - context.prec-1)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1171 ans = self._rescale(exp, context.rounding)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1172 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1173 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1174
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1175 op1 = _WorkRep(self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1176 op2 = _WorkRep(other)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1177 op1, op2 = _normalize(op1, op2, context.prec)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1178
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1179 result = _WorkRep()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1180 if op1.sign != op2.sign:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1181 # Equal and opposite
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1182 if op1.int == op2.int:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1183 ans = _dec_from_triple(negativezero, '0', exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1184 ans = ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1185 return ans
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1186 if op1.int < op2.int:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1187 op1, op2 = op2, op1
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1188 # OK, now abs(op1) > abs(op2)
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1189 if op1.sign == 1:
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1190 result.sign = 1
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1191 op1.sign, op2.sign = op2.sign, op1.sign
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1192 else:
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1193 result.sign = 0
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1194 # So we know the sign, and op1 > 0.
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1195 elif op1.sign == 1:
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1196 result.sign = 1
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1197 op1.sign, op2.sign = (0, 0)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1198 else:
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1199 result.sign = 0
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1200 # Now, op1 > abs(op2) > 0
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1201
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
1202 if op2.sign == 0:
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1203 result.int = op1.int + op2.int
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1204 else:
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1205 result.int = op1.int - op2.int
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1206
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1207 result.exp = op1.exp
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1208 ans = Decimal(result)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1209 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1210 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1211
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1212 __radd__ = __add__
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1213
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1214 def __sub__(self, other, context=None):
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1215 """Return self - other"""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1216 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
1217 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1218 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1219
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1220 if self._is_special or other._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1221 ans = self._check_nans(other, context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1222 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1223 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1224
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1225 # self - other is computed as self + other.copy_negate()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1226 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
1227
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1228 def __rsub__(self, other, context=None):
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1229 """Return other - self"""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1230 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
1231 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1232 return other
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1233
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1234 return other.__sub__(self, context=context)
32451
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 def __mul__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1237 """Return self * other.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1238
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1239 (+-) INF * 0 (or its reverse) raise InvalidOperation.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1240 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1241 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
1242 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1243 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1244
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1245 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1246 context = getcontext()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1247
32561
6f351b1bcf53 * Update the test suite to reflect that ConversionSyntax was no longer
Raymond Hettinger <python@rcn.com>
parents: 32560
diff changeset
1248 resultsign = self._sign ^ other._sign
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1249
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1250 if self._is_special or other._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1251 ans = self._check_nans(other, context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1252 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1253 return ans
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1254
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1255 if self._isinfinity():
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1256 if not other:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1257 return context._raise_error(InvalidOperation, '(+-)INF * 0')
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
1258 return _SignedInfinity[resultsign]
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1259
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1260 if other._isinfinity():
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1261 if not self:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1262 return context._raise_error(InvalidOperation, '0 * (+-)INF')
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
1263 return _SignedInfinity[resultsign]
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1264
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1265 resultexp = self._exp + other._exp
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1266
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1267 # Special case for multiplying by zero
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1268 if not self or not other:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1269 ans = _dec_from_triple(resultsign, '0', resultexp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1270 # Fixing in case the exponent is out of bounds
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1271 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1272 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1273
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1274 # Special case for multiplying by power of 10
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1275 if self._int == '1':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1276 ans = _dec_from_triple(resultsign, other._int, resultexp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1277 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1278 return ans
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1279 if other._int == '1':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1280 ans = _dec_from_triple(resultsign, self._int, resultexp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1281 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1282 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1283
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1284 op1 = _WorkRep(self)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1285 op2 = _WorkRep(other)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1286
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1287 ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1288 ans = ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1289
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1290 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1291 __rmul__ = __mul__
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1292
46651
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1293 def __truediv__(self, other, context=None):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1294 """Return self / other."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1295 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
1296 if other is NotImplemented:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1297 return NotImplemented
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1298
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1299 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1300 context = getcontext()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1301
32561
6f351b1bcf53 * Update the test suite to reflect that ConversionSyntax was no longer
Raymond Hettinger <python@rcn.com>
parents: 32560
diff changeset
1302 sign = self._sign ^ other._sign
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1303
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1304 if self._is_special or other._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1305 ans = self._check_nans(other, context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1306 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1307 return ans
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1308
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1309 if self._isinfinity() and other._isinfinity():
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1310 return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1311
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1312 if self._isinfinity():
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
1313 return _SignedInfinity[sign]
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1314
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1315 if other._isinfinity():
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1316 context._raise_error(Clamped, 'Division by infinity')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1317 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
1318
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1319 # Special cases for zeroes
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1320 if not other:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1321 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1322 return context._raise_error(DivisionUndefined, '0 / 0')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1323 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
1324
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1325 if not self:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1326 exp = self._exp - other._exp
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1327 coeff = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1328 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1329 # OK, so neither = 0, INF or NaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1330 shift = len(other._int) - len(self._int) + context.prec + 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1331 exp = self._exp - other._exp - shift
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1332 op1 = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1333 op2 = _WorkRep(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1334 if shift >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1335 coeff, remainder = divmod(op1.int * 10**shift, op2.int)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1336 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1337 coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1338 if remainder:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1339 # result is not exact; adjust to ensure correct rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1340 if coeff % 5 == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1341 coeff += 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1342 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1343 # result is exact; get as close to ideal exponent as possible
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1344 ideal_exp = self._exp - other._exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1345 while exp < ideal_exp and coeff % 10 == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1346 coeff //= 10
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1347 exp += 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1348
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1349 ans = _dec_from_triple(sign, str(coeff), exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1350 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1351
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1352 def _divide(self, other, context):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1353 """Return (self // other, self % other), to context.prec precision.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1354
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1355 Assumes that neither self nor other is a NaN, that self is not
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1356 infinite and that other is nonzero.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1357 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1358 sign = self._sign ^ other._sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1359 if other._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1360 ideal_exp = self._exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1361 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1362 ideal_exp = min(self._exp, other._exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1363
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1364 expdiff = self.adjusted() - other.adjusted()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1365 if not self or other._isinfinity() or expdiff <= -2:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1366 return (_dec_from_triple(sign, '0', 0),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1367 self._rescale(ideal_exp, context.rounding))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1368 if expdiff <= context.prec:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1369 op1 = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1370 op2 = _WorkRep(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1371 if op1.exp >= op2.exp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1372 op1.int *= 10**(op1.exp - op2.exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1373 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1374 op2.int *= 10**(op2.exp - op1.exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1375 q, r = divmod(op1.int, op2.int)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1376 if q < 10**context.prec:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1377 return (_dec_from_triple(sign, str(q), 0),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1378 _dec_from_triple(self._sign, str(r), ideal_exp))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1379
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1380 # Here the quotient is too large to be representable
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1381 ans = context._raise_error(DivisionImpossible,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1382 'quotient too large in //, % or divmod')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1383 return ans, ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1384
46651
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1385 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
1386 """Swaps self/other and returns __truediv__."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1387 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
1388 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1389 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
1390 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
1391
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1392 __div__ = __truediv__
c97e36abcdd5 Some very minor changes to decimal.py in Python 2.6, aimed
Mark Dickinson <dickinsm@gmail.com>
parents: 46643
diff changeset
1393 __rdiv__ = __rtruediv__
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1394
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1395 def __divmod__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1396 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1397 Return (self // other, self % other)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1398 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1399 other = _convert_other(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1400 if other is NotImplemented:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1401 return other
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1402
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1403 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1404 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1405
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1406 ans = self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1407 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1408 return (ans, ans)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1409
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1410 sign = self._sign ^ other._sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1411 if self._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1412 if other._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1413 ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1414 return ans, ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1415 else:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
1416 return (_SignedInfinity[sign],
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1417 context._raise_error(InvalidOperation, 'INF % x'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1418
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1419 if not other:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1420 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1421 ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1422 return ans, ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1423 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1424 return (context._raise_error(DivisionByZero, 'x // 0', sign),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1425 context._raise_error(InvalidOperation, 'x % 0'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1426
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1427 quotient, remainder = self._divide(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1428 remainder = remainder._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1429 return quotient, remainder
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1430
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1431 def __rdivmod__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1432 """Swaps self/other and returns __divmod__."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1433 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
1434 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1435 return other
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1436 return other.__divmod__(self, context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1437
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1438 def __mod__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1439 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1440 self % other
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1441 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1442 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
1443 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1444 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1445
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1446 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1447 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1448
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1449 ans = self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1450 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1451 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1452
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1453 if self._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1454 return context._raise_error(InvalidOperation, 'INF % x')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1455 elif not other:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1456 if self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1457 return context._raise_error(InvalidOperation, 'x % 0')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1458 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1459 return context._raise_error(DivisionUndefined, '0 % 0')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1460
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1461 remainder = self._divide(other, context)[1]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1462 remainder = remainder._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1463 return remainder
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1464
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1465 def __rmod__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1466 """Swaps self/other and returns __mod__."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1467 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
1468 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1469 return other
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1470 return other.__mod__(self, context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1471
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1472 def remainder_near(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1473 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1474 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
1475 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1476 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1477 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1478
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1479 other = _convert_other(other, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1480
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1481 ans = self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1482 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1483 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1484
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1485 # self == +/-infinity -> InvalidOperation
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1486 if self._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1487 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1488 'remainder_near(infinity, x)')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1489
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1490 # other == 0 -> either InvalidOperation or DivisionUndefined
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1491 if not other:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1492 if self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1493 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1494 'remainder_near(x, 0)')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1495 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1496 return context._raise_error(DivisionUndefined,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1497 'remainder_near(0, 0)')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1498
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1499 # other = +/-infinity -> remainder = self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1500 if other._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1501 ans = Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1502 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1503
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1504 # self = 0 -> remainder = self, with ideal exponent
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1505 ideal_exponent = min(self._exp, other._exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1506 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1507 ans = _dec_from_triple(self._sign, '0', ideal_exponent)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1508 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1509
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1510 # catch most cases of large or small quotient
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1511 expdiff = self.adjusted() - other.adjusted()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1512 if expdiff >= context.prec + 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1513 # expdiff >= prec+1 => abs(self/other) > 10**prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1514 return context._raise_error(DivisionImpossible)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1515 if expdiff <= -2:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1516 # expdiff <= -2 => abs(self/other) < 0.1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1517 ans = self._rescale(ideal_exponent, context.rounding)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1518 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1519
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1520 # adjust both arguments to have the same exponent, then divide
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1521 op1 = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1522 op2 = _WorkRep(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1523 if op1.exp >= op2.exp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1524 op1.int *= 10**(op1.exp - op2.exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1525 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1526 op2.int *= 10**(op2.exp - op1.exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1527 q, r = divmod(op1.int, op2.int)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1528 # remainder is r*10**ideal_exponent; other is +/-op2.int *
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1529 # 10**ideal_exponent. Apply correction to ensure that
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1530 # abs(remainder) <= abs(other)/2
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1531 if 2*r + (q&1) > op2.int:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1532 r -= op2.int
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1533 q += 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1534
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1535 if q >= 10**context.prec:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1536 return context._raise_error(DivisionImpossible)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1537
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1538 # result has same sign as self unless r is negative
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1539 sign = self._sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1540 if r < 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1541 sign = 1-sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1542 r = -r
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1543
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1544 ans = _dec_from_triple(sign, str(r), ideal_exponent)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1545 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1546
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1547 def __floordiv__(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1548 """self // other"""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1549 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
1550 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1551 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1552
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1553 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1554 context = getcontext()
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1555
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1556 ans = self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1557 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1558 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1559
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1560 if self._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1561 if other._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1562 return context._raise_error(InvalidOperation, 'INF // INF')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1563 else:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
1564 return _SignedInfinity[self._sign ^ other._sign]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1565
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1566 if not other:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1567 if self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1568 return context._raise_error(DivisionByZero, 'x // 0',
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1569 self._sign ^ other._sign)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1570 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1571 return context._raise_error(DivisionUndefined, '0 // 0')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1572
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1573 return self._divide(other, context)[0]
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1574
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1575 def __rfloordiv__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1576 """Swaps self/other and returns __floordiv__."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1577 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
1578 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
1579 return other
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1580 return other.__floordiv__(self, context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1581
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1582 def __float__(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1583 """Float representation."""
78754
5dd5f824428c Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents: 72067
diff changeset
1584 if self._isnan():
5dd5f824428c Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents: 72067
diff changeset
1585 if self.is_snan():
5dd5f824428c Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents: 72067
diff changeset
1586 raise ValueError("Cannot convert signaling NaN to float")
5dd5f824428c Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents: 72067
diff changeset
1587 s = "-nan" if self._sign else "nan"
5dd5f824428c Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents: 72067
diff changeset
1588 else:
5dd5f824428c Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents: 72067
diff changeset
1589 s = str(self)
5dd5f824428c Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
Mark Dickinson <mdickinson@enthought.com>
parents: 72067
diff changeset
1590 return float(s)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1591
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1592 def __int__(self):
34638
4a0c202ee789 Fix small grammatical error in a docstring.
Brett Cannon <bcannon@gmail.com>
parents: 34545
diff changeset
1593 """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
1594 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1595 if self._isnan():
55886
fc9a00799795 Merged revisions 74708 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55874
diff changeset
1596 raise ValueError("Cannot convert NaN to integer")
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1597 elif self._isinfinity():
55886
fc9a00799795 Merged revisions 74708 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55874
diff changeset
1598 raise OverflowError("Cannot convert infinity to integer")
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1599 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
1600 if self._exp >= 0:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1601 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
1602 else:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1603 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
1604
44923
e8efa62eec15 Add support for trunc().
Raymond Hettinger <python@rcn.com>
parents: 44701
diff changeset
1605 __trunc__ = __int__
e8efa62eec15 Add support for trunc().
Raymond Hettinger <python@rcn.com>
parents: 44701
diff changeset
1606
45293
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1607 def real(self):
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1608 return self
50601
2be490abf333 Merged revisions 68317-68318 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50480
diff changeset
1609 real = property(real)
2be490abf333 Merged revisions 68317-68318 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50480
diff changeset
1610
45293
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1611 def imag(self):
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1612 return Decimal(0)
50601
2be490abf333 Merged revisions 68317-68318 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50480
diff changeset
1613 imag = property(imag)
45293
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1614
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1615 def conjugate(self):
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1616 return self
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1617
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1618 def __complex__(self):
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1619 return complex(float(self))
4ca70663a79d Bring decimal a bit closer to the spec for Reals.
Raymond Hettinger <python@rcn.com>
parents: 45269
diff changeset
1620
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1621 def __long__(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1622 """Converts to a long.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1623
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1624 Equivalent to long(int(self))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1625 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1626 return long(self.__int__())
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1627
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1628 def _fix_nan(self, context):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1629 """Decapitate the payload of a NaN to fit the context"""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1630 payload = self._int
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1631
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1632 # maximum length of payload is precision if _clamp=0,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1633 # precision-1 if _clamp=1.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1634 max_payload_len = context.prec - context._clamp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1635 if len(payload) > max_payload_len:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1636 payload = payload[len(payload)-max_payload_len:].lstrip('0')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1637 return _dec_from_triple(self._sign, payload, self._exp, True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1638 return Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1639
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
1640 def _fix(self, context):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1641 """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
1642
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1643 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
1644
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1645 Arguments:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1646 self - Decimal instance
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1647 context - context used.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1648 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1649
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1650 if self._is_special:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1651 if self._isnan():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1652 # decapitate payload if necessary
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1653 return self._fix_nan(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1654 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1655 # self is +/-Infinity; return unaltered
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1656 return Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1657
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1658 # if self is zero then exponent should be between Etiny and
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1659 # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1660 Etiny = context.Etiny()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1661 Etop = context.Etop()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1662 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1663 exp_max = [context.Emax, Etop][context._clamp]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1664 new_exp = min(max(self._exp, Etiny), exp_max)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1665 if new_exp != self._exp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1666 context._raise_error(Clamped)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1667 return _dec_from_triple(self._sign, '0', new_exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1668 else:
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1669 return Decimal(self)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
1670
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1671 # exp_min is the smallest allowable exponent of the result,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1672 # equal to max(self.adjusted()-context.prec+1, Etiny)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1673 exp_min = len(self._int) + self._exp - context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1674 if exp_min > Etop:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1675 # overflow: exp_min > Etop iff self.adjusted() > Emax
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1676 ans = context._raise_error(Overflow, 'above Emax', self._sign)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1677 context._raise_error(Inexact)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1678 context._raise_error(Rounded)
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1679 return ans
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1680
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1681 self_is_subnormal = exp_min < Etiny
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1682 if self_is_subnormal:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1683 exp_min = Etiny
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1684
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1685 # round if self has too many digits
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1686 if self._exp < exp_min:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1687 digits = len(self._int) + self._exp - exp_min
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1688 if digits < 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1689 self = _dec_from_triple(self._sign, '1', exp_min-1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1690 digits = 0
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1691 rounding_method = self._pick_rounding_function[context.rounding]
69271
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
1692 changed = rounding_method(self, digits)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1693 coeff = self._int[:digits] or '0'
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1694 if changed > 0:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1695 coeff = str(int(coeff)+1)
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1696 if len(coeff) > context.prec:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1697 coeff = coeff[:-1]
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1698 exp_min += 1
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1699
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1700 # check whether the rounding pushed the exponent out of range
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1701 if exp_min > Etop:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1702 ans = context._raise_error(Overflow, 'above Emax', self._sign)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1703 else:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1704 ans = _dec_from_triple(self._sign, coeff, exp_min)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1705
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1706 # raise the appropriate signals, taking care to respect
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1707 # the precedence described in the specification
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1708 if changed and self_is_subnormal:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1709 context._raise_error(Underflow)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1710 if self_is_subnormal:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1711 context._raise_error(Subnormal)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1712 if changed:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1713 context._raise_error(Inexact)
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1714 context._raise_error(Rounded)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1715 if not ans:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1716 # raise Clamped on underflow to 0
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1717 context._raise_error(Clamped)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1718 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1719
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1720 if self_is_subnormal:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1721 context._raise_error(Subnormal)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
1722
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1723 # fold down if _clamp == 1 and self has too few digits
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1724 if context._clamp == 1 and self._exp > Etop:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1725 context._raise_error(Clamped)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1726 self_padded = self._int + '0'*(self._exp - Etop)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1727 return _dec_from_triple(self._sign, self_padded, Etop)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1728
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1729 # here self was representable to begin with; return unchanged
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1730 return Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1731
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1732 # for each of the rounding functions below:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1733 # self is a finite, nonzero Decimal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1734 # prec is an integer satisfying 0 <= prec < len(self._int)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1735 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1736 # each function returns either -1, 0, or 1, as follows:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1737 # 1 indicates that self should be rounded up (away from zero)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1738 # 0 indicates that self should be truncated, and that all the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1739 # digits to be truncated are zeros (so the value is unchanged)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1740 # -1 indicates that there are nonzero digits to be truncated
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1741
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1742 def _round_down(self, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1743 """Also known as round-towards-0, truncate."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1744 if _all_zeros(self._int, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1745 return 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1746 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1747 return -1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1748
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1749 def _round_up(self, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1750 """Rounds away from 0."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1751 return -self._round_down(prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1752
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1753 def _round_half_up(self, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1754 """Rounds 5 up (away from 0)"""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1755 if self._int[prec] in '56789':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1756 return 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1757 elif _all_zeros(self._int, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1758 return 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1759 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1760 return -1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1761
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1762 def _round_half_down(self, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1763 """Round 5 down"""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1764 if _exact_half(self._int, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1765 return -1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1766 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1767 return self._round_half_up(prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1768
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1769 def _round_half_even(self, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1770 """Round 5 to even, rest to nearest."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1771 if _exact_half(self._int, prec) and \
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1772 (prec == 0 or self._int[prec-1] in '02468'):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1773 return -1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1774 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1775 return self._round_half_up(prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1776
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1777 def _round_ceiling(self, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1778 """Rounds up (not away from 0 if negative.)"""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1779 if self._sign:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1780 return self._round_down(prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1781 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1782 return -self._round_down(prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1783
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1784 def _round_floor(self, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1785 """Rounds down (not towards 0 if negative)"""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1786 if not self._sign:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1787 return self._round_down(prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1788 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1789 return -self._round_down(prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1790
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1791 def _round_05up(self, prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1792 """Round down unless digit prec-1 is 0 or 5."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1793 if prec and self._int[prec-1] not in '05':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1794 return self._round_down(prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1795 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1796 return -self._round_down(prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1797
69263
b4b1f557d563 Issue #11830: Remove unnecessary introspection code in the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 68503
diff changeset
1798 _pick_rounding_function = dict(
69271
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
1799 ROUND_DOWN = _round_down,
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
1800 ROUND_UP = _round_up,
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
1801 ROUND_HALF_UP = _round_half_up,
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
1802 ROUND_HALF_DOWN = _round_half_down,
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
1803 ROUND_HALF_EVEN = _round_half_even,
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
1804 ROUND_CEILING = _round_ceiling,
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
1805 ROUND_FLOOR = _round_floor,
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
1806 ROUND_05UP = _round_05up,
69263
b4b1f557d563 Issue #11830: Remove unnecessary introspection code in the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 68503
diff changeset
1807 )
b4b1f557d563 Issue #11830: Remove unnecessary introspection code in the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 68503
diff changeset
1808
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1809 def fma(self, other, third, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1810 """Fused multiply-add.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1811
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1812 Returns self*other+third with no rounding of the intermediate
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1813 product self*other.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1814
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1815 self and other are multiplied together, with no rounding of
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1816 the result. The third operand is then added to the result,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1817 and a single final rounding is performed.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1818 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1819
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1820 other = _convert_other(other, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1821
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1822 # compute product; raise InvalidOperation if either operand is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1823 # a signaling NaN or if the product is zero times infinity.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1824 if self._is_special or other._is_special:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1825 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1826 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1827 if self._exp == 'N':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1828 return context._raise_error(InvalidOperation, 'sNaN', self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1829 if other._exp == 'N':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1830 return context._raise_error(InvalidOperation, 'sNaN', other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1831 if self._exp == 'n':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1832 product = self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1833 elif other._exp == 'n':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1834 product = other
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1835 elif self._exp == 'F':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1836 if not other:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1837 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1838 'INF * 0 in fma')
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
1839 product = _SignedInfinity[self._sign ^ other._sign]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1840 elif other._exp == 'F':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1841 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1842 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1843 '0 * INF in fma')
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
1844 product = _SignedInfinity[self._sign ^ other._sign]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1845 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1846 product = _dec_from_triple(self._sign ^ other._sign,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1847 str(int(self._int) * int(other._int)),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1848 self._exp + other._exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1849
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1850 third = _convert_other(third, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1851 return product.__add__(third, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1852
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1853 def _power_modulo(self, other, modulo, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1854 """Three argument version of __pow__"""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1855
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1856 # if can't convert other and modulo to Decimal, raise
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1857 # TypeError; there's no point returning NotImplemented (no
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1858 # equivalent of __rpow__ for three argument pow)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1859 other = _convert_other(other, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1860 modulo = _convert_other(modulo, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1861
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1862 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1863 context = getcontext()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1864
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1865 # deal with NaNs: if there are any sNaNs then first one wins,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1866 # (i.e. behaviour for NaNs is identical to that of fma)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1867 self_is_nan = self._isnan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1868 other_is_nan = other._isnan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1869 modulo_is_nan = modulo._isnan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1870 if self_is_nan or other_is_nan or modulo_is_nan:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1871 if self_is_nan == 2:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1872 return context._raise_error(InvalidOperation, 'sNaN',
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1873 self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1874 if other_is_nan == 2:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1875 return context._raise_error(InvalidOperation, 'sNaN',
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1876 other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1877 if modulo_is_nan == 2:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1878 return context._raise_error(InvalidOperation, 'sNaN',
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1879 modulo)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1880 if self_is_nan:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1881 return self._fix_nan(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1882 if other_is_nan:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1883 return other._fix_nan(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1884 return modulo._fix_nan(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1885
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1886 # check inputs: we apply same restrictions as Python's pow()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1887 if not (self._isinteger() and
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1888 other._isinteger() and
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1889 modulo._isinteger()):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1890 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1891 'pow() 3rd argument not allowed '
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1892 'unless all arguments are integers')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1893 if other < 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1894 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1895 'pow() 2nd argument cannot be '
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1896 'negative when 3rd argument specified')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1897 if not modulo:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1898 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1899 'pow() 3rd argument cannot be 0')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1900
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1901 # additional restriction for decimal: the modulus must be less
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1902 # than 10**prec in absolute value
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1903 if modulo.adjusted() >= context.prec:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1904 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1905 'insufficient precision: pow() 3rd '
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1906 'argument must not have more than '
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1907 'precision digits')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1908
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1909 # define 0**0 == NaN, for consistency with two-argument pow
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1910 # (even though it hurts!)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1911 if not other and not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1912 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1913 'at least one of pow() 1st argument '
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1914 'and 2nd argument must be nonzero ;'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1915 '0**0 is not defined')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1916
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1917 # compute sign of result
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1918 if other._iseven():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1919 sign = 0
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
1920 else:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1921 sign = self._sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1922
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1923 # convert modulo to a Python integer, and self and other to
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1924 # Decimal integers (i.e. force their exponents to be >= 0)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1925 modulo = abs(int(modulo))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1926 base = _WorkRep(self.to_integral_value())
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1927 exponent = _WorkRep(other.to_integral_value())
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1928
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1929 # compute result using integer pow()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1930 base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1931 for i in xrange(exponent.exp):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1932 base = pow(base, 10, modulo)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1933 base = pow(base, exponent.int, modulo)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1934
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1935 return _dec_from_triple(sign, str(base), 0)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1936
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1937 def _power_exact(self, other, p):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1938 """Attempt to compute self**other exactly.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1939
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1940 Given Decimals self and other and an integer p, attempt to
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1941 compute an exact result for the power self**other, with p
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1942 digits of precision. Return None if self**other is not
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1943 exactly representable in p digits.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1944
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1945 Assumes that elimination of special cases has already been
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1946 performed: self and other must both be nonspecial; self must
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1947 be positive and not numerically equal to 1; other must be
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1948 nonzero. For efficiency, other._exp should not be too large,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1949 so that 10**abs(other._exp) is a feasible calculation."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1950
70637
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
1951 # In the comments below, we write x for the value of self and y for the
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
1952 # value of other. Write x = xc*10**xe and abs(y) = yc*10**ye, with xc
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
1953 # and yc positive integers not divisible by 10.
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1954
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1955 # The main purpose of this method is to identify the *failure*
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1956 # of x**y to be exactly representable with as little effort as
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1957 # possible. So we look for cheap and easy tests that
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1958 # eliminate the possibility of x**y being exact. Only if all
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1959 # these tests are passed do we go on to actually compute x**y.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1960
70637
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
1961 # Here's the main idea. Express y as a rational number m/n, with m and
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
1962 # n relatively prime and n>0. Then for x**y to be exactly
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
1963 # representable (at *any* precision), xc must be the nth power of a
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
1964 # positive integer and xe must be divisible by n. If y is negative
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
1965 # then additionally xc must be a power of either 2 or 5, hence a power
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
1966 # of 2**n or 5**n.
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1967 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1968 # There's a limit to how small |y| can be: if y=m/n as above
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1969 # then:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1970 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1971 # (1) if xc != 1 then for the result to be representable we
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1972 # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1973 # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1974 # 2**(1/|y|), hence xc**|y| < 2 and the result is not
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1975 # representable.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1976 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1977 # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1978 # |y| < 1/|xe| then the result is not representable.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1979 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1980 # Note that since x is not equal to 1, at least one of (1) and
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1981 # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1982 # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1983 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1984 # There's also a limit to how large y can be, at least if it's
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1985 # positive: the normalized result will have coefficient xc**y,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1986 # so if it's representable then xc**y < 10**p, and y <
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1987 # p/log10(xc). Hence if y*log10(xc) >= p then the result is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1988 # not exactly representable.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1989
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1990 # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1991 # so |y| < 1/xe and the result is not representable.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1992 # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1993 # < 1/nbits(xc).
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1994
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1995 x = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1996 xc, xe = x.int, x.exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1997 while xc % 10 == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1998 xc //= 10
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
1999 xe += 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2000
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2001 y = _WorkRep(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2002 yc, ye = y.int, y.exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2003 while yc % 10 == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2004 yc //= 10
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2005 ye += 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2006
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2007 # case where xc == 1: result is 10**(xe*y), with xe*y
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2008 # required to be an integer
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2009 if xc == 1:
62868
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2010 xe *= yc
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2011 # result is now 10**(xe * 10**ye); xe * 10**ye must be integral
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2012 while xe % 10 == 0:
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2013 xe //= 10
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2014 ye += 1
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2015 if ye < 0:
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2016 return None
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2017 exponent = xe * 10**ye
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2018 if y.sign == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2019 exponent = -exponent
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2020 # if other is a nonnegative integer, use ideal exponent
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2021 if other._isinteger() and other._sign == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2022 ideal_exponent = self._exp*int(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2023 zeros = min(exponent-ideal_exponent, p-1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2024 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2025 zeros = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2026 return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2027
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2028 # case where y is negative: xc must be either a power
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2029 # of 2 or a power of 5.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2030 if y.sign == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2031 last_digit = xc % 10
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2032 if last_digit in (2,4,6,8):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2033 # quick test for power of 2
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2034 if xc & -xc != xc:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2035 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2036 # now xc is a power of 2; e is its exponent
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2037 e = _nbits(xc)-1
70637
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2038
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2039 # We now have:
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2040 #
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2041 # x = 2**e * 10**xe, e > 0, and y < 0.
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2042 #
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2043 # The exact result is:
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2044 #
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2045 # x**y = 5**(-e*y) * 10**(e*y + xe*y)
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2046 #
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2047 # provided that both e*y and xe*y are integers. Note that if
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2048 # 5**(-e*y) >= 10**p, then the result can't be expressed
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2049 # exactly with p digits of precision.
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2050 #
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2051 # Using the above, we can guard against large values of ye.
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2052 # 93/65 is an upper bound for log(10)/log(5), so if
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2053 #
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2054 # ye >= len(str(93*p//65))
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2055 #
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2056 # then
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2057 #
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2058 # -e*y >= -y >= 10**ye > 93*p/65 > p*log(10)/log(5),
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2059 #
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2060 # so 5**(-e*y) >= 10**p, and the coefficient of the result
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2061 # can't be expressed in p digits.
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2062
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2063 # emax >= largest e such that 5**e < 10**p.
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2064 emax = p*93//65
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2065 if ye >= len(str(emax)):
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2066 return None
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2067
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2068 # Find -e*y and -xe*y; both must be integers
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2069 e = _decimal_lshift_exact(e * yc, ye)
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2070 xe = _decimal_lshift_exact(xe * yc, ye)
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2071 if e is None or xe is None:
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2072 return None
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2073
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2074 if e > emax:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2075 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2076 xc = 5**e
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2077
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2078 elif last_digit == 5:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2079 # e >= log_5(xc) if xc is a power of 5; we have
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2080 # equality all the way up to xc=5**2658
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2081 e = _nbits(xc)*28//65
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2082 xc, remainder = divmod(5**e, xc)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2083 if remainder:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2084 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2085 while xc % 5 == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2086 xc //= 5
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2087 e -= 1
70637
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2088
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2089 # Guard against large values of ye, using the same logic as in
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2090 # the 'xc is a power of 2' branch. 10/3 is an upper bound for
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2091 # log(10)/log(2).
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2092 emax = p*10//3
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2093 if ye >= len(str(emax)):
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2094 return None
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2095
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2096 e = _decimal_lshift_exact(e * yc, ye)
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2097 xe = _decimal_lshift_exact(xe * yc, ye)
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2098 if e is None or xe is None:
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2099 return None
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2100
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
2101 if e > emax:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2102 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2103 xc = 2**e
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2104 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2105 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2106
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2107 if xc >= 10**p:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2108 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2109 xe = -e-xe
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2110 return _dec_from_triple(0, str(xc), xe)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2111
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2112 # now y is positive; find m and n such that y = m/n
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2113 if ye >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2114 m, n = yc*10**ye, 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2115 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2116 if xe != 0 and len(str(abs(yc*xe))) <= -ye:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2117 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2118 xc_bits = _nbits(xc)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2119 if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2120 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2121 m, n = yc, 10**(-ye)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2122 while m % 2 == n % 2 == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2123 m //= 2
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2124 n //= 2
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2125 while m % 5 == n % 5 == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2126 m //= 5
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2127 n //= 5
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2128
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2129 # compute nth root of xc*10**xe
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2130 if n > 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2131 # if 1 < xc < 2**n then xc isn't an nth power
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2132 if xc != 1 and xc_bits <= n:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2133 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2134
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2135 xe, rem = divmod(xe, n)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2136 if rem != 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2137 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2138
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2139 # compute nth root of xc using Newton's method
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2140 a = 1L << -(-_nbits(xc)//n) # initial estimate
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2141 while True:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2142 q, r = divmod(xc, a**(n-1))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2143 if a <= q:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2144 break
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2145 else:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2146 a = (a*(n-1) + q)//n
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2147 if not (a == q and r == 0):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2148 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2149 xc = a
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2150
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2151 # now xc*10**xe is the nth root of the original xc*10**xe
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2152 # compute mth power of xc*10**xe
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2153
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2154 # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2155 # 10**p and the result is not representable.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2156 if xc > 1 and m > p*100//_log10_lb(xc):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2157 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2158 xc = xc**m
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2159 xe *= m
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2160 if xc > 10**p:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2161 return None
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2162
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2163 # by this point the result *is* exactly representable
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2164 # adjust the exponent to get as close as possible to the ideal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2165 # exponent, if necessary
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2166 str_xc = str(xc)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2167 if other._isinteger() and other._sign == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2168 ideal_exponent = self._exp*int(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2169 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
2170 else:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2171 zeros = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2172 return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2173
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2174 def __pow__(self, other, modulo=None, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2175 """Return self ** other [ % modulo].
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2176
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2177 With two arguments, compute self**other.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2178
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2179 With three arguments, compute (self**other) % modulo. For the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2180 three argument form, the following restrictions on the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2181 arguments hold:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2182
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2183 - all three arguments must be integral
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2184 - other must be nonnegative
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2185 - either self or other (or both) must be nonzero
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2186 - modulo must be nonzero and must have at most p digits,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2187 where p is the context precision.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2188
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2189 If any of these restrictions is violated the InvalidOperation
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2190 flag is raised.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2191
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2192 The result of pow(self, other, modulo) is identical to the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2193 result that would be obtained by computing (self**other) %
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2194 modulo with unbounded precision, but is computed more
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2195 efficiently. It is always exact.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2196 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2197
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2198 if modulo is not None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2199 return self._power_modulo(other, modulo, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2200
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2201 other = _convert_other(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2202 if other is NotImplemented:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2203 return other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2204
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2205 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2206 context = getcontext()
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2207
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2208 # either argument is a NaN => result is NaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2209 ans = self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2210 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2211 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2212
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2213 # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2214 if not other:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2215 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2216 return context._raise_error(InvalidOperation, '0 ** 0')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2217 else:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2218 return _One
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2219
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2220 # result has sign 1 iff self._sign is 1 and other is an odd integer
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2221 result_sign = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2222 if self._sign == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2223 if other._isinteger():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2224 if not other._iseven():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2225 result_sign = 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2226 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2227 # -ve**noninteger = NaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2228 # (-0)**noninteger = 0**noninteger
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2229 if self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2230 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2231 'x ** y with x negative and y not an integer')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2232 # negate self, without doing any unwanted rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2233 self = self.copy_negate()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2234
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2235 # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2236 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2237 if other._sign == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2238 return _dec_from_triple(result_sign, '0', 0)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2239 else:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2240 return _SignedInfinity[result_sign]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2241
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2242 # 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
2243 if self._isinfinity():
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2244 if other._sign == 0:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2245 return _SignedInfinity[result_sign]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2246 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2247 return _dec_from_triple(result_sign, '0', 0)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2248
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2249 # 1**other = 1, but the choice of exponent and the flags
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2250 # depend on the exponent of self, and on whether other is a
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2251 # positive integer, a negative integer, or neither
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2252 if self == _One:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2253 if other._isinteger():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2254 # exp = max(self._exp*max(int(other), 0),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2255 # 1-context.prec) but evaluating int(other) directly
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2256 # is dangerous until we know other is small (other
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2257 # could be 1e999999999)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2258 if other._sign == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2259 multiplier = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2260 elif other > context.prec:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2261 multiplier = context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2262 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2263 multiplier = int(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2264
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2265 exp = self._exp * multiplier
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2266 if exp < 1-context.prec:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2267 exp = 1-context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2268 context._raise_error(Rounded)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2269 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2270 context._raise_error(Inexact)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2271 context._raise_error(Rounded)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2272 exp = 1-context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2273
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2274 return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2275
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2276 # compute adjusted exponent of self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2277 self_adj = self.adjusted()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2278
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2279 # self ** infinity is infinity if self > 1, 0 if self < 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2280 # self ** -infinity is infinity if self < 1, 0 if self > 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2281 if other._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2282 if (other._sign == 0) == (self_adj < 0):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2283 return _dec_from_triple(result_sign, '0', 0)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2284 else:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2285 return _SignedInfinity[result_sign]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2286
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2287 # from here on, the result always goes through the call
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2288 # to _fix at the end of this function.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2289 ans = None
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2290 exact = False
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2291
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2292 # crude test to catch cases of extreme overflow/underflow. If
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2293 # log10(self)*other >= 10**bound and bound >= len(str(Emax))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2294 # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2295 # self**other >= 10**(Emax+1), so overflow occurs. The test
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2296 # for underflow is similar.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2297 bound = self._log10_exp_bound() + other.adjusted()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2298 if (self_adj >= 0) == (other._sign == 0):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2299 # self > 1 and other +ve, or self < 1 and other -ve
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2300 # possibility of overflow
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2301 if bound >= len(str(context.Emax)):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2302 ans = _dec_from_triple(result_sign, '1', context.Emax+1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2303 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2304 # self > 1 and other -ve, or self < 1 and other +ve
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2305 # possibility of underflow to 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2306 Etiny = context.Etiny()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2307 if bound >= len(str(-Etiny)):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2308 ans = _dec_from_triple(result_sign, '1', Etiny-1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2309
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2310 # try for an exact result with precision +1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2311 if ans is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2312 ans = self._power_exact(other, context.prec + 1)
62868
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2313 if ans is not None:
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2314 if result_sign == 1:
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2315 ans = _dec_from_triple(1, ans._int, ans._exp)
3d8a7f701cb1 Fix Decimal speed issue; backport of r82652 from release27-maint.
Mark Dickinson <dickinsm@gmail.com>
parents: 61744
diff changeset
2316 exact = True
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2317
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2318 # usual case: inexact result, x**y computed directly as exp(y*log(x))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2319 if ans is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2320 p = context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2321 x = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2322 xc, xe = x.int, x.exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2323 y = _WorkRep(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2324 yc, ye = y.int, y.exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2325 if y.sign == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2326 yc = -yc
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2327
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2328 # compute correctly rounded result: start with precision +3,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2329 # then increase precision until result is unambiguously roundable
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2330 extra = 3
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2331 while True:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2332 coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2333 if coeff % (5*10**(len(str(coeff))-p-1)):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2334 break
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2335 extra += 3
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2336
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2337 ans = _dec_from_triple(result_sign, str(coeff), exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2338
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2339 # unlike exp, ln and log10, the power function respects the
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2340 # rounding mode; no need to switch to ROUND_HALF_EVEN here
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2341
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2342 # There's a difficulty here when 'other' is not an integer and
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2343 # the result is exact. In this case, the specification
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2344 # requires that the Inexact flag be raised (in spite of
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2345 # exactness), but since the result is exact _fix won't do this
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2346 # for us. (Correspondingly, the Underflow signal should also
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2347 # be raised for subnormal results.) We can't directly raise
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2348 # these signals either before or after calling _fix, since
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2349 # that would violate the precedence for signals. So we wrap
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2350 # the ._fix call in a temporary context, and reraise
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2351 # afterwards.
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2352 if exact and not other._isinteger():
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2353 # pad with zeros up to length context.prec+1 if necessary; this
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2354 # ensures that the Rounded signal will be raised.
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2355 if len(ans._int) <= context.prec:
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2356 expdiff = context.prec + 1 - len(ans._int)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2357 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2358 ans._exp-expdiff)
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2359
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2360 # create a copy of the current context, with cleared flags/traps
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2361 newcontext = context.copy()
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2362 newcontext.clear_flags()
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2363 for exception in _signals:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2364 newcontext.traps[exception] = 0
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2365
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2366 # round in the new context
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2367 ans = ans._fix(newcontext)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2368
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2369 # raise Inexact, and if necessary, Underflow
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2370 newcontext._raise_error(Inexact)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2371 if newcontext.flags[Subnormal]:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2372 newcontext._raise_error(Underflow)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2373
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2374 # propagate signals to the original context; _fix could
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2375 # have raised any of Overflow, Underflow, Subnormal,
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2376 # Inexact, Rounded, Clamped. Overflow needs the correct
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2377 # arguments. Note that the order of the exceptions is
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2378 # important here.
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2379 if newcontext.flags[Overflow]:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2380 context._raise_error(Overflow, 'above Emax', ans._sign)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2381 for exception in Underflow, Subnormal, Inexact, Rounded, Clamped:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2382 if newcontext.flags[exception]:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2383 context._raise_error(exception)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2384
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2385 else:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2386 ans = ans._fix(context)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2387
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2388 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2389
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2390 def __rpow__(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2391 """Swaps self/other and returns __pow__."""
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2392 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
2393 if other is NotImplemented:
b016236dfbd9 * Fix decimal's handling of foreign types. Now returns NotImplemented
Raymond Hettinger <python@rcn.com>
parents: 34758
diff changeset
2394 return other
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2395 return other.__pow__(self, context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2396
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2397 def normalize(self, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2398 """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
2399
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2400 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2401 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2402
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2403 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2404 ans = self._check_nans(context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2405 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2406 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2407
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
2408 dup = self._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2409 if dup._isinfinity():
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2410 return dup
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2411
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2412 if not dup:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2413 return _dec_from_triple(dup._sign, '0', 0)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2414 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
2415 end = len(dup._int)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2416 exp = dup._exp
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2417 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
2418 exp += 1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2419 end -= 1
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2420 return _dec_from_triple(dup._sign, dup._int[:end], exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2421
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2422 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
2423 """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
2424
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2425 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
2426 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2427 exp = _convert_other(exp, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2428
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2429 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2430 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2431 if rounding is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2432 rounding = context.rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2433
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2434 if self._is_special or exp._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2435 ans = self._check_nans(exp, context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2436 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2437 return ans
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2438
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2439 if exp._isinfinity() or self._isinfinity():
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2440 if exp._isinfinity() and self._isinfinity():
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2441 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
2442 return context._raise_error(InvalidOperation,
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2443 'quantize with one INF')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2444
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2445 # if we're not watching exponents, do a simple rescale
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2446 if not watchexp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2447 ans = self._rescale(exp._exp, rounding)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2448 # raise Inexact and Rounded where appropriate
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2449 if ans._exp > self._exp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2450 context._raise_error(Rounded)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2451 if ans != self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2452 context._raise_error(Inexact)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2453 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2454
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2455 # exp._exp should be between Etiny and Emax
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2456 if not (context.Etiny() <= exp._exp <= context.Emax):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2457 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2458 'target exponent out of bounds in quantize')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2459
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2460 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2461 ans = _dec_from_triple(self._sign, '0', exp._exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2462 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2463
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2464 self_adjusted = self.adjusted()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2465 if self_adjusted > context.Emax:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2466 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2467 'exponent of quantize result too large for current context')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2468 if self_adjusted - exp._exp + 1 > context.prec:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2469 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2470 'quantize result has too many digits for current context')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2471
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2472 ans = self._rescale(exp._exp, rounding)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2473 if ans.adjusted() > context.Emax:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2474 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2475 'exponent of quantize result too large for current context')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2476 if len(ans._int) > context.prec:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2477 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2478 'quantize result has too many digits for current context')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2479
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2480 # raise appropriate flags
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2481 if ans and ans.adjusted() < context.Emin:
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2482 context._raise_error(Subnormal)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2483 if ans._exp > self._exp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2484 if ans != self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2485 context._raise_error(Inexact)
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2486 context._raise_error(Rounded)
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2487
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2488 # call to fix takes care of any necessary folddown, and
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2489 # signals Clamped if necessary
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2490 ans = ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2491 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2492
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2493 def same_quantum(self, other):
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2494 """Return True if self and other have the same exponent; otherwise
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2495 return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2496
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2497 If either operand is a special value, the following rules are used:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2498 * return True if both operands are infinities
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2499 * return True if both operands are NaNs
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2500 * otherwise, return False.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2501 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2502 other = _convert_other(other, raiseit=True)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2503 if self._is_special or other._is_special:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2504 return (self.is_nan() and other.is_nan() or
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2505 self.is_infinite() and other.is_infinite())
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2506 return self._exp == other._exp
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2507
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2508 def _rescale(self, exp, rounding):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2509 """Rescale self so that the exponent is exp, either by padding with zeros
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2510 or by truncating digits, using the given rounding mode.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2511
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2512 Specials are returned without change. This operation is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2513 quiet: it raises no flags, and uses no information from the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2514 context.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2515
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2516 exp = exp to scale to (an integer)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2517 rounding = rounding mode
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2518 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2519 if self._is_special:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2520 return Decimal(self)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2521 if not self:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2522 return _dec_from_triple(self._sign, '0', exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2523
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2524 if self._exp >= exp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2525 # pad answer with zeros if necessary
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2526 return _dec_from_triple(self._sign,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2527 self._int + '0'*(self._exp - exp), exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2528
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2529 # too many digits; round and lose data. If self.adjusted() <
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2530 # exp-1, replace self by 10**(exp-1) before rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2531 digits = len(self._int) + self._exp - exp
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2532 if digits < 0:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2533 self = _dec_from_triple(self._sign, '1', exp-1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2534 digits = 0
69271
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
2535 this_function = self._pick_rounding_function[rounding]
f4adc2926bf5 Neaten-up the fix to issue 11830
Raymond Hettinger <python@rcn.com>
parents: 69263
diff changeset
2536 changed = this_function(self, digits)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2537 coeff = self._int[:digits] or '0'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2538 if changed == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2539 coeff = str(int(coeff)+1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2540 return _dec_from_triple(self._sign, coeff, exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2541
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2542 def _round(self, places, rounding):
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2543 """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
2544 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
2545
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2546 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
2547
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2548 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
2549 information from the context.
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2550
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2551 """
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2552 if places <= 0:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2553 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
2554 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
2555 return Decimal(self)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2556 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
2557 # 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
2558 # 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
2559 # 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
2560 # 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
2561 if ans.adjusted() != self.adjusted():
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2562 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
2563 return ans
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
2564
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2565 def to_integral_exact(self, rounding=None, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2566 """Rounds to a nearby integer.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2567
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2568 If no rounding mode is specified, take the rounding mode from
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2569 the context. This method raises the Rounded and Inexact flags
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2570 when appropriate.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2571
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2572 See also: to_integral_value, which does exactly the same as
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2573 this method except that it doesn't raise Inexact or Rounded.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2574 """
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2575 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2576 ans = self._check_nans(context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2577 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2578 return ans
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2579 return Decimal(self)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2580 if self._exp >= 0:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2581 return Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2582 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2583 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
2584 if context is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2585 context = getcontext()
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2586 if rounding is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2587 rounding = context.rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2588 ans = self._rescale(0, rounding)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2589 if ans != self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2590 context._raise_error(Inexact)
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
2591 context._raise_error(Rounded)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2592 return ans
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2593
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2594 def to_integral_value(self, rounding=None, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2595 """Rounds to the nearest integer, without raising inexact, rounded."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2596 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2597 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2598 if rounding is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2599 rounding = context.rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2600 if self._is_special:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2601 ans = self._check_nans(context=context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2602 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2603 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2604 return Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2605 if self._exp >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2606 return Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2607 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2608 return self._rescale(0, rounding)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2609
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2610 # the method name changed, but we provide also the old one, for compatibility
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2611 to_integral = to_integral_value
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2612
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2613 def sqrt(self, context=None):
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2614 """Return the square root of self."""
46083
0b63999158b0 Decimal.sqrt(0) failed when the context was not
Mark Dickinson <dickinsm@gmail.com>
parents: 44603
diff changeset
2615 if context is None:
0b63999158b0 Decimal.sqrt(0) failed when the context was not
Mark Dickinson <dickinsm@gmail.com>
parents: 44603
diff changeset
2616 context = getcontext()
0b63999158b0 Decimal.sqrt(0) failed when the context was not
Mark Dickinson <dickinsm@gmail.com>
parents: 44603
diff changeset
2617
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2618 if self._is_special:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2619 ans = self._check_nans(context=context)
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2620 if ans:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2621 return ans
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2622
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2623 if self._isinfinity() and self._sign == 0:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2624 return Decimal(self)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2625
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2626 if not self:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2627 # exponent = self._exp // 2. sqrt(-0) = -0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2628 ans = _dec_from_triple(self._sign, '0', self._exp // 2)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2629 return ans._fix(context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2630
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2631 if self._sign == 1:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2632 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
2633
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2634 # At this point self represents a positive number. Let p be
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2635 # the desired precision and express self in the form c*100**e
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2636 # with c a positive real number and e an integer, c and e
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2637 # being chosen so that 100**(p-1) <= c < 100**p. Then the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2638 # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2639 # <= sqrt(c) < 10**p, so the closest representable Decimal at
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2640 # precision p is n*10**e where n = round_half_even(sqrt(c)),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2641 # the closest integer to sqrt(c) with the even integer chosen
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2642 # in the case of a tie.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2643 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2644 # To ensure correct rounding in all cases, we use the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2645 # following trick: we compute the square root to an extra
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2646 # place (precision p+1 instead of precision p), rounding down.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2647 # Then, if the result is inexact and its last digit is 0 or 5,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2648 # we increase the last digit to 1 or 6 respectively; if it's
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2649 # exact we leave the last digit alone. Now the final round to
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2650 # p places (or fewer in the case of underflow) will round
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2651 # correctly and raise the appropriate flags.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2652
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2653 # use an extra digit of precision
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2654 prec = context.prec+1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2655
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2656 # write argument in the form c*100**e where e = self._exp//2
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2657 # is the 'ideal' exponent, to be used if the square root is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2658 # exactly representable. l is the number of 'digits' of c in
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2659 # base 100, so that 100**(l-1) <= c < 100**l.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2660 op = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2661 e = op.exp >> 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2662 if op.exp & 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2663 c = op.int * 10
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2664 l = (len(self._int) >> 1) + 1
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2665 else:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2666 c = op.int
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2667 l = len(self._int)+1 >> 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2668
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2669 # rescale so that c has exactly prec base 100 'digits'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2670 shift = prec-l
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2671 if shift >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2672 c *= 100**shift
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2673 exact = True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2674 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2675 c, remainder = divmod(c, 100**-shift)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2676 exact = not remainder
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2677 e -= shift
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2678
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2679 # find n = floor(sqrt(c)) using Newton's method
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2680 n = 10**prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2681 while True:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2682 q = c//n
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2683 if n <= q:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2684 break
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2685 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2686 n = n + q >> 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2687 exact = exact and n*n == c
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2688
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2689 if exact:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2690 # result is exact; rescale to use ideal exponent e
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2691 if shift >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2692 # assert n % 10**shift == 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2693 n //= 10**shift
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2694 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2695 n *= 10**-shift
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2696 e += shift
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2697 else:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2698 # result is not exact; fix last digit as described above
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2699 if n % 5 == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2700 n += 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2701
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2702 ans = _dec_from_triple(0, str(n), e)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2703
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2704 # round, and fit to current context
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2705 context = context._shallow_copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2706 rounding = context._set_rounding(ROUND_HALF_EVEN)
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
2707 ans = ans._fix(context)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2708 context.rounding = rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2709
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2710 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2711
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2712 def max(self, other, context=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2713 """Returns the larger value.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2714
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2715 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
2716 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
2717 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2718 other = _convert_other(other, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2719
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2720 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2721 context = getcontext()
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2722
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2723 if self._is_special or other._is_special:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2724 # If one operand is a quiet NaN and the other is number, then the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2725 # number is always returned
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2726 sn = self._isnan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2727 on = other._isnan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2728 if sn or on:
50114
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
2729 if on == 1 and sn == 0:
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
2730 return self._fix(context)
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
2731 if sn == 1 and on == 0:
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
2732 return other._fix(context)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2733 return self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2734
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
2735 c = self._cmp(other)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2736 if c == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2737 # If both operands are finite and equal in numerical value
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2738 # then an ordering is applied:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2739 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2740 # If the signs differ then max returns the operand with the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2741 # positive sign and min returns the operand with the negative sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2742 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2743 # If the signs are the same then the exponent is used to select
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2744 # the result. This is exactly the ordering used in compare_total.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2745 c = self.compare_total(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2746
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2747 if c == -1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2748 ans = other
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2749 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2750 ans = self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2751
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2752 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2753
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2754 def min(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2755 """Returns the smaller value.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2756
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2757 Like min(self, other) except if one is not a number, returns
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2758 NaN (and signals if one is sNaN). Also rounds.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2759 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2760 other = _convert_other(other, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2761
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2762 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2763 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2764
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2765 if self._is_special or other._is_special:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2766 # 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
2767 # number is always returned
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2768 sn = self._isnan()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2769 on = other._isnan()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2770 if sn or on:
50114
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
2771 if on == 1 and sn == 0:
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
2772 return self._fix(context)
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
2773 if sn == 1 and on == 0:
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
2774 return other._fix(context)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2775 return self._check_nans(other, context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2776
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
2777 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
2778 if c == 0:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2779 c = self.compare_total(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2780
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2781 if c == -1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2782 ans = self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2783 else:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
2784 ans = other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2785
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2786 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2787
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2788 def _isinteger(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2789 """Returns whether self is an integer"""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2790 if self._is_special:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2791 return False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2792 if self._exp >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2793 return True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2794 rest = self._int[self._exp:]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2795 return rest == '0'*len(rest)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2796
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2797 def _iseven(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2798 """Returns True if self is even. Assumes self is an integer."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2799 if not self or self._exp > 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2800 return True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2801 return self._int[-1+self._exp] in '02468'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2802
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2803 def adjusted(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2804 """Return the adjusted exponent of self"""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2805 try:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2806 return self._exp + len(self._int) - 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2807 # If NaN or Infinity, self._exp is string
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2808 except TypeError:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2809 return 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2810
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2811 def canonical(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2812 """Returns the same Decimal object.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2813
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2814 As we do not have different encodings for the same number, the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2815 received object already is in its canonical form.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2816 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2817 return self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2818
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2819 def compare_signal(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2820 """Compares self to the other operand numerically.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2821
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2822 It's pretty much like compare(), but all NaNs signal, with signaling
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2823 NaNs taking precedence over quiet NaNs.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2824 """
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
2825 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
2826 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
2827 if ans:
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
2828 return ans
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2829 return self.compare(other, context=context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2830
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2831 def compare_total(self, other):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2832 """Compares self to other using the abstract representations.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2833
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2834 This is not like the standard compare, which use their numerical
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2835 value. Note that a total ordering is defined for all possible abstract
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2836 representations.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2837 """
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
2838 other = _convert_other(other, raiseit=True)
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
2839
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2840 # if one is negative and the other is positive, it's easy
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2841 if self._sign and not other._sign:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2842 return _NegativeOne
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2843 if not self._sign and other._sign:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2844 return _One
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2845 sign = self._sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2846
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2847 # let's handle both NaN types
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2848 self_nan = self._isnan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2849 other_nan = other._isnan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2850 if self_nan or other_nan:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2851 if self_nan == other_nan:
55741
1f1b4c03e892 Merged revisions 74564 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55519
diff changeset
2852 # compare payloads as though they're integers
1f1b4c03e892 Merged revisions 74564 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55519
diff changeset
2853 self_key = len(self._int), self._int
1f1b4c03e892 Merged revisions 74564 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55519
diff changeset
2854 other_key = len(other._int), other._int
1f1b4c03e892 Merged revisions 74564 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55519
diff changeset
2855 if self_key < other_key:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2856 if sign:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2857 return _One
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2858 else:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2859 return _NegativeOne
55741
1f1b4c03e892 Merged revisions 74564 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55519
diff changeset
2860 if self_key > other_key:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2861 if sign:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2862 return _NegativeOne
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2863 else:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2864 return _One
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2865 return _Zero
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2866
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2867 if sign:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2868 if self_nan == 1:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2869 return _NegativeOne
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2870 if other_nan == 1:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2871 return _One
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2872 if self_nan == 2:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2873 return _NegativeOne
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2874 if other_nan == 2:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2875 return _One
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2876 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2877 if self_nan == 1:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2878 return _One
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2879 if other_nan == 1:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2880 return _NegativeOne
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2881 if self_nan == 2:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2882 return _One
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2883 if other_nan == 2:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2884 return _NegativeOne
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2885
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2886 if self < other:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2887 return _NegativeOne
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2888 if self > other:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2889 return _One
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2890
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2891 if self._exp < other._exp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2892 if sign:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2893 return _One
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2894 else:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2895 return _NegativeOne
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2896 if self._exp > other._exp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2897 if sign:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2898 return _NegativeOne
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2899 else:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2900 return _One
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2901 return _Zero
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2902
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2903
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2904 def compare_total_mag(self, other):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2905 """Compares self to other using abstract repr., ignoring sign.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2906
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2907 Like compare_total, but with operand's sign ignored and assumed to be 0.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2908 """
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
2909 other = _convert_other(other, raiseit=True)
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
2910
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2911 s = self.copy_abs()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2912 o = other.copy_abs()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2913 return s.compare_total(o)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2914
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2915 def copy_abs(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2916 """Returns a copy with the sign set to 0. """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2917 return _dec_from_triple(0, self._int, self._exp, self._is_special)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2918
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2919 def copy_negate(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2920 """Returns a copy with the sign inverted."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2921 if self._sign:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2922 return _dec_from_triple(0, self._int, self._exp, self._is_special)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2923 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2924 return _dec_from_triple(1, self._int, self._exp, self._is_special)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2925
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2926 def copy_sign(self, other):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2927 """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
2928 other = _convert_other(other, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2929 return _dec_from_triple(other._sign, self._int,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2930 self._exp, self._is_special)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2931
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2932 def exp(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2933 """Returns e ** self."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2934
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2935 if context is None:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
2936 context = getcontext()
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2937
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2938 # exp(NaN) = NaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2939 ans = self._check_nans(context=context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2940 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2941 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2942
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2943 # exp(-Infinity) = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2944 if self._isinfinity() == -1:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2945 return _Zero
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2946
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2947 # exp(0) = 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2948 if not self:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
2949 return _One
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2950
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2951 # exp(Infinity) = Infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2952 if self._isinfinity() == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2953 return Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2954
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2955 # the result is now guaranteed to be inexact (the true
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2956 # mathematical result is transcendental). There's no need to
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2957 # raise Rounded and Inexact here---they'll always be raised as
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2958 # a result of the call to _fix.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2959 p = context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2960 adj = self.adjusted()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2961
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2962 # we only need to do any computation for quite a small range
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2963 # of adjusted exponents---for example, -29 <= adj <= 10 for
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2964 # the default context. For smaller exponent the result is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2965 # indistinguishable from 1 at the given precision, while for
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2966 # larger exponent the result either overflows or underflows.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2967 if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2968 # overflow
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2969 ans = _dec_from_triple(0, '1', context.Emax+1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2970 elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2971 # underflow to 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2972 ans = _dec_from_triple(0, '1', context.Etiny()-1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2973 elif self._sign == 0 and adj < -p:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2974 # p+1 digits; final round will raise correct flags
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2975 ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2976 elif self._sign == 1 and adj < -p-1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2977 # p+1 digits; final round will raise correct flags
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2978 ans = _dec_from_triple(0, '9'*(p+1), -p-1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2979 # general case
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2980 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2981 op = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2982 c, e = op.int, op.exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2983 if op.sign == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2984 c = -c
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2985
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2986 # compute correctly rounded result: increase precision by
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2987 # 3 digits at a time until we get an unambiguously
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2988 # roundable result
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2989 extra = 3
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2990 while True:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2991 coeff, exp = _dexp(c, e, p+extra)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2992 if coeff % (5*10**(len(str(coeff))-p-1)):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2993 break
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2994 extra += 3
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2995
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2996 ans = _dec_from_triple(0, str(coeff), exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2997
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2998 # at this stage, ans should round correctly with *any*
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
2999 # rounding mode, not just with ROUND_HALF_EVEN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3000 context = context._shallow_copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3001 rounding = context._set_rounding(ROUND_HALF_EVEN)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3002 ans = ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3003 context.rounding = rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3004
33803
d2e959404826 SF bug #1048728: Bug fixes and cleanup for decimal.py
Raymond Hettinger <python@rcn.com>
parents: 33722
diff changeset
3005 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3006
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3007 def is_canonical(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3008 """Return True if self is canonical; otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3009
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3010 Currently, the encoding of a Decimal instance is always
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3011 canonical, so this method returns True for any Decimal.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3012 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3013 return True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3014
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3015 def is_finite(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3016 """Return True if self is finite; otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3017
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3018 A Decimal instance is considered finite if it is neither
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3019 infinite nor a NaN.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3020 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3021 return not self._is_special
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3022
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3023 def is_infinite(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3024 """Return True if self is infinite; otherwise return False."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3025 return self._exp == 'F'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3026
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3027 def is_nan(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3028 """Return True if self is a qNaN or sNaN; otherwise return False."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3029 return self._exp in ('n', 'N')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3030
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3031 def is_normal(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3032 """Return True if self is a normal number; otherwise return False."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3033 if self._is_special or not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3034 return False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3035 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3036 context = getcontext()
56854
59505e7e7073 Merged revisions 75561 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56836
diff changeset
3037 return context.Emin <= self.adjusted()
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3038
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3039 def is_qnan(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3040 """Return True if self is a quiet NaN; otherwise return False."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3041 return self._exp == 'n'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3042
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3043 def is_signed(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3044 """Return True if self is negative; otherwise return False."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3045 return self._sign == 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3046
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3047 def is_snan(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3048 """Return True if self is a signaling NaN; otherwise return False."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3049 return self._exp == 'N'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3050
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3051 def is_subnormal(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3052 """Return True if self is subnormal; otherwise return False."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3053 if self._is_special or not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3054 return False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3055 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3056 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3057 return self.adjusted() < context.Emin
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3058
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3059 def is_zero(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3060 """Return True if self is a zero; otherwise return False."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3061 return not self._is_special and self._int == '0'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3062
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3063 def _ln_exp_bound(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3064 """Compute a lower bound for the adjusted exponent of self.ln().
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3065 In other words, compute r such that self.ln() >= 10**r. Assumes
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3066 that self is finite and positive and that self != 1.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3067 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3068
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3069 # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3070 adj = self._exp + len(self._int) - 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3071 if adj >= 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3072 # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3073 return len(str(adj*23//10)) - 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3074 if adj <= -2:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3075 # argument <= 0.1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3076 return len(str((-1-adj)*23//10)) - 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3077 op = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3078 c, e = op.int, op.exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3079 if adj == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3080 # 1 < self < 10
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3081 num = str(c-10**-e)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3082 den = str(c)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3083 return len(num) - len(den) - (num < den)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3084 # adj == -1, 0.1 <= self < 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3085 return e + len(str(10**-e - c)) - 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3086
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3087
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3088 def ln(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3089 """Returns the natural (base e) logarithm of self."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3090
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3091 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3092 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3093
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3094 # ln(NaN) = NaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3095 ans = self._check_nans(context=context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3096 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3097 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3098
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3099 # ln(0.0) == -Infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3100 if not self:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
3101 return _NegativeInfinity
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3102
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3103 # ln(Infinity) = Infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3104 if self._isinfinity() == 1:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
3105 return _Infinity
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3106
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3107 # ln(1.0) == 0.0
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
3108 if self == _One:
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
3109 return _Zero
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3110
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3111 # ln(negative) raises InvalidOperation
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3112 if self._sign == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3113 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3114 'ln of a negative value')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3115
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3116 # result is irrational, so necessarily inexact
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3117 op = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3118 c, e = op.int, op.exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3119 p = context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3120
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3121 # correctly rounded result: repeatedly increase precision by 3
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3122 # until we get an unambiguously roundable result
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3123 places = p - self._ln_exp_bound() + 2 # at least p+3 places
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3124 while True:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3125 coeff = _dlog(c, e, places)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3126 # assert len(str(abs(coeff)))-p >= 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3127 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3128 break
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3129 places += 3
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3130 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3131
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3132 context = context._shallow_copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3133 rounding = context._set_rounding(ROUND_HALF_EVEN)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3134 ans = ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3135 context.rounding = rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3136 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3137
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3138 def _log10_exp_bound(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3139 """Compute a lower bound for the adjusted exponent of self.log10().
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3140 In other words, find r such that self.log10() >= 10**r.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3141 Assumes that self is finite and positive and that self != 1.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3142 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3143
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3144 # For x >= 10 or x < 0.1 we only need a bound on the integer
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3145 # part of log10(self), and this comes directly from the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3146 # exponent of x. For 0.1 <= x <= 10 we use the inequalities
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3147 # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3148 # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3149
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3150 adj = self._exp + len(self._int) - 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3151 if adj >= 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3152 # self >= 10
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3153 return len(str(adj))-1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3154 if adj <= -2:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3155 # self < 0.1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3156 return len(str(-1-adj))-1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3157 op = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3158 c, e = op.int, op.exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3159 if adj == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3160 # 1 < self < 10
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3161 num = str(c-10**-e)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3162 den = str(231*c)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3163 return len(num) - len(den) - (num < den) + 2
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3164 # adj == -1, 0.1 <= self < 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3165 num = str(10**-e-c)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3166 return len(num) + e - (num < "231") - 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3167
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3168 def log10(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3169 """Returns the base 10 logarithm of self."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3170
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3171 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3172 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3173
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3174 # log10(NaN) = NaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3175 ans = self._check_nans(context=context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3176 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3177 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3178
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3179 # log10(0.0) == -Infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3180 if not self:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
3181 return _NegativeInfinity
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3182
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3183 # log10(Infinity) = Infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3184 if self._isinfinity() == 1:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
3185 return _Infinity
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3186
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3187 # log10(negative or -Infinity) raises InvalidOperation
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3188 if self._sign == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3189 return context._raise_error(InvalidOperation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3190 'log10 of a negative value')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3191
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3192 # log10(10**n) = n
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3193 if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3194 # answer may need rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3195 ans = Decimal(self._exp + len(self._int) - 1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3196 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3197 # result is irrational, so necessarily inexact
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3198 op = _WorkRep(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3199 c, e = op.int, op.exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3200 p = context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3201
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3202 # correctly rounded result: repeatedly increase precision
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3203 # until result is unambiguously roundable
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3204 places = p-self._log10_exp_bound()+2
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3205 while True:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3206 coeff = _dlog10(c, e, places)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3207 # assert len(str(abs(coeff)))-p >= 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3208 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3209 break
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3210 places += 3
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3211 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3212
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3213 context = context._shallow_copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3214 rounding = context._set_rounding(ROUND_HALF_EVEN)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3215 ans = ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3216 context.rounding = rounding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3217 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3218
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3219 def logb(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3220 """ Returns the exponent of the magnitude of self's MSD.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3221
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3222 The result is the integer which is the exponent of the magnitude
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3223 of the most significant digit of self (as though it were truncated
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3224 to a single digit while maintaining the value of that digit and
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3225 without limiting the resulting exponent).
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3226 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3227 # logb(NaN) = NaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3228 ans = self._check_nans(context=context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3229 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3230 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3231
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3232 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3233 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3234
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3235 # logb(+/-Inf) = +Inf
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3236 if self._isinfinity():
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
3237 return _Infinity
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3238
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3239 # logb(0) = -Inf, DivisionByZero
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3240 if not self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3241 return context._raise_error(DivisionByZero, 'logb(0)', 1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3242
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3243 # otherwise, simply return the adjusted exponent of self, as a
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3244 # Decimal. Note that no attempt is made to fit the result
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3245 # into the current context.
56836
bd776e01993a Merged revisions 75275 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55886
diff changeset
3246 ans = Decimal(self.adjusted())
bd776e01993a Merged revisions 75275 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55886
diff changeset
3247 return ans._fix(context)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3248
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3249 def _islogical(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3250 """Return True if self is a logical operand.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3251
44701
2f11f7d9bdc8 Docstring typos
Andrew M. Kuchling <amk@amk.ca>
parents: 44650
diff changeset
3252 For being logical, it must be a finite number with a sign of 0,
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3253 an exponent of 0, and a coefficient whose digits must all be
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3254 either 0 or 1.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3255 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3256 if self._sign != 0 or self._exp != 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3257 return False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3258 for dig in self._int:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3259 if dig not in '01':
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3260 return False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3261 return True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3262
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3263 def _fill_logical(self, context, opa, opb):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3264 dif = context.prec - len(opa)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3265 if dif > 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3266 opa = '0'*dif + opa
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3267 elif dif < 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3268 opa = opa[-context.prec:]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3269 dif = context.prec - len(opb)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3270 if dif > 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3271 opb = '0'*dif + opb
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3272 elif dif < 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3273 opb = opb[-context.prec:]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3274 return opa, opb
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3275
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3276 def logical_and(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3277 """Applies an 'and' operation between self and other's digits."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3278 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3279 context = getcontext()
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3280
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3281 other = _convert_other(other, raiseit=True)
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3282
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3283 if not self._islogical() or not other._islogical():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3284 return context._raise_error(InvalidOperation)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3285
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3286 # fill to context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3287 (opa, opb) = self._fill_logical(context, self._int, other._int)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3288
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3289 # make the operation, and clean starting zeroes
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3290 result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3291 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3292
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3293 def logical_invert(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3294 """Invert all its digits."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3295 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3296 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3297 return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3298 context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3299
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3300 def logical_or(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3301 """Applies an 'or' operation between self and other's digits."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3302 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3303 context = getcontext()
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3304
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3305 other = _convert_other(other, raiseit=True)
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3306
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3307 if not self._islogical() or not other._islogical():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3308 return context._raise_error(InvalidOperation)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3309
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3310 # fill to context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3311 (opa, opb) = self._fill_logical(context, self._int, other._int)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3312
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3313 # make the operation, and clean starting zeroes
50601
2be490abf333 Merged revisions 68317-68318 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50480
diff changeset
3314 result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)])
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3315 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3316
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3317 def logical_xor(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3318 """Applies an 'xor' operation between self and other's digits."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3319 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3320 context = getcontext()
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3321
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3322 other = _convert_other(other, raiseit=True)
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3323
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3324 if not self._islogical() or not other._islogical():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3325 return context._raise_error(InvalidOperation)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3326
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3327 # fill to context.prec
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3328 (opa, opb) = self._fill_logical(context, self._int, other._int)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3329
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3330 # make the operation, and clean starting zeroes
50601
2be490abf333 Merged revisions 68317-68318 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50480
diff changeset
3331 result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)])
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3332 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3333
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3334 def max_mag(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3335 """Compares the values numerically with their sign ignored."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3336 other = _convert_other(other, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3337
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3338 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3339 context = getcontext()
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
3340
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
3341 if self._is_special or other._is_special:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3342 # 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
3343 # number is always returned
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
3344 sn = self._isnan()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
3345 on = other._isnan()
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
3346 if sn or on:
50114
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
3347 if on == 1 and sn == 0:
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
3348 return self._fix(context)
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
3349 if sn == 1 and on == 0:
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
3350 return other._fix(context)
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
3351 return self._check_nans(other, context)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3352
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
3353 c = self.copy_abs()._cmp(other.copy_abs())
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3354 if c == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3355 c = self.compare_total(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3356
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3357 if c == -1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3358 ans = other
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3359 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3360 ans = self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3361
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3362 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3363
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3364 def min_mag(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3365 """Compares the values numerically with their sign ignored."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3366 other = _convert_other(other, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3367
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3368 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3369 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3370
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3371 if self._is_special or other._is_special:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3372 # If one operand is a quiet NaN and the other is number, then the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3373 # number is always returned
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3374 sn = self._isnan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3375 on = other._isnan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3376 if sn or on:
50114
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
3377 if on == 1 and sn == 0:
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
3378 return self._fix(context)
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
3379 if sn == 1 and on == 0:
e35468bc4df4 Issue #4084: fix bug in handling of NaNs in Decimal.max, Decimal.min,
Mark Dickinson <dickinsm@gmail.com>
parents: 46089
diff changeset
3380 return other._fix(context)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3381 return self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3382
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
3383 c = self.copy_abs()._cmp(other.copy_abs())
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
3384 if c == 0:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3385 c = self.compare_total(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3386
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3387 if c == -1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3388 ans = self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3389 else:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3390 ans = other
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
3391
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3392 return ans._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3393
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3394 def next_minus(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3395 """Returns the largest representable number smaller than itself."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3396 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3397 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3398
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3399 ans = self._check_nans(context=context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3400 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3401 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3402
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3403 if self._isinfinity() == -1:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
3404 return _NegativeInfinity
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3405 if self._isinfinity() == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3406 return _dec_from_triple(0, '9'*context.prec, context.Etop())
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3407
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3408 context = context.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3409 context._set_rounding(ROUND_FLOOR)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3410 context._ignore_all_flags()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3411 new_self = self._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3412 if new_self != self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3413 return new_self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3414 return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3415 context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3416
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3417 def next_plus(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3418 """Returns the smallest representable number larger than itself."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3419 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3420 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3421
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3422 ans = self._check_nans(context=context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3423 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3424 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3425
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3426 if self._isinfinity() == 1:
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
3427 return _Infinity
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3428 if self._isinfinity() == -1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3429 return _dec_from_triple(1, '9'*context.prec, context.Etop())
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3430
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3431 context = context.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3432 context._set_rounding(ROUND_CEILING)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3433 context._ignore_all_flags()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3434 new_self = self._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3435 if new_self != self:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3436 return new_self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3437 return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3438 context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3439
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3440 def next_toward(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3441 """Returns the number closest to self, in the direction towards other.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3442
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3443 The result is the closest representable number to self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3444 (excluding self) that is in the direction towards other,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3445 unless both have the same value. If the two operands are
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3446 numerically equal, then the result is a copy of self with the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3447 sign set to be the same as the sign of other.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3448 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3449 other = _convert_other(other, raiseit=True)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3450
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
3451 if context is None:
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
3452 context = getcontext()
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3453
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3454 ans = self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3455 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3456 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3457
45201
f55a4f119141 Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN
Mark Dickinson <dickinsm@gmail.com>
parents: 44923
diff changeset
3458 comparison = self._cmp(other)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3459 if comparison == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3460 return self.copy_sign(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3461
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3462 if comparison == -1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3463 ans = self.next_plus(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3464 else: # comparison == 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3465 ans = self.next_minus(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3466
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3467 # decide which flags to raise using value of ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3468 if ans._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3469 context._raise_error(Overflow,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3470 'Infinite result from next_toward',
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3471 ans._sign)
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
3472 context._raise_error(Inexact)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3473 context._raise_error(Rounded)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3474 elif ans.adjusted() < context.Emin:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3475 context._raise_error(Underflow)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3476 context._raise_error(Subnormal)
61212
ecc32e2f4656 Merged revisions 80753 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 58169
diff changeset
3477 context._raise_error(Inexact)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3478 context._raise_error(Rounded)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3479 # if precision == 1 then we don't raise Clamped for a
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3480 # result 0E-Etiny.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3481 if not ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3482 context._raise_error(Clamped)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3483
33803
d2e959404826 SF bug #1048728: Bug fixes and cleanup for decimal.py
Raymond Hettinger <python@rcn.com>
parents: 33722
diff changeset
3484 return ans
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3485
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3486 def number_class(self, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3487 """Returns an indication of the class of self.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3488
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3489 The class is one of the following strings:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3490 sNaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3491 NaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3492 -Infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3493 -Normal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3494 -Subnormal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3495 -Zero
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3496 +Zero
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3497 +Subnormal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3498 +Normal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3499 +Infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3500 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3501 if self.is_snan():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3502 return "sNaN"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3503 if self.is_qnan():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3504 return "NaN"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3505 inf = self._isinfinity()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3506 if inf == 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3507 return "+Infinity"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3508 if inf == -1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3509 return "-Infinity"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3510 if self.is_zero():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3511 if self._sign:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3512 return "-Zero"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3513 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3514 return "+Zero"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3515 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3516 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3517 if self.is_subnormal(context=context):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3518 if self._sign:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3519 return "-Subnormal"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3520 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3521 return "+Subnormal"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3522 # just a normal, regular, boring number, :)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3523 if self._sign:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3524 return "-Normal"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3525 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3526 return "+Normal"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3527
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3528 def radix(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3529 """Just returns 10, as this is Decimal, :)"""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3530 return Decimal(10)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3531
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3532 def rotate(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3533 """Returns a rotated copy of self, value-of-other times."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3534 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3535 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3536
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3537 other = _convert_other(other, raiseit=True)
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3538
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3539 ans = self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3540 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3541 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3542
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3543 if other._exp != 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3544 return context._raise_error(InvalidOperation)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3545 if not (-context.prec <= int(other) <= context.prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3546 return context._raise_error(InvalidOperation)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3547
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3548 if self._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3549 return Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3550
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3551 # get values, pad if necessary
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3552 torot = int(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3553 rotdig = self._int
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3554 topad = context.prec - len(rotdig)
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3555 if topad > 0:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3556 rotdig = '0'*topad + rotdig
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3557 elif topad < 0:
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3558 rotdig = rotdig[-topad:]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3559
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3560 # let's rotate!
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3561 rotated = rotdig[torot:] + rotdig[:torot]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3562 return _dec_from_triple(self._sign,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3563 rotated.lstrip('0') or '0', self._exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3564
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3565 def scaleb(self, other, context=None):
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3566 """Returns self operand after adding the second value to its exp."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3567 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3568 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3569
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3570 other = _convert_other(other, raiseit=True)
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3571
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3572 ans = self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3573 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3574 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3575
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3576 if other._exp != 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3577 return context._raise_error(InvalidOperation)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3578 liminf = -2 * (context.Emax + context.prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3579 limsup = 2 * (context.Emax + context.prec)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3580 if not (liminf <= int(other) <= limsup):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3581 return context._raise_error(InvalidOperation)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3582
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3583 if self._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3584 return Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3585
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3586 d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3587 d = d._fix(context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3588 return d
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3589
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3590 def shift(self, other, context=None):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3591 """Returns a shifted copy of self, value-of-other times."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3592 if context is None:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3593 context = getcontext()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3594
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3595 other = _convert_other(other, raiseit=True)
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3596
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3597 ans = self._check_nans(other, context)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3598 if ans:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3599 return ans
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3601 if other._exp != 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3602 return context._raise_error(InvalidOperation)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3603 if not (-context.prec <= int(other) <= context.prec):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3604 return context._raise_error(InvalidOperation)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3605
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3606 if self._isinfinity():
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3607 return Decimal(self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3608
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3609 # get values, pad if necessary
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3610 torot = int(other)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3611 rotdig = self._int
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3612 topad = context.prec - len(rotdig)
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3613 if topad > 0:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3614 rotdig = '0'*topad + rotdig
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3615 elif topad < 0:
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3616 rotdig = rotdig[-topad:]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3617
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3618 # let's shift!
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3619 if torot < 0:
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3620 shifted = rotdig[:torot]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3621 else:
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3622 shifted = rotdig + '0'*torot
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3623 shifted = shifted[-context.prec:]
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3624
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3625 return _dec_from_triple(self._sign,
56971
53e38005d507 Merged revisions 75943-75945 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56854
diff changeset
3626 shifted.lstrip('0') or '0', self._exp)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3627
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3628 # Support for pickling, copy, and deepcopy
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3629 def __reduce__(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3630 return (self.__class__, (str(self),))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3631
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3632 def __copy__(self):
58485
fbfe5e42349f compare types with is not ==
Benjamin Peterson <benjamin@python.org>
parents: 58484
diff changeset
3633 if type(self) is Decimal:
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
3634 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
3635 return self.__class__(str(self))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3636
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3637 def __deepcopy__(self, memo):
58485
fbfe5e42349f compare types with is not ==
Benjamin Peterson <benjamin@python.org>
parents: 58484
diff changeset
3638 if type(self) is Decimal:
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
3639 return self # My components are also immutable
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3640 return self.__class__(str(self))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3641
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3642 # 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
3643 # 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
3644 def __format__(self, specifier, context=None, _localeconv=None):
45568
facf01f15b15 Fix docstring typo.
Mark Dickinson <dickinsm@gmail.com>
parents: 45566
diff changeset
3645 """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
3646
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3647 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
3648 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
3649 '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
3650 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
3651 value of context.capitals.
45566
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
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3654 # 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
3655 # 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
3656 # 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
3657 # 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
3658 # 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
3659 if context is None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3660 context = getcontext()
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3661
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3662 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
3663
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3664 # 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
3665 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
3666 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
3667 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
3668 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
3669
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3670 # 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
3671 if spec['type'] is None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3672 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
3673
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3674 # 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
3675 if spec['type'] == '%':
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3676 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
3677
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3678 # 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
3679 rounding = context.rounding
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3680 precision = spec['precision']
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3681 if precision is not None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3682 if spec['type'] in 'eE':
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3683 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
3684 elif spec['type'] in 'fF%':
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3685 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
3686 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
3687 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
3688 # 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
3689 # 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
3690 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
3691 self = self._rescale(0, rounding)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3692
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3693 # 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
3694 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
3695 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
3696 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
3697 dotplace = 1 - precision
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3698 else:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3699 dotplace = 1
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3700 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
3701 dotplace = leftdigits
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3702 elif spec['type'] in 'gG':
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3703 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
3704 dotplace = leftdigits
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3705 else:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3706 dotplace = 1
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3707
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3708 # 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
3709 if dotplace < 0:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3710 intpart = '0'
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3711 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
3712 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
3713 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
3714 fracpart = ''
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
3715 else:
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3716 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
3717 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
3718 exp = leftdigits-dotplace
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3719
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
3720 # 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
3721 # 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
3722 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
3723
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3724 def _dec_from_triple(sign, coefficient, exponent, special=False):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3725 """Create a decimal instance directly, without any validation,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3726 normalization (e.g. removal of leading zeros) or argument
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3727 conversion.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3728
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3729 This function is for *internal use only*.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3730 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3731
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3732 self = object.__new__(Decimal)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3733 self._sign = sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3734 self._int = coefficient
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3735 self._exp = exponent
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3736 self._is_special = special
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3737
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3738 return self
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3739
51294
aea90f5f398b Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51028
diff changeset
3740 # Register Decimal as a kind of Number (an abstract base class).
aea90f5f398b Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51028
diff changeset
3741 # However, do not register it as Real (because Decimals are not
aea90f5f398b Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51028
diff changeset
3742 # interoperable with floats).
aea90f5f398b Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51028
diff changeset
3743 _numbers.Number.register(Decimal)
aea90f5f398b Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51028
diff changeset
3744
aea90f5f398b Register decimals as numbers.Number
Raymond Hettinger <python@rcn.com>
parents: 51028
diff changeset
3745
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3746 ##### Context class #######################################################
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
3747
39729
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
3748 class _ContextManager(object):
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
3749 """Context manager class to support localcontext().
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
3750
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
3751 Sets a copy of the supplied context in __enter__() and restores
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
3752 the previous decimal context in __exit__()
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3753 """
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3754 def __init__(self, new_context):
39729
4cec45bd6663 Backport of decimal module context management updates from rev 51694 to 2.5 release branch
Nick Coghlan <ncoghlan@gmail.com>
parents: 39120
diff changeset
3755 self.new_context = new_context.copy()
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3756 def __enter__(self):
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3757 self.saved_context = getcontext()
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3758 setcontext(self.new_context)
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3759 return self.new_context
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3760 def __exit__(self, t, v, tb):
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3761 setcontext(self.saved_context)
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35379
diff changeset
3762
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3763 class Context(object):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3764 """Contains the context for a Decimal instance.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3765
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3766 Contains:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3767 prec - precision (for use in rounding, division, square roots..)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3768 rounding - rounding type (how you round)
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
3769 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
3770 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
3771 substituted in.
46643
ec09ad5bed1a Backport Raymond's changes in r60508 to Python 2.6.
Mark Dickinson <dickinsm@gmail.com>
parents: 46625
diff changeset
3772 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
3773 (Whether or not the trap_enabler is set)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3774 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
3775 Emin - Minimum exponent
ab0a2b74ddfd Changed the rounding constant values to match their variable names.
Raymond Hettinger <python@rcn.com>
parents: 32487
diff changeset
3776 Emax - Maximum exponent
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3777 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
3778 If 0, printed as 1e1
32496
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
3779 _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
3780 """
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3781
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3782 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
3783 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
3784 Emin=None, Emax=None,
32496
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
3785 capitals=None, _clamp=0,
33722
74a57e6684f3 Don't use mutable values for method defaults.
Raymond Hettinger <python@rcn.com>
parents: 33695
diff changeset
3786 _ignored_flags=None):
62872
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3787 # Set defaults; for everything except flags and _ignored_flags,
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3788 # inherit from DefaultContext.
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3789 try:
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3790 dc = DefaultContext
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3791 except NameError:
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3792 pass
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3793
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3794 self.prec = prec if prec is not None else dc.prec
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3795 self.rounding = rounding if rounding is not None else dc.rounding
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3796 self.Emin = Emin if Emin is not None else dc.Emin
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3797 self.Emax = Emax if Emax is not None else dc.Emax
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3798 self.capitals = capitals if capitals is not None else dc.capitals
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3799 self._clamp = _clamp if _clamp is not None else dc._clamp
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3800
33722
74a57e6684f3 Don't use mutable values for method defaults.
Raymond Hettinger <python@rcn.com>
parents: 33695
diff changeset
3801 if _ignored_flags is None:
62872
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3802 self._ignored_flags = []
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3803 else:
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3804 self._ignored_flags = _ignored_flags
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3805
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3806 if traps is None:
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3807 self.traps = dc.traps.copy()
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3808 elif not isinstance(traps, dict):
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3809 self.traps = dict((s, int(s in traps)) for s in _signals)
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3810 else:
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3811 self.traps = traps
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3812
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3813 if flags is None:
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3814 self.flags = dict.fromkeys(_signals, 0)
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3815 elif not isinstance(flags, dict):
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3816 self.flags = dict((s, int(s in flags)) for s in _signals)
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3817 else:
974f8d8bc0d4 Issue #9136: Fix 'dictionary changed size during iteration'
Mark Dickinson <dickinsm@gmail.com>
parents: 62868
diff changeset
3818 self.flags = flags
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3819
32487
fa23a9b18967 Fix clear_flags(). Make a readable (not evalable) Context repr.
Raymond Hettinger <python@rcn.com>
parents: 32482
diff changeset
3820 def __repr__(self):
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
3821 """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
3822 s = []
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3823 s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3824 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3825 % vars(self))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3826 names = [f.__name__ for f, v in self.flags.items() if v]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3827 s.append('flags=[' + ', '.join(names) + ']')
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3828 names = [t.__name__ for t, v in self.traps.items() if v]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3829 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
3830 return ', '.join(s) + ')'
fa23a9b18967 Fix clear_flags(). Make a readable (not evalable) Context repr.
Raymond Hettinger <python@rcn.com>
parents: 32482
diff changeset
3831
32477
bc586db9945a Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents: 32456
diff changeset
3832 def clear_flags(self):
bc586db9945a Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents: 32456
diff changeset
3833 """Reset all flags to zero"""
bc586db9945a Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents: 32456
diff changeset
3834 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
3835 self.flags[flag] = 0
32477
bc586db9945a Work through several open todos:
Raymond Hettinger <python@rcn.com>
parents: 32456
diff changeset
3836
33044
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
3837 def _shallow_copy(self):
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
3838 """Returns a shallow copy from self."""
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3839 nc = Context(self.prec, self.rounding, self.traps,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3840 self.flags, self.Emin, self.Emax,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3841 self.capitals, self._clamp, self._ignored_flags)
33044
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
3842 return nc
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
3843
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3844 def copy(self):
33044
2749334d71a4 * Context.copy() now makes a deepcopy.
Raymond Hettinger <python@rcn.com>
parents: 32980
diff changeset
3845 """Returns a deep copy from self."""
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3846 nc = Context(self.prec, self.rounding, self.traps.copy(),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3847 self.flags.copy(), self.Emin, self.Emax,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3848 self.capitals, self._clamp, self._ignored_flags)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3849 return nc
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3850 __copy__ = copy
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3851
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
3852 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
3853 """Handles an error
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3854
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3855 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
3856 Otherwise, it sets the flag, then, if the corresponding
61744
68525ef36b66 Merged revisions 81350 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61212
diff changeset
3857 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
3858 the default value after setting the flag.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3859 """
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
3860 error = _condition_map.get(condition, condition)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3861 if error in self._ignored_flags:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3862 # Don't touch the flag
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3863 return error().handle(self, *args)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3864
46643
ec09ad5bed1a Backport Raymond's changes in r60508 to Python 2.6.
Mark Dickinson <dickinsm@gmail.com>
parents: 46625
diff changeset
3865 self.flags[error] = 1
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
3866 if not self.traps[error]:
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3867 # The errors define how to handle themselves.
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
3868 return condition().handle(self, *args)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3869
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3870 # Errors should only be risked on copies of the context
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3871 # 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
3872 raise error(explanation)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3873
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3874 def _ignore_all_flags(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3875 """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
3876 return self._ignore_flags(*_signals)
32451
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 def _ignore_flags(self, *flags):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3879 """Ignore the flags, if they are raised"""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3880 # 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
3881 # alone.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3882 self._ignored_flags = (self._ignored_flags + list(flags))
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3883 return list(flags)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3884
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3885 def _regard_flags(self, *flags):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3886 """Stop ignoring the flags, if they are raised"""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3887 if flags and isinstance(flags[0], (tuple,list)):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3888 flags = flags[0]
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3889 for flag in flags:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3890 self._ignored_flags.remove(flag)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3891
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
3892 # 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
3893 __hash__ = None
32560
e4b96c3a3e12 Module and tests:
Raymond Hettinger <python@rcn.com>
parents: 32529
diff changeset
3894
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3895 def Etiny(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3896 """Returns Etiny (= Emin - prec + 1)"""
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3897 return int(self.Emin - self.prec + 1)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3898
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3899 def Etop(self):
32496
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
3900 """Returns maximum exponent (= Emax - prec + 1)"""
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3901 return int(self.Emax - self.prec + 1)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3902
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3903 def _set_rounding(self, type):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3904 """Sets the rounding type.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3905
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3906 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
3907 rounding type. Often used like:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3908
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3909 context = context.copy()
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3910 # so you don't change the calling context
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3911 # if an error occurs in the middle.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3912 rounding = context._set_rounding(ROUND_UP)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3913 val = self.__sub__(other, context=context)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3914 context._set_rounding(rounding)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3915
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3916 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
3917 """
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3918 rounding = self.rounding
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3919 self.rounding= type
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3920 return rounding
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3921
32666
c13d911ae05b * Rename "Signals" to "_signals" making it non-public.
Raymond Hettinger <python@rcn.com>
parents: 32576
diff changeset
3922 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
3923 """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
3924
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3925 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
3926 IBM Decimal specification."""
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3927
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3928 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
3929 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
3930 "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
3931 "permitted.")
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
3932
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3933 d = Decimal(num, context=self)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3934 if d._isnan() and len(d._int) > self.prec - self._clamp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3935 return self._raise_error(ConversionSyntax,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3936 "diagnostic info too long in NaN")
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
3937 return d._fix(self)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3938
50496
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3939 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
3940 """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
3941 as the context.
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3942
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3943 >>> 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
3944 >>> 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
3945 Decimal('3.1415')
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3946 >>> 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
3947 >>> 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
3948 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
3949 ...
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3950 Inexact: None
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3951
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3952 """
7a6e3bc60ba6 Issue 4796: Add from_float methods to the decimal module.
Raymond Hettinger <python@rcn.com>
parents: 50480
diff changeset
3953 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
3954 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
3955
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3956 # Methods
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3957 def abs(self, a):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3958 """Returns the absolute value of the operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3959
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3960 If the operand is negative, the result is the same as using the minus
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
3961 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
3962 the plus operation on the operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3963
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3964 >>> 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
3965 Decimal('2.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3966 >>> 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
3967 Decimal('100')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3968 >>> 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
3969 Decimal('101.5')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3970 >>> 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
3971 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
3972 >>> ExtendedContext.abs(-1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3973 Decimal('1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3974 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3975 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3976 return a.__abs__(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3977
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3978 def add(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3979 """Return the sum of the two operands.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3980
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3981 >>> 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
3982 Decimal('19.00')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
3983 >>> 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
3984 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
3985 >>> 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
3986 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3987 >>> 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
3988 Decimal('13')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3989 >>> 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
3990 Decimal('10')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3991 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3992 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
3993 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
3994 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
3995 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
3996 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
3997 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3998
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
3999 def _apply(self, a):
33695
924bb2aad4f4 SF patch #1043218
Raymond Hettinger <python@rcn.com>
parents: 33596
diff changeset
4000 return str(a._fix(self))
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4001
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4002 def canonical(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4003 """Returns the same Decimal object.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4004
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4005 As we do not have different encodings for the same number, the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4006 received object already is in its canonical form.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4007
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4008 >>> 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
4009 Decimal('2.50')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4010 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4011 return a.canonical(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4012
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4013 def compare(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4014 """Compares values numerically.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4015
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4016 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
4017 ('-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
4018 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
4019 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
4020 operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4021
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4022 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
4023 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
4024 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
4025 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
4026
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4027 >>> 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
4028 Decimal('-1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4029 >>> 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
4030 Decimal('0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4031 >>> 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
4032 Decimal('0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4033 >>> 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
4034 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4035 >>> 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
4036 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4037 >>> 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
4038 Decimal('-1')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4039 >>> 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
4040 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4041 >>> 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
4042 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4043 >>> 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
4044 Decimal('-1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4045 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4046 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4047 return a.compare(b, context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4048
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4049 def compare_signal(self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4050 """Compares the values of the two operands numerically.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4051
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4052 It's pretty much like compare(), but all NaNs signal, with signaling
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4053 NaNs taking precedence over quiet NaNs.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4054
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4055 >>> c = ExtendedContext
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4056 >>> 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
4057 Decimal('-1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4058 >>> 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
4059 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4060 >>> c.flags[InvalidOperation] = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4061 >>> print c.flags[InvalidOperation]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4062 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4063 >>> 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
4064 Decimal('NaN')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4065 >>> print c.flags[InvalidOperation]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4066 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4067 >>> c.flags[InvalidOperation] = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4068 >>> print c.flags[InvalidOperation]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4069 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4070 >>> 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
4071 Decimal('NaN')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4072 >>> print c.flags[InvalidOperation]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4073 1
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4074 >>> 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
4075 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4076 >>> 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
4077 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4078 >>> 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
4079 Decimal('-1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4080 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4081 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4082 return a.compare_signal(b, context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4083
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4084 def compare_total(self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4085 """Compares two operands using their abstract representation.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4086
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4087 This is not like the standard compare, which use their numerical
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4088 value. Note that a total ordering is defined for all possible abstract
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4089 representations.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4090
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4091 >>> 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
4092 Decimal('-1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4093 >>> 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
4094 Decimal('-1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4095 >>> 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
4096 Decimal('-1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4097 >>> 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
4098 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4099 >>> 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
4100 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4101 >>> 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
4102 Decimal('-1')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4103 >>> 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
4104 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4105 >>> 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
4106 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4107 >>> 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
4108 Decimal('-1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4109 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4110 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4111 return a.compare_total(b)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4112
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4113 def compare_total_mag(self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4114 """Compares two operands using their abstract representation ignoring sign.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4115
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4116 Like compare_total, but with operand's sign ignored and assumed to be 0.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4117 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4118 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4119 return a.compare_total_mag(b)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4120
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4121 def copy_abs(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4122 """Returns a copy of the operand with the sign set to 0.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4123
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4124 >>> 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
4125 Decimal('2.1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4126 >>> 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
4127 Decimal('100')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4128 >>> 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
4129 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4130 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4131 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4132 return a.copy_abs()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4133
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4134 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
4135 """Returns a copy of the decimal object.
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4136
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4137 >>> 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
4138 Decimal('2.1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4139 >>> 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
4140 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
4141 >>> 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
4142 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4143 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4144 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4145 return Decimal(a)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4146
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4147 def copy_negate(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4148 """Returns a copy of the operand with the sign inverted.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4149
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4150 >>> 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
4151 Decimal('-101.5')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4152 >>> 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
4153 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
4154 >>> 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
4155 Decimal('-1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4156 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4157 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4158 return a.copy_negate()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4159
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4160 def copy_sign(self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4161 """Copies the second operand's sign to the first one.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4162
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4163 In detail, it returns a copy of the first operand with the sign
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4164 equal to the sign of the second operand.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4165
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4166 >>> 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
4167 Decimal('1.50')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4168 >>> 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
4169 Decimal('1.50')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4170 >>> 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
4171 Decimal('-1.50')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4172 >>> 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
4173 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
4174 >>> 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
4175 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4176 >>> 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
4177 Decimal('-1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4178 >>> 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
4179 Decimal('-1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4180 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4181 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4182 return a.copy_sign(b)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4183
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4184 def divide(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4185 """Decimal division in a specified context.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4186
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4187 >>> 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
4188 Decimal('0.333333333')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4189 >>> 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
4190 Decimal('0.666666667')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4191 >>> 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
4192 Decimal('2.5')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4193 >>> 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
4194 Decimal('0.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4195 >>> 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
4196 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4197 >>> 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
4198 Decimal('4.00')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4199 >>> 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
4200 Decimal('1.20')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4201 >>> 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
4202 Decimal('10')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4203 >>> 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
4204 Decimal('1000')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4205 >>> 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
4206 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
4207 >>> 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
4208 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4209 >>> 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
4210 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4211 >>> 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
4212 Decimal('1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4213 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4214 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
4215 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
4216 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
4217 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
4218 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4219 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4220
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4221 def divide_int(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4222 """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
4223
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4224 >>> 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
4225 Decimal('0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4226 >>> 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
4227 Decimal('3')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4228 >>> 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
4229 Decimal('3')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4230 >>> 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
4231 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4232 >>> 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
4233 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4234 >>> 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
4235 Decimal('3')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4236 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4237 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
4238 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
4239 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
4240 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
4241 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4242 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4243
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4244 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
4245 """Return (a // b, a % b).
58169
86bf440bf9bf Merged revisions 77324 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56971
diff changeset
4246
86bf440bf9bf Merged revisions 77324 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56971
diff changeset
4247 >>> ExtendedContext.divmod(Decimal(8), Decimal(3))
86bf440bf9bf Merged revisions 77324 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56971
diff changeset
4248 (Decimal('2'), Decimal('2'))
86bf440bf9bf Merged revisions 77324 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56971
diff changeset
4249 >>> ExtendedContext.divmod(Decimal(8), Decimal(4))
86bf440bf9bf Merged revisions 77324 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56971
diff changeset
4250 (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
4251 >>> 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
4252 (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
4253 >>> 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
4254 (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
4255 >>> 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
4256 (Decimal('2'), Decimal('0'))
58169
86bf440bf9bf Merged revisions 77324 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 56971
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)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4259 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
4260 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
4261 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
4262 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4263 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4264
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4265 def exp(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4266 """Returns e ** a.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4267
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4268 >>> c = ExtendedContext.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4269 >>> c.Emin = -999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4270 >>> c.Emax = 999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4271 >>> 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
4272 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4273 >>> 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
4274 Decimal('0.367879441')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4275 >>> 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
4276 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4277 >>> 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
4278 Decimal('2.71828183')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4279 >>> 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
4280 Decimal('2.00000000')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4281 >>> 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
4282 Decimal('Infinity')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4283 >>> c.exp(10)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4284 Decimal('22026.4658')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4285 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4286 a =_convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4287 return a.exp(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4288
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4289 def fma(self, a, b, c):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4290 """Returns a multiplied by b, plus c.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4291
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4292 The first two operands are multiplied together, using multiply,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4293 the third operand is then added to the result of that
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4294 multiplication, using add, all with only one final rounding.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4295
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4296 >>> 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
4297 Decimal('22')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4298 >>> 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
4299 Decimal('-8')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4300 >>> 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
4301 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
4302 >>> 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
4303 Decimal('7')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4304 >>> 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
4305 Decimal('7')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4306 >>> 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
4307 Decimal('7')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4308 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4309 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4310 return a.fma(b, c, context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4311
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4312 def is_canonical(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4313 """Return True if the operand is canonical; otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4314
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4315 Currently, the encoding of a Decimal instance is always
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4316 canonical, so this method returns True for any Decimal.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4317
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4318 >>> ExtendedContext.is_canonical(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4319 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4320 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4321 return a.is_canonical()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4322
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4323 def is_finite(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4324 """Return True if the operand is finite; otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4325
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4326 A Decimal instance is considered finite if it is neither
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4327 infinite nor a NaN.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4328
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4329 >>> ExtendedContext.is_finite(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4330 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4331 >>> ExtendedContext.is_finite(Decimal('-0.3'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4332 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4333 >>> ExtendedContext.is_finite(Decimal('0'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4334 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4335 >>> ExtendedContext.is_finite(Decimal('Inf'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4336 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4337 >>> ExtendedContext.is_finite(Decimal('NaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4338 False
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4339 >>> 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
4340 True
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4341 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4342 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4343 return a.is_finite()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4344
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4345 def is_infinite(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4346 """Return True if the operand is infinite; otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4347
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4348 >>> ExtendedContext.is_infinite(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4349 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4350 >>> ExtendedContext.is_infinite(Decimal('-Inf'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4351 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4352 >>> ExtendedContext.is_infinite(Decimal('NaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4353 False
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4354 >>> 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
4355 False
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4356 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4357 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4358 return a.is_infinite()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4359
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4360 def is_nan(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4361 """Return True if the operand is a qNaN or sNaN;
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4362 otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4363
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4364 >>> ExtendedContext.is_nan(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4365 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4366 >>> ExtendedContext.is_nan(Decimal('NaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4367 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4368 >>> ExtendedContext.is_nan(Decimal('-sNaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4369 True
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4370 >>> 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
4371 False
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4372 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4373 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4374 return a.is_nan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4375
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4376 def is_normal(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4377 """Return True if the operand is a normal number;
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4378 otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4379
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4380 >>> c = ExtendedContext.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4381 >>> c.Emin = -999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4382 >>> c.Emax = 999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4383 >>> c.is_normal(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4384 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4385 >>> c.is_normal(Decimal('0.1E-999'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4386 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4387 >>> c.is_normal(Decimal('0.00'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4388 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4389 >>> c.is_normal(Decimal('-Inf'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4390 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4391 >>> c.is_normal(Decimal('NaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4392 False
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4393 >>> 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
4394 True
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4395 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4396 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4397 return a.is_normal(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4398
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4399 def is_qnan(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4400 """Return True if the operand is a quiet NaN; otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4401
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4402 >>> ExtendedContext.is_qnan(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4403 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4404 >>> ExtendedContext.is_qnan(Decimal('NaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4405 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4406 >>> ExtendedContext.is_qnan(Decimal('sNaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4407 False
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4408 >>> 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
4409 False
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4410 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4411 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4412 return a.is_qnan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4413
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4414 def is_signed(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4415 """Return True if the operand is negative; otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4416
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4417 >>> ExtendedContext.is_signed(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4418 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4419 >>> ExtendedContext.is_signed(Decimal('-12'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4420 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4421 >>> ExtendedContext.is_signed(Decimal('-0'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4422 True
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4423 >>> 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
4424 False
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4425 >>> 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
4426 True
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4427 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4428 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4429 return a.is_signed()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4430
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4431 def is_snan(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4432 """Return True if the operand is a signaling NaN;
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4433 otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4434
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4435 >>> ExtendedContext.is_snan(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4436 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4437 >>> ExtendedContext.is_snan(Decimal('NaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4438 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4439 >>> ExtendedContext.is_snan(Decimal('sNaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4440 True
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4441 >>> 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
4442 False
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4443 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4444 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4445 return a.is_snan()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4446
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4447 def is_subnormal(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4448 """Return True if the operand is subnormal; otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4449
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4450 >>> c = ExtendedContext.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4451 >>> c.Emin = -999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4452 >>> c.Emax = 999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4453 >>> c.is_subnormal(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4454 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4455 >>> c.is_subnormal(Decimal('0.1E-999'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4456 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4457 >>> c.is_subnormal(Decimal('0.00'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4458 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4459 >>> c.is_subnormal(Decimal('-Inf'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4460 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4461 >>> c.is_subnormal(Decimal('NaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4462 False
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4463 >>> 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
4464 False
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4465 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4466 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4467 return a.is_subnormal(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4468
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4469 def is_zero(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4470 """Return True if the operand is a zero; otherwise return False.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4471
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4472 >>> ExtendedContext.is_zero(Decimal('0'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4473 True
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4474 >>> ExtendedContext.is_zero(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4475 False
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4476 >>> ExtendedContext.is_zero(Decimal('-0E+2'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4477 True
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4478 >>> 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
4479 False
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4480 >>> 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
4481 True
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4482 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4483 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4484 return a.is_zero()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4485
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4486 def ln(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4487 """Returns the natural (base e) logarithm of the operand.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4488
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4489 >>> c = ExtendedContext.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4490 >>> c.Emin = -999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4491 >>> c.Emax = 999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4492 >>> 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
4493 Decimal('-Infinity')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4494 >>> 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
4495 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4496 >>> 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
4497 Decimal('1.00000000')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4498 >>> 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
4499 Decimal('2.30258509')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4500 >>> 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
4501 Decimal('Infinity')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4502 >>> c.ln(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')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
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)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4506 return a.ln(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4507
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4508 def log10(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4509 """Returns the base 10 logarithm of the operand.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4510
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4511 >>> c = ExtendedContext.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4512 >>> c.Emin = -999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4513 >>> c.Emax = 999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4514 >>> 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
4515 Decimal('-Infinity')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4516 >>> 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
4517 Decimal('-3')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4518 >>> 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
4519 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4520 >>> 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
4521 Decimal('0.301029996')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4522 >>> 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
4523 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4524 >>> 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
4525 Decimal('1.84509804')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4526 >>> 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
4527 Decimal('Infinity')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4528 >>> c.log10(0)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4529 Decimal('-Infinity')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4530 >>> c.log10(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4531 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4532 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4533 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4534 return a.log10(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4535
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4536 def logb(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4537 """ Returns the exponent of the magnitude of the operand's MSD.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4538
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4539 The result is the integer which is the exponent of the magnitude
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4540 of the most significant digit of the operand (as though the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4541 operand were truncated to a single digit while maintaining the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4542 value of that digit and without limiting the resulting exponent).
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4543
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4544 >>> 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
4545 Decimal('2')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4546 >>> 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
4547 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4548 >>> 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
4549 Decimal('-2')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4550 >>> 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
4551 Decimal('-Infinity')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4552 >>> ExtendedContext.logb(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4553 Decimal('0')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4554 >>> ExtendedContext.logb(10)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4555 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4556 >>> ExtendedContext.logb(100)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4557 Decimal('2')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4558 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4559 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4560 return a.logb(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4561
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4562 def logical_and(self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4563 """Applies the logical operation 'and' between each operand's digits.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4564
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4565 The operands must be both logical numbers.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4566
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4567 >>> 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
4568 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4569 >>> 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
4570 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4571 >>> 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
4572 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4573 >>> 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
4574 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4575 >>> 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
4576 Decimal('1000')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4577 >>> 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
4578 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
4579 >>> 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
4580 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
4581 >>> 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
4582 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
4583 >>> 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
4584 Decimal('100')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4585 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4586 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4587 return a.logical_and(b, context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4588
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4589 def logical_invert(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4590 """Invert all the digits in the operand.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4591
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4592 The operand must be a logical number.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4593
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4594 >>> 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
4595 Decimal('111111111')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4596 >>> 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
4597 Decimal('111111110')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4598 >>> 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
4599 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4600 >>> 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
4601 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
4602 >>> 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
4603 Decimal('111110010')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4604 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4605 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4606 return a.logical_invert(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4607
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4608 def logical_or(self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4609 """Applies the logical operation 'or' between each operand's digits.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4610
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4611 The operands must be both logical numbers.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4612
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4613 >>> 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
4614 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4615 >>> 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
4616 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4617 >>> 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
4618 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4619 >>> 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
4620 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4621 >>> 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
4622 Decimal('1110')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4623 >>> 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
4624 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
4625 >>> 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
4626 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
4627 >>> 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
4628 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
4629 >>> 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
4630 Decimal('1111')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4631 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4632 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4633 return a.logical_or(b, context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4634
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4635 def logical_xor(self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4636 """Applies the logical operation 'xor' between each operand's digits.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4637
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4638 The operands must be both logical numbers.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4639
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4640 >>> 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
4641 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4642 >>> 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
4643 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4644 >>> 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
4645 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4646 >>> 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
4647 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4648 >>> 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
4649 Decimal('110')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4650 >>> 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
4651 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
4652 >>> 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
4653 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
4654 >>> 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
4655 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
4656 >>> 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
4657 Decimal('1011')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4658 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4659 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4660 return a.logical_xor(b, context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4661
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4662 def max(self, a, b):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4663 """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
4664
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4665 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
4666 Otherwise, the operands are compared as though by the compare
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4667 operation. If they are numerically equal then the left-hand operand
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4668 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
4669 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
4670
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4671 >>> 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
4672 Decimal('3')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4673 >>> 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
4674 Decimal('3')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4675 >>> 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
4676 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
4677 >>> 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
4678 Decimal('7')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4679 >>> 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
4680 Decimal('2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4681 >>> 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
4682 Decimal('2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4683 >>> 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
4684 Decimal('2')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4685 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4686 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4687 return a.max(b, context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4688
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4689 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
4690 """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
4691
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4692 >>> 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
4693 Decimal('7')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4694 >>> 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
4695 Decimal('-10')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4696 >>> 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
4697 Decimal('-2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4698 >>> 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
4699 Decimal('-2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4700 >>> 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
4701 Decimal('-2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4702 """
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4703 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4704 return a.max_mag(b, context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4705
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4706 def min(self, a, b):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4707 """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
4708
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4709 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
4710 Otherwise, the operands are compared as though by the compare
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4711 operation. If they are numerically equal then the left-hand operand
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4712 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
4713 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
4714
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4715 >>> 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
4716 Decimal('2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4717 >>> 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
4718 Decimal('-10')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4719 >>> 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
4720 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
4721 >>> 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
4722 Decimal('7')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4723 >>> 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
4724 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4725 >>> 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
4726 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4727 >>> 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
4728 Decimal('1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4729 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4730 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4731 return a.min(b, context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4732
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4733 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
4734 """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
4735
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4736 >>> 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
4737 Decimal('-2')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4738 >>> 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
4739 Decimal('-3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4740 >>> 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
4741 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4742 >>> 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
4743 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4744 >>> 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
4745 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4746 """
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4747 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4748 return a.min_mag(b, context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4749
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4750 def minus(self, a):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4751 """Minus corresponds to unary prefix minus in Python.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4752
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4753 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
4754 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
4755 has the same exponent as the operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4756
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4757 >>> 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
4758 Decimal('-1.3')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4759 >>> 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
4760 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
4761 >>> ExtendedContext.minus(1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4762 Decimal('-1')
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)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4765 return a.__neg__(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4766
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4767 def multiply(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4768 """multiply multiplies two operands.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4769
39120
1d7da8608031 Revert r50706 (Whitespace normalization) and
Martin v. Löwis <martin@v.loewis.de>
parents: 39117
diff changeset
4770 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
4771 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
4772 ('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
4773 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
4774
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4775 >>> 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
4776 Decimal('3.60')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4777 >>> 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
4778 Decimal('21')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4779 >>> 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
4780 Decimal('0.72')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4781 >>> 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
4782 Decimal('-0.0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4783 >>> 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
4784 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
4785 >>> 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
4786 Decimal('49')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4787 >>> 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
4788 Decimal('49')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4789 >>> 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
4790 Decimal('49')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4791 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4792 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
4793 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
4794 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
4795 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
4796 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4797 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4798
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4799 def next_minus(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4800 """Returns the largest representable number smaller than a.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4801
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4802 >>> c = ExtendedContext.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4803 >>> c.Emin = -999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4804 >>> c.Emax = 999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4805 >>> 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
4806 Decimal('0.999999999')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4807 >>> 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
4808 Decimal('0E-1007')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4809 >>> 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
4810 Decimal('-1.00000004')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4811 >>> 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
4812 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
4813 >>> 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
4814 Decimal('0.999999999')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4815 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4816 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4817 return a.next_minus(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4818
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4819 def next_plus(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4820 """Returns the smallest representable number larger than a.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4821
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4822 >>> c = ExtendedContext.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4823 >>> c.Emin = -999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4824 >>> c.Emax = 999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4825 >>> 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
4826 Decimal('1.00000001')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4827 >>> 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
4828 Decimal('-0E-1007')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4829 >>> 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
4830 Decimal('-1.00000002')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4831 >>> 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
4832 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
4833 >>> 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
4834 Decimal('1.00000001')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4835 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4836 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4837 return a.next_plus(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4838
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4839 def next_toward(self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4840 """Returns the number closest to a, in direction towards b.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4841
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4842 The result is the closest representable number from the first
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4843 operand (but not the first operand) that is in the direction
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4844 towards the second operand, unless the operands have the same
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4845 value.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4846
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4847 >>> c = ExtendedContext.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4848 >>> c.Emin = -999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4849 >>> c.Emax = 999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4850 >>> 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
4851 Decimal('1.00000001')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4852 >>> 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
4853 Decimal('-0E-1007')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4854 >>> 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
4855 Decimal('-1.00000002')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4856 >>> 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
4857 Decimal('0.999999999')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4858 >>> 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
4859 Decimal('0E-1007')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4860 >>> 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
4861 Decimal('-1.00000004')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4862 >>> 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
4863 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
4864 >>> 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
4865 Decimal('1E-1007')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4866 >>> 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
4867 Decimal('1E-1007')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4868 >>> 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
4869 Decimal('1E-1007')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4870 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4871 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4872 return a.next_toward(b, context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4873
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4874 def normalize(self, a):
32496
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
4875 """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
4876
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4877 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
4878 result.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4879
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4880 >>> 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
4881 Decimal('2.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4882 >>> 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
4883 Decimal('-2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4884 >>> 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
4885 Decimal('1.2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4886 >>> 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
4887 Decimal('-1.2E+2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4888 >>> 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
4889 Decimal('1.2E+2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4890 >>> 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
4891 Decimal('0')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4892 >>> ExtendedContext.normalize(6)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4893 Decimal('6')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4894 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4895 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4896 return a.normalize(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4897
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4898 def number_class(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4899 """Returns an indication of the class of the operand.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4900
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4901 The class is one of the following strings:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4902 -sNaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4903 -NaN
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4904 -Infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4905 -Normal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4906 -Subnormal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4907 -Zero
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4908 +Zero
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4909 +Subnormal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4910 +Normal
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4911 +Infinity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4912
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4913 >>> c = Context(ExtendedContext)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4914 >>> c.Emin = -999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4915 >>> c.Emax = 999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4916 >>> c.number_class(Decimal('Infinity'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4917 '+Infinity'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4918 >>> c.number_class(Decimal('1E-10'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4919 '+Normal'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4920 >>> c.number_class(Decimal('2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4921 '+Normal'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4922 >>> c.number_class(Decimal('0.1E-999'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4923 '+Subnormal'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4924 >>> c.number_class(Decimal('0'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4925 '+Zero'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4926 >>> c.number_class(Decimal('-0'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4927 '-Zero'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4928 >>> c.number_class(Decimal('-0.1E-999'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4929 '-Subnormal'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4930 >>> c.number_class(Decimal('-1E-10'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4931 '-Normal'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4932 >>> c.number_class(Decimal('-2.50'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4933 '-Normal'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4934 >>> c.number_class(Decimal('-Infinity'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4935 '-Infinity'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4936 >>> c.number_class(Decimal('NaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4937 'NaN'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4938 >>> c.number_class(Decimal('-NaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4939 'NaN'
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4940 >>> c.number_class(Decimal('sNaN'))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4941 'sNaN'
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4942 >>> 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
4943 '+Normal'
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4944 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4945 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4946 return a.number_class(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4947
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4948 def plus(self, a):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4949 """Plus corresponds to unary prefix plus in Python.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4950
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4951 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
4952 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
4953 has the same exponent as the operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4954
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4955 >>> 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
4956 Decimal('1.3')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
4957 >>> 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
4958 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
4959 >>> ExtendedContext.plus(-1)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4960 Decimal('-1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4961 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
4962 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4963 return a.__pos__(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4964
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4965 def power(self, a, b, modulo=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
4966 """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
4967
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4968 With two arguments, compute a**b. If a is negative then b
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4969 must be integral. The result will be inexact unless b is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4970 integral and the result is finite and can be expressed exactly
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4971 in 'precision' digits.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4972
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4973 With three arguments, compute (a**b) % modulo. For the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4974 three argument form, the following restrictions on the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4975 arguments hold:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4976
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4977 - all three arguments must be integral
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4978 - b must be nonnegative
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4979 - at least one of a or b must be nonzero
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4980 - modulo must be nonzero and have at most 'precision' digits
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4981
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4982 The result of pow(a, b, modulo) is identical to the result
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4983 that would be obtained by computing (a**b) % modulo with
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4984 unbounded precision, but is computed more efficiently. It is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4985 always exact.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4986
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4987 >>> c = ExtendedContext.copy()
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4988 >>> c.Emin = -999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4989 >>> c.Emax = 999
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4990 >>> 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
4991 Decimal('8')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4992 >>> 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
4993 Decimal('-8')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4994 >>> 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
4995 Decimal('0.125')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4996 >>> 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
4997 Decimal('69.7575744')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
4998 >>> 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
4999 Decimal('2.00000000')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5000 >>> 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
5001 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5002 >>> 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
5003 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5004 >>> 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
5005 Decimal('Infinity')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5006 >>> 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
5007 Decimal('-0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5008 >>> 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
5009 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5010 >>> 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
5011 Decimal('-Infinity')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5012 >>> 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
5013 Decimal('Infinity')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5014 >>> 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
5015 Decimal('NaN')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5016
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5017 >>> 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
5018 Decimal('11')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5019 >>> 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
5020 Decimal('-11')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5021 >>> 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
5022 Decimal('1')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5023 >>> 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
5024 Decimal('11')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5025 >>> 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
5026 Decimal('11729830')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5027 >>> 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
5028 Decimal('-0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5029 >>> 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
5030 Decimal('1')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5031 >>> 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
5032 Decimal('823543')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5033 >>> 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
5034 Decimal('823543')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5035 >>> 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
5036 Decimal('1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5037 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5038 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
5039 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
5040 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
5041 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
5042 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5043 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5044
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5045 def quantize(self, a, b):
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5046 """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
5047
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5048 The coefficient of the result is derived from that of the left-hand
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5049 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
5050 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
5051 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
5052 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
5053
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5054 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
5055 quantize operation would be greater than precision then an Invalid
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5056 operation condition is raised. This guarantees that, unless there is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5057 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
5058 equal to that of the right-hand operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5059
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5060 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
5061 if the result is subnormal and inexact.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5062
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5063 >>> 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
5064 Decimal('2.170')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5065 >>> 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
5066 Decimal('2.17')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5067 >>> 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
5068 Decimal('2.2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5069 >>> 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
5070 Decimal('2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5071 >>> 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
5072 Decimal('0E+1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5073 >>> 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
5074 Decimal('-Infinity')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5075 >>> 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
5076 Decimal('NaN')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5077 >>> 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
5078 Decimal('-0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5079 >>> 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
5080 Decimal('-0E+5')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5081 >>> 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
5082 Decimal('NaN')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5083 >>> 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
5084 Decimal('NaN')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5085 >>> 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
5086 Decimal('217.0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5087 >>> 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
5088 Decimal('217')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5089 >>> 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
5090 Decimal('2.2E+2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5091 >>> 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
5092 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
5093 >>> 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
5094 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5095 >>> 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
5096 Decimal('1')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5097 >>> 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
5098 Decimal('1')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5099 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5100 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5101 return a.quantize(b, context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5102
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5103 def radix(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5104 """Just returns 10, as this is Decimal, :)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5105
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5106 >>> 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
5107 Decimal('10')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5108 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5109 return Decimal(10)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5110
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5111 def remainder(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5112 """Returns the remainder from integer division.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5113
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5114 The result is the residue of the dividend after the operation of
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5115 calculating integer division as described for divide-integer, rounded
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5116 to precision digits if necessary. The sign of the result, if
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5117 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
5118
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5119 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
5120 (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
5121 remainder cannot be calculated).
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5122
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5123 >>> 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
5124 Decimal('2.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5125 >>> 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
5126 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5127 >>> 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
5128 Decimal('-1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5129 >>> 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
5130 Decimal('0.2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5131 >>> 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
5132 Decimal('0.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5133 >>> 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
5134 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
5135 >>> 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
5136 Decimal('4')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5137 >>> 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
5138 Decimal('4')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5139 >>> 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
5140 Decimal('4')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5141 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5142 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
5143 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
5144 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
5145 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
5146 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5147 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5148
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5149 def remainder_near(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5150 """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
5151 value of "x / b" (if two integers are equally near then the even one
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5152 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
5153 sign of a.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5154
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5155 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
5156 (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
5157 remainder cannot be calculated).
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5158
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5159 >>> 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
5160 Decimal('-0.9')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5161 >>> 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
5162 Decimal('-2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5163 >>> 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
5164 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5165 >>> 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
5166 Decimal('-1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5167 >>> 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
5168 Decimal('0.2')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5169 >>> 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
5170 Decimal('0.1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5171 >>> 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
5172 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
5173 >>> 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
5174 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5175 >>> 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
5176 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5177 >>> 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
5178 Decimal('3')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5179 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5180 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5181 return a.remainder_near(b, context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5182
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5183 def rotate(self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5184 """Returns a rotated copy of a, b times.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5185
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5186 The coefficient of the result is a rotated copy of the digits in
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5187 the coefficient of the first operand. The number of places of
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5188 rotation is taken from the absolute value of the second operand,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5189 with the rotation being to the left if the second operand is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5190 positive or to the right otherwise.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5191
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5192 >>> 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
5193 Decimal('400000003')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5194 >>> 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
5195 Decimal('12')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5196 >>> 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
5197 Decimal('891234567')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5198 >>> 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
5199 Decimal('123456789')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5200 >>> 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
5201 Decimal('345678912')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5202 >>> 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
5203 Decimal('13333330')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5204 >>> 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
5205 Decimal('13333330')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5206 >>> 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
5207 Decimal('13333330')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5208 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5209 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5210 return a.rotate(b, context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5211
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5212 def same_quantum(self, a, b):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5213 """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
5214
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5215 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
5216 either operand.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5217
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5218 >>> 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
5219 False
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5220 >>> 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
5221 True
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5222 >>> 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
5223 False
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5224 >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5225 True
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5226 >>> 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
5227 True
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5228 >>> 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
5229 True
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5230 >>> 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
5231 True
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5232 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5233 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5234 return a.same_quantum(b)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5235
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5236 def scaleb (self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5237 """Returns the first operand after adding the second value its exp.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5238
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5239 >>> 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
5240 Decimal('0.0750')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5241 >>> 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
5242 Decimal('7.50')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5243 >>> 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
5244 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
5245 >>> 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
5246 Decimal('1E+4')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5247 >>> 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
5248 Decimal('1E+4')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5249 >>> 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
5250 Decimal('1E+4')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5251 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5252 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
5253 return a.scaleb(b, context=self)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5254
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5255 def shift(self, a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5256 """Returns a shifted copy of a, b times.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5257
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5258 The coefficient of the result is a shifted copy of the digits
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5259 in the coefficient of the first operand. The number of places
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5260 to shift is taken from the absolute value of the second operand,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5261 with the shift being to the left if the second operand is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5262 positive or to the right otherwise. Digits shifted into the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5263 coefficient are zeros.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5264
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5265 >>> 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
5266 Decimal('400000000')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5267 >>> 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
5268 Decimal('0')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5269 >>> 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
5270 Decimal('1234567')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5271 >>> 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
5272 Decimal('123456789')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5273 >>> 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
5274 Decimal('345678900')
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5275 >>> 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
5276 Decimal('888888800')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5277 >>> 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
5278 Decimal('888888800')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5279 >>> 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
5280 Decimal('888888800')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5281 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5282 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5283 return a.shift(b, context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5284
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5285 def sqrt(self, a):
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5286 """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
5287
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5288 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
5289 algorithm.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5290
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5291 >>> 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
5292 Decimal('0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5293 >>> 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
5294 Decimal('-0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5295 >>> 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
5296 Decimal('0.624499800')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5297 >>> 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
5298 Decimal('10')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5299 >>> 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
5300 Decimal('1')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5301 >>> 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
5302 Decimal('1.0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5303 >>> 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
5304 Decimal('1.0')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5305 >>> 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
5306 Decimal('2.64575131')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5307 >>> 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
5308 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
5309 >>> ExtendedContext.sqrt(2)
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5310 Decimal('1.41421356')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5311 >>> ExtendedContext.prec
32481
b835d5c61d86 * Make the tests independent of the default precision.
Raymond Hettinger <python@rcn.com>
parents: 32477
diff changeset
5312 9
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5313 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5314 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5315 return a.sqrt(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5316
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5317 def subtract(self, a, b):
35379
43211be0de41 bug [ 1266296 ] Mistakes in decimal.Context.subtract documentation
Georg Brandl <georg@python.org>
parents: 35113
diff changeset
5318 """Return the difference between the two operands.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5319
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5320 >>> 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
5321 Decimal('0.23')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5322 >>> 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
5323 Decimal('0.00')
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5324 >>> 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
5325 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
5326 >>> 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
5327 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5328 >>> 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
5329 Decimal('3')
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5330 >>> 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
5331 Decimal('3')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5332 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5333 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
5334 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
5335 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
5336 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
5337 else:
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5338 return r
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5339
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5340 def to_eng_string(self, a):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5341 """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
5342
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5343 The operation is not affected by the context.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5344 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5345 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5346 return a.to_eng_string(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5347
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5348 def to_sci_string(self, a):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5349 """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
5350
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5351 The operation is not affected by the context.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5352 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5353 a = _convert_other(a, raiseit=True)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5354 return a.__str__(context=self)
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5355
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5356 def to_integral_exact(self, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5357 """Rounds to an integer.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5358
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5359 When the operand has a negative exponent, the result is the same
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5360 as using the quantize() operation using the given operand as the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5361 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5362 of the operand as the precision setting; Inexact and Rounded flags
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5363 are allowed in this operation. The rounding mode is taken from the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5364 context.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5365
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5366 >>> 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
5367 Decimal('2')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5368 >>> 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
5369 Decimal('100')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5370 >>> 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
5371 Decimal('100')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5372 >>> 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
5373 Decimal('102')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5374 >>> 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
5375 Decimal('-102')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5376 >>> 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
5377 Decimal('1.0E+6')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5378 >>> 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
5379 Decimal('7.89E+77')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5380 >>> 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
5381 Decimal('-Infinity')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5382 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5383 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5384 return a.to_integral_exact(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5385
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5386 def to_integral_value(self, a):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5387 """Rounds to an integer.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5388
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5389 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
5390 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
5391 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
5392 of the operand as the precision setting, except that no flags will
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5393 be set. The rounding mode is taken from the context.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5394
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5395 >>> 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
5396 Decimal('2')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5397 >>> 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
5398 Decimal('100')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5399 >>> 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
5400 Decimal('100')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5401 >>> 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
5402 Decimal('102')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5403 >>> 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
5404 Decimal('-102')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5405 >>> 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
5406 Decimal('1.0E+6')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5407 >>> 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
5408 Decimal('7.89E+77')
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5409 >>> 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
5410 Decimal('-Infinity')
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5411 """
58934
e3d071233bef Issue #7633: Context method in the decimal module (with the exception
Mark Dickinson <dickinsm@gmail.com>
parents: 58485
diff changeset
5412 a = _convert_other(a, raiseit=True)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5413 return a.to_integral_value(context=self)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5414
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5415 # the method name changed, but we provide also the old one, for compatibility
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5416 to_integral = to_integral_value
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5417
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5418 class _WorkRep(object):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5419 __slots__ = ('sign','int','exp')
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5420 # sign: 0 or 1
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5421 # int: int or long
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5422 # exp: None, int, or string
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5423
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5424 def __init__(self, value=None):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5425 if value is None:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5426 self.sign = None
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5427 self.int = 0
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5428 self.exp = None
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5429 elif isinstance(value, Decimal):
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5430 self.sign = value._sign
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5431 self.int = int(value._int)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5432 self.exp = value._exp
33851
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5433 else:
2ee0301b483c SF patch #1053375.
Raymond Hettinger <python@rcn.com>
parents: 33845
diff changeset
5434 # assert isinstance(value, tuple)
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5435 self.sign = value[0]
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5436 self.int = value[1]
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5437 self.exp = value[2]
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5438
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5439 def __repr__(self):
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5440 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
5441
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5442 __str__ = __repr__
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5443
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5444
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5445
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5446 def _normalize(op1, op2, prec = 0):
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5447 """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
5448
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5449 Done during addition.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5450 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5451 if op1.exp < op2.exp:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5452 tmp = op2
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5453 other = op1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5454 else:
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5455 tmp = op1
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5456 other = op2
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5457
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5458 # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5459 # Then adding 10**exp to tmp has the same effect (after rounding)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5460 # as adding any positive quantity smaller than 10**exp; similarly
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5461 # for subtraction. So if other is smaller than 10**exp we replace
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5462 # it with 10**exp. This avoids tmp.exp - other.exp getting too large.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5463 tmp_len = len(str(tmp.int))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5464 other_len = len(str(other.int))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5465 exp = tmp.exp + min(-1, tmp_len - prec - 2)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5466 if other_len + other.exp - 1 < exp:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5467 other.int = 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5468 other.exp = exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5469
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5470 tmp.int *= 10 ** (tmp.exp - other.exp)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5471 tmp.exp = other.exp
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5472 return op1, op2
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5473
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5474 ##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5475
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5476 # This function from Tim Peters was taken from here:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5477 # http://mail.python.org/pipermail/python-list/1999-July/007758.html
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5478 # The correction being in the function definition is for speed, and
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5479 # the whole function is not resolved with math.log because of avoiding
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5480 # the use of floats.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5481 def _nbits(n, correction = {
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5482 '0': 4, '1': 3, '2': 2, '3': 2,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5483 '4': 1, '5': 1, '6': 1, '7': 1,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5484 '8': 0, '9': 0, 'a': 0, 'b': 0,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5485 'c': 0, 'd': 0, 'e': 0, 'f': 0}):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5486 """Number of bits in binary representation of the positive integer n,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5487 or 0 if n == 0.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5488 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5489 if n < 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5490 raise ValueError("The argument to _nbits should be nonnegative.")
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5491 hex_n = "%x" % n
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5492 return 4*len(hex_n) - correction[hex_n[0]]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5493
70637
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5494 def _decimal_lshift_exact(n, e):
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5495 """ Given integers n and e, return n * 10**e if it's an integer, else None.
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5496
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5497 The computation is designed to avoid computing large powers of 10
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5498 unnecessarily.
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5499
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5500 >>> _decimal_lshift_exact(3, 4)
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5501 30000
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5502 >>> _decimal_lshift_exact(300, -999999999) # returns None
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5503
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5504 """
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5505 if n == 0:
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5506 return 0
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5507 elif e >= 0:
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5508 return n * 10**e
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5509 else:
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5510 # val_n = largest power of 10 dividing n.
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5511 str_n = str(abs(n))
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5512 val_n = len(str_n) - len(str_n.rstrip('0'))
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5513 return None if val_n < -e else n // 10**-e
78d79499e7de Issue #12080: Fix a performance issue in Decimal._power_exact that caused some corner-case Decimal.__pow__ calls to take an unreasonably long time.
Mark Dickinson <mdickinson@enthought.com>
parents: 69271
diff changeset
5514
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5515 def _sqrt_nearest(n, a):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5516 """Closest integer to the square root of the positive integer n. a is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5517 an initial approximation to the square root. Any positive integer
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5518 will do for a, but the closer a is to the square root of n the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5519 faster convergence will be.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5520
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5521 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5522 if n <= 0 or a <= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5523 raise ValueError("Both arguments to _sqrt_nearest should be positive.")
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5524
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5525 b=0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5526 while a != b:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5527 b, a = a, a--n//a>>1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5528 return a
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5529
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5530 def _rshift_nearest(x, shift):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5531 """Given an integer x and a nonnegative integer shift, return closest
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5532 integer to x / 2**shift; use round-to-even in case of a tie.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5533
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5534 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5535 b, q = 1L << shift, x >> shift
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5536 return q + (2*(x & (b-1)) + (q&1) > b)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5537
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5538 def _div_nearest(a, b):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5539 """Closest integer to a/b, a and b positive integers; rounds to even
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5540 in the case of a tie.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5541
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5542 """
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5543 q, r = divmod(a, b)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5544 return q + (2*r + (q&1) > b)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5545
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5546 def _ilog(x, M, L = 8):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5547 """Integer approximation to M*log(x/M), with absolute error boundable
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5548 in terms only of x/M.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5549
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5550 Given positive integers x and M, return an integer approximation to
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5551 M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5552 between the approximation and the exact result is at most 22. For
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5553 L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5554 both cases these are upper bounds on the error; it will usually be
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5555 much smaller."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5556
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5557 # The basic algorithm is the following: let log1p be the function
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5558 # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5559 # the reduction
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5560 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5561 # log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5562 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5563 # repeatedly until the argument to log1p is small (< 2**-L in
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5564 # absolute value). For small y we can use the Taylor series
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5565 # expansion
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5566 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5567 # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5568 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5569 # truncating at T such that y**T is small enough. The whole
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5570 # computation is carried out in a form of fixed-point arithmetic,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5571 # with a real number z being represented by an integer
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5572 # approximation to z*M. To avoid loss of precision, the y below
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5573 # is actually an integer approximation to 2**R*y*M, where R is the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5574 # number of reductions performed so far.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5575
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5576 y = x-M
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5577 # argument reduction; R = number of reductions performed
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5578 R = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5579 while (R <= L and long(abs(y)) << L-R >= M or
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5580 R > L and abs(y) >> R-L >= M):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5581 y = _div_nearest(long(M*y) << 1,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5582 M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5583 R += 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5584
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5585 # Taylor series with T terms
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5586 T = -int(-10*len(str(M))//(3*L))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5587 yshift = _rshift_nearest(y, R)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5588 w = _div_nearest(M, T)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5589 for k in xrange(T-1, 0, -1):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5590 w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5591
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5592 return _div_nearest(w*y, M)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5593
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5594 def _dlog10(c, e, p):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5595 """Given integers c, e and p with c > 0, p >= 0, compute an integer
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5596 approximation to 10**p * log10(c*10**e), with an absolute error of
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5597 at most 1. Assumes that c*10**e is not exactly 1."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5598
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5599 # increase precision by 2; compensate for this by dividing
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5600 # final result by 100
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5601 p += 2
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5602
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5603 # write c*10**e as d*10**f with either:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5604 # f >= 0 and 1 <= d <= 10, or
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5605 # f <= 0 and 0.1 <= d <= 1.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5606 # Thus for c*10**e close to 1, f = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5607 l = len(str(c))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5608 f = e+l - (e+l >= 1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5609
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5610 if p > 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5611 M = 10**p
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5612 k = e+p-f
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5613 if k >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5614 c *= 10**k
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5615 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5616 c = _div_nearest(c, 10**-k)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5617
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5618 log_d = _ilog(c, M) # error < 5 + 22 = 27
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5619 log_10 = _log10_digits(p) # error < 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5620 log_d = _div_nearest(log_d*M, log_10)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5621 log_tenpower = f*M # exact
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5622 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5623 log_d = 0 # error < 2.31
48847
Neal Norwitz <nnorwitz@gmail.com>
parents: 47961
diff changeset
5624 log_tenpower = _div_nearest(f, 10**-p) # error < 0.5
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5625
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5626 return _div_nearest(log_tenpower+log_d, 100)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5627
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5628 def _dlog(c, e, p):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5629 """Given integers c, e and p with c > 0, compute an integer
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5630 approximation to 10**p * log(c*10**e), with an absolute error of
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5631 at most 1. Assumes that c*10**e is not exactly 1."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5632
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5633 # Increase precision by 2. The precision increase is compensated
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5634 # for at the end with a division by 100.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5635 p += 2
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5636
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5637 # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5638 # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5639 # as 10**p * log(d) + 10**p*f * log(10).
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5640 l = len(str(c))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5641 f = e+l - (e+l >= 1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5642
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5643 # compute approximation to 10**p*log(d), with error < 27
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5644 if p > 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5645 k = e+p-f
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5646 if k >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5647 c *= 10**k
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5648 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5649 c = _div_nearest(c, 10**-k) # error of <= 0.5 in c
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5650
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5651 # _ilog magnifies existing error in c by a factor of at most 10
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5652 log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5653 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5654 # p <= 0: just approximate the whole thing by 0; error < 2.31
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5655 log_d = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5656
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5657 # compute approximation to f*10**p*log(10), with error < 11.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5658 if f:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5659 extra = len(str(abs(f)))-1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5660 if p + extra >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5661 # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5662 # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5663 f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5664 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5665 f_log_ten = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5666 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5667 f_log_ten = 0
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5668
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5669 # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5670 return _div_nearest(f_log_ten + log_d, 100)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5671
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5672 class _Log10Memoize(object):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5673 """Class to compute, store, and allow retrieval of, digits of the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5674 constant log(10) = 2.302585.... This constant is needed by
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5675 Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5676 def __init__(self):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5677 self.digits = "23025850929940456840179914546843642076011014886"
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5678
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5679 def getdigits(self, p):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5680 """Given an integer p >= 0, return floor(10**p)*log(10).
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5681
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5682 For example, self.getdigits(3) returns 2302.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5683 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5684 # digits are stored as a string, for quick conversion to
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5685 # integer in the case that we've already computed enough
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5686 # digits; the stored digits should always be correct
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5687 # (truncated, not rounded to nearest).
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5688 if p < 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5689 raise ValueError("p should be nonnegative")
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5690
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5691 if p >= len(self.digits):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5692 # compute p+3, p+6, p+9, ... digits; continue until at
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5693 # least one of the extra digits is nonzero
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5694 extra = 3
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5695 while True:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5696 # compute p+extra digits, correct to within 1ulp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5697 M = 10**(p+extra+2)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5698 digits = str(_div_nearest(_ilog(10*M, M), 100))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5699 if digits[-extra:] != '0'*extra:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5700 break
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5701 extra += 3
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5702 # keep all reliable digits so far; remove trailing zeros
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5703 # and next nonzero digit
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5704 self.digits = digits.rstrip('0')[:-1]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5705 return int(self.digits[:p+1])
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5706
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5707 _log10_digits = _Log10Memoize().getdigits
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5708
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5709 def _iexp(x, M, L=8):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5710 """Given integers x and M, M > 0, such that x/M is small in absolute
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5711 value, compute an integer approximation to M*exp(x/M). For 0 <=
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5712 x/M <= 2.4, the absolute error in the result is bounded by 60 (and
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5713 is usually much smaller)."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5714
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5715 # Algorithm: to compute exp(z) for a real number z, first divide z
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5716 # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5717 # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5718 # series
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5719 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5720 # expm1(x) = x + x**2/2! + x**3/3! + ...
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5721 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5722 # Now use the identity
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5723 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5724 # expm1(2x) = expm1(x)*(expm1(x)+2)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5725 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5726 # R times to compute the sequence expm1(z/2**R),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5727 # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5728
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5729 # Find R such that x/2**R/M <= 2**-L
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5730 R = _nbits((long(x)<<L)//M)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5731
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5732 # Taylor series. (2**L)**T > M
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5733 T = -int(-10*len(str(M))//(3*L))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5734 y = _div_nearest(x, T)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5735 Mshift = long(M)<<R
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5736 for i in xrange(T-1, 0, -1):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5737 y = _div_nearest(x*(Mshift + y), Mshift * i)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5738
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5739 # Expansion
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5740 for k in xrange(R-1, -1, -1):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5741 Mshift = long(M)<<(k+2)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5742 y = _div_nearest(y*(y+Mshift), Mshift)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5743
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5744 return M+y
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5745
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5746 def _dexp(c, e, p):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5747 """Compute an approximation to exp(c*10**e), with p decimal places of
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5748 precision.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5749
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5750 Returns integers d, f such that:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5751
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5752 10**(p-1) <= d <= 10**p, and
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5753 (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5754
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5755 In other words, d*10**f is an approximation to exp(c*10**e) with p
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5756 digits of precision, and with an error in d of at most 1. This is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5757 almost, but not quite, the same as the error being < 1ulp: when d
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5758 = 10**(p-1) the error could be up to 10 ulp."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5759
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5760 # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5761 p += 2
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5762
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5763 # compute log(10) with extra precision = adjusted exponent of c*10**e
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5764 extra = max(0, e + len(str(c)) - 1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5765 q = p + extra
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5766
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5767 # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5768 # rounding down
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5769 shift = e+q
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5770 if shift >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5771 cshift = c*10**shift
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5772 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5773 cshift = c//10**-shift
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5774 quot, rem = divmod(cshift, _log10_digits(q))
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5775
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5776 # reduce remainder back to original precision
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5777 rem = _div_nearest(rem, 10**extra)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5778
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5779 # error in result of _iexp < 120; error after division < 0.62
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5780 return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5781
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5782 def _dpower(xc, xe, yc, ye, p):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5783 """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5784 y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5785
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5786 10**(p-1) <= c <= 10**p, and
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5787 (c-1)*10**e < x**y < (c+1)*10**e
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5788
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5789 in other words, c*10**e is an approximation to x**y with p digits
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5790 of precision, and with an error in c of at most 1. (This is
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5791 almost, but not quite, the same as the error being < 1ulp: when c
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5792 == 10**(p-1) we can only guarantee error < 10ulp.)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5793
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5794 We assume that: x is positive and not equal to 1, and y is nonzero.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5795 """
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5796
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5797 # Find b such that 10**(b-1) <= |y| <= 10**b
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5798 b = len(str(abs(yc))) + ye
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5799
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5800 # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5801 lxc = _dlog(xc, xe, p+b+1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5802
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5803 # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5804 shift = ye-b
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5805 if shift >= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5806 pc = lxc*yc*10**shift
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5807 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5808 pc = _div_nearest(lxc*yc, 10**-shift)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5809
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5810 if pc == 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5811 # we prefer a result that isn't exactly 1; this makes it
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5812 # easier to compute a correctly rounded result in __pow__
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5813 if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5814 coeff, exp = 10**(p-1)+1, 1-p
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5815 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5816 coeff, exp = 10**p-1, -p
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5817 else:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5818 coeff, exp = _dexp(pc, -(p+1), p+1)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5819 coeff = _div_nearest(coeff, 10)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5820 exp += 1
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5821
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5822 return coeff, exp
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5823
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5824 def _log10_lb(c, correction = {
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5825 '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5826 '6': 23, '7': 16, '8': 10, '9': 5}):
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5827 """Compute a lower bound for 100*log10(c) for a positive integer c."""
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5828 if c <= 0:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5829 raise ValueError("The argument to _log10_lb should be nonnegative.")
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5830 str_c = str(c)
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5831 return 100*len(str_c) - correction[str_c[0]]
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5832
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5833 ##### Helper Functions ####################################################
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5834
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
5835 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
5836 """Convert other to Decimal.
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5837
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5838 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
5839 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
5840 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
5841
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5842 """
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5843 if isinstance(other, Decimal):
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5844 return other
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5845 if isinstance(other, (int, long)):
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5846 return Decimal(other)
60151
1306033d8ad2 Issue #2531: Make float-to-decimal comparisons return correct results.
Mark Dickinson <dickinsm@gmail.com>
parents: 58935
diff changeset
5847 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
5848 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
5849
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5850 if raiseit:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5851 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
5852 return NotImplemented
33519
139a4012bead SF patch #1020845: Decimal performance enhancements
Raymond Hettinger <python@rcn.com>
parents: 33198
diff changeset
5853
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5854 ##### Setup Specific Contexts ############################################
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5855
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5856 # 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
5857 # 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
5858
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5859 DefaultContext = Context(
32481
b835d5c61d86 * Make the tests independent of the default precision.
Raymond Hettinger <python@rcn.com>
parents: 32477
diff changeset
5860 prec=28, rounding=ROUND_HALF_EVEN,
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5861 traps=[DivisionByZero, Overflow, InvalidOperation],
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5862 flags=[],
32674
3479610fb288 Factor out two unnecessary global variables.
Raymond Hettinger <python@rcn.com>
parents: 32667
diff changeset
5863 Emax=999999999,
3479610fb288 Factor out two unnecessary global variables.
Raymond Hettinger <python@rcn.com>
parents: 32667
diff changeset
5864 Emin=-999999999,
32496
9c87518faf6b * Fixup docstrings
Raymond Hettinger <python@rcn.com>
parents: 32489
diff changeset
5865 capitals=1
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5866 )
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5867
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5868 # Pre-made alternate contexts offered by the specification
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5869 # 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
5870 # 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
5871 # of the spec.
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5872
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5873 BasicContext = Context(
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5874 prec=9, rounding=ROUND_HALF_UP,
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5875 traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5876 flags=[],
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5877 )
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5878
32482
eccd0fbe0cd5 Namespace cleanups:
Raymond Hettinger <python@rcn.com>
parents: 32481
diff changeset
5879 ExtendedContext = Context(
32481
b835d5c61d86 * Make the tests independent of the default precision.
Raymond Hettinger <python@rcn.com>
parents: 32477
diff changeset
5880 prec=9, rounding=ROUND_HALF_EVEN,
32576
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5881 traps=[],
83cbc025bfc7 Improve Context construction and representation:
Raymond Hettinger <python@rcn.com>
parents: 32561
diff changeset
5882 flags=[],
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5883 )
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5884
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5885
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5886 ##### crud for parsing strings #############################################
45505
bf8ee593cbad Remove duplicate 'import re' in decimal.py
Mark Dickinson <dickinsm@gmail.com>
parents: 45321
diff changeset
5887 #
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5888 # Regular expression used for parsing numeric strings. Additional
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5889 # comments:
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5890 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5891 # 1. Uncomment the two '\s*' lines to allow leading and/or trailing
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5892 # whitespace. But note that the specification disallows whitespace in
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5893 # a numeric string.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5894 #
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5895 # 2. For finite numbers (not infinities and NaNs) the body of the
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5896 # number between the optional sign and the optional exponent must have
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5897 # at least one decimal digit, possibly after the decimal point. The
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5898 # lookahead expression '(?=\d|\.\d)' checks this.
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5899
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5900 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
5901 _parser = re.compile(r""" # A numeric string consists of:
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5902 # \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
5903 (?P<sign>[-+])? # an optional sign, followed by either...
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5904 (
55519
8b48b282eba9 Merged revisions 74281 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52189
diff changeset
5905 (?=\d|\.\d) # ...a number (with at least one digit)
8b48b282eba9 Merged revisions 74281 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52189
diff changeset
5906 (?P<int>\d*) # having a (possibly empty) integer part
8b48b282eba9 Merged revisions 74281 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52189
diff changeset
5907 (\.(?P<frac>\d*))? # followed by an optional fractional part
8b48b282eba9 Merged revisions 74281 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52189
diff changeset
5908 (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5909 |
47872
65af544da121 Replace occurrences of '\d' with '[0-9]' in Decimal regex, to make sure
Mark Dickinson <dickinsm@gmail.com>
parents: 46653
diff changeset
5910 Inf(inity)? # ...an infinity, or...
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5911 |
47872
65af544da121 Replace occurrences of '\d' with '[0-9]' in Decimal regex, to make sure
Mark Dickinson <dickinsm@gmail.com>
parents: 46653
diff changeset
5912 (?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
5913 NaN # NaN
55519
8b48b282eba9 Merged revisions 74281 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52189
diff changeset
5914 (?P<diag>\d*) # with (possibly empty) diagnostic info.
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5915 )
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5916 # \s*
44650
7b798548a4ad Issue 1780: Allow leading and trailing whitespace in Decimal constructor,
Mark Dickinson <dickinsm@gmail.com>
parents: 44631
diff changeset
5917 \Z
55519
8b48b282eba9 Merged revisions 74281 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52189
diff changeset
5918 """, re.VERBOSE | re.IGNORECASE | re.UNICODE).match
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5919
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5920 _all_zeros = re.compile('0*$').match
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
5921 _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
5922
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5923 ##### 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
5924 # 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
5925 # 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
5926 # 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
5927 #
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5928 # 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
5929 #
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5930 # [[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
5931
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5932 _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
5933 (?:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5934 (?P<fill>.)?
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5935 (?P<align>[<>=^])
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5936 )?
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5937 (?P<sign>[-+ ])?
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5938 (?P<zeropad>0)?
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5939 (?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
5940 (?P<thousands_sep>,)?
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5941 (?:\.(?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
5942 (?P<type>[eEfFgGn%])?
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5943 \Z
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5944 """, re.VERBOSE)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5945
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5946 del re
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
5947
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5948 # 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
5949 # 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
5950 # 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
5951 try:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5952 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
5953 except ImportError:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5954 pass
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5955
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5956 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
5957 """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
5958
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5959 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
5960 following entries:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5961
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5962 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
5963 align: alignment type, either '<', '>', '=' or '^'
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5964 sign: either '+', '-' or ' '
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5965 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
5966 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
5967 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
5968 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
5969 used by localeconv
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5970 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
5971 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
5972 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
5973 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
5974
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5975 """
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5976 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
5977 if m is None:
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5978 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
5979
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5980 # get the dictionary
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5981 format_dict = m.groupdict()
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5982
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
5983 # 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
5984 # 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
5985 fill = format_dict['fill']
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5986 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
5987 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
5988 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
5989 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
5990 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
5991 " 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
5992 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
5993 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
5994 "format specifier: " + format_spec)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
5995 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
5996 # 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
5997 # 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
5998 # 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
5999 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
6000
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6001 # 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
6002 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
6003 format_dict['sign'] = '-'
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6004
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6005 # 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
6006 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
6007 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
6008 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
6009
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6010 # 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
6011 # 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
6012 if format_dict['precision'] == 0:
55874
e895ef82c086 Merged revisions 74704 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55741
diff changeset
6013 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
6014 format_dict['precision'] = 1
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6015
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6016 # 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
6017 # 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
6018 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
6019 # 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
6020 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
6021 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
6022 _localeconv = _locale.localeconv()
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6023 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
6024 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
6025 "'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
6026 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
6027 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
6028 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
6029 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6030 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
6031 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
6032 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
6033 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
6034
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6035 # 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
6036 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
6037
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6038 return format_dict
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6039
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6040 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
6041 """Given an unpadded, non-aligned numeric string 'body' and sign
68503
ee5350f1d0c2 #11515: fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 68394
diff changeset
6042 string 'sign', add padding and alignment conforming to the given
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6043 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
6044 parse_format_specifier).
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6045
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6046 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
6047
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6048 """
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6049 # 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
6050 minimumwidth = spec['minimumwidth']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6051 fill = spec['fill']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6052 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
6053
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6054 align = spec['align']
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6055 if align == '<':
52189
fd4c83928080 Merged revisions 70430 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51294
diff changeset
6056 result = sign + body + padding
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6057 elif align == '>':
52189
fd4c83928080 Merged revisions 70430 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51294
diff changeset
6058 result = padding + sign + body
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6059 elif align == '=':
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6060 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
6061 elif align == '^':
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6062 half = len(padding)//2
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6063 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
6064 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6065 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
6066
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6067 # 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
6068 if spec['unicode']:
45566
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6069 result = unicode(result)
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6070
bce4c40df7df Add __format__ method to Decimal, to support PEP 3101
Mark Dickinson <dickinsm@gmail.com>
parents: 45505
diff changeset
6071 return result
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
6072
52195
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6073 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
6074 """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
6075 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
6076
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6077 """
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6078 # 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
6079 # 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
6080 # following three forms:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6081 #
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6082 # (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
6083 # (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
6084 # (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
6085
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6086 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
6087 if not grouping:
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 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
6090 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
6091 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
6092 return grouping[:-1]
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6093 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6094 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
6095
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6096 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
6097 """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
6098
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6099 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
6100 '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
6101 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
6102
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6103 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
6104 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
6105
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6106 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
6107 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
6108 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
6109 '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
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
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6113 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
6114 grouping = spec['grouping']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6115
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6116 groups = []
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6117 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
6118 if l <= 0:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6119 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
6120 # 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
6121 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
6122 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
6123 digits = digits[:-l]
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6124 min_width -= l
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6125 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
6126 break
52200
2d94c8fed376 Fix bug in _insert_thousands_sep: too much zero padding could be
Mark Dickinson <dickinsm@gmail.com>
parents: 52195
diff changeset
6127 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
6128 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6129 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
6130 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
6131 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
6132
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6133 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
6134 """Determine sign character."""
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6135
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6136 if is_negative:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6137 return '-'
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6138 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
6139 return spec['sign']
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6140 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6141 return ''
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6142
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6143 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
6144 """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
6145
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6146 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
6147 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
6148 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
6149 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
6150 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
6151
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6152 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
6153 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
6154 format the sign
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6155 format the exponent
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6156 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
6157 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
6158 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
6159 """
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6160
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6161 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
6162
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6163 if fracpart:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6164 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
6165
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6166 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
6167 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
6168 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
6169 if spec['type'] == '%':
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6170 fracpart += '%'
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6171
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6172 if spec['zeropad']:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6173 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
6174 else:
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6175 min_width = 0
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6176 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
6177
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6178 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
6179
5dee93a97558 Issue #2110: Add support for thousands separator and 'n' format specifier
Mark Dickinson <dickinsm@gmail.com>
parents: 52188
diff changeset
6180
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
6181 ##### Useful Constants (internal use only) ################################
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
6182
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
6183 # Reusable defaults
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
6184 _Infinity = Decimal('Inf')
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
6185 _NegativeInfinity = Decimal('-Inf')
50471
94ff3de1e1a4 Merged revisions 68182 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50116
diff changeset
6186 _NaN = Decimal('NaN')
50480
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
6187 _Zero = Decimal(0)
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
6188 _One = Decimal(1)
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
6189 _NegativeOne = Decimal(-1)
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
6190
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
6191 # _SignedInfinity[sign] is infinity w/ that sign
f2a5d7828b83 Merged revisions 68191 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50471
diff changeset
6192 _SignedInfinity = (_Infinity, _NegativeInfinity)
44600
9a60bd8f00d6 Decimal module and test cases were updated to their state of
Facundo Batista <facundobatista@gmail.com>
parents: 40769
diff changeset
6193
32451
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6194
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6195
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6196 if __name__ == '__main__':
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6197 import doctest, sys
d2c1c7ae7cf4 Move Decimal from the sandbox into production.
Raymond Hettinger <python@rcn.com>
parents:
diff changeset
6198 doctest.testmod(sys.modules[__name__])