blob: 51758f269e07ed19a1c29178da19d48ddc044a98 [file] [log] [blame]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001# Copyright (c) 2004 Python Software Foundation.
2# All rights reserved.
3
4# Written by Eric Price <eprice at tjhsst.edu>
5# and Facundo Batista <facundo at taniquetil.com.ar>
6# and Raymond Hettinger <python at rcn.com>
Fred Drake1f34eb12004-07-01 14:28:36 +00007# and Aahz <aahz at pobox.com>
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00008# and Tim Peters
9
Raymond Hettinger27dbcf22004-08-19 22:39:55 +000010# This module is currently Py2.3 compatible and should be kept that way
11# unless a major compelling advantage arises. IOW, 2.3 compatibility is
12# strongly preferred, but not guaranteed.
13
14# Also, this module should be kept in sync with the latest updates of
15# the IBM specification as it evolves. Those updates will be treated
16# as bug fixes (deviation from the spec is a compatibility, usability
17# bug) and will be backported. At this point the spec is stabilizing
18# and the updates are becoming fewer, smaller, and less significant.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000019
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000020"""
21This is a Py2.3 implementation of decimal floating point arithmetic based on
22the General Decimal Arithmetic Specification:
23
24 www2.hursley.ibm.com/decimal/decarith.html
25
Raymond Hettinger0ea241e2004-07-04 13:53:24 +000026and IEEE standard 854-1987:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000027
28 www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
29
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000030Decimal floating point has finite precision with arbitrarily large bounds.
31
Guido van Rossumd8faa362007-04-27 19:54:29 +000032The purpose of this module is to support arithmetic using familiar
33"schoolhouse" rules and to avoid some of the tricky representation
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000034issues associated with binary floating point. The package is especially
35useful for financial applications or for contexts where users have
36expectations that are at odds with binary floating point (for instance,
37in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
38of the expected Decimal("0.00") returned by decimal floating point).
39
40Here are some examples of using the decimal module:
41
42>>> from decimal import *
Raymond Hettingerbd7f76d2004-07-08 00:49:18 +000043>>> setcontext(ExtendedContext)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000044>>> Decimal(0)
45Decimal("0")
46>>> Decimal("1")
47Decimal("1")
48>>> Decimal("-.0123")
49Decimal("-0.0123")
50>>> Decimal(123456)
51Decimal("123456")
52>>> Decimal("123.45e12345678901234567890")
53Decimal("1.2345E+12345678901234567892")
54>>> Decimal("1.33") + Decimal("1.27")
55Decimal("2.60")
56>>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41")
57Decimal("-2.20")
58>>> dig = Decimal(1)
Guido van Rossum7131f842007-02-09 20:13:25 +000059>>> print(dig / Decimal(3))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000600.333333333
61>>> getcontext().prec = 18
Guido van Rossum7131f842007-02-09 20:13:25 +000062>>> print(dig / Decimal(3))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000630.333333333333333333
Guido van Rossum7131f842007-02-09 20:13:25 +000064>>> print(dig.sqrt())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000651
Guido van Rossum7131f842007-02-09 20:13:25 +000066>>> print(Decimal(3).sqrt())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000671.73205080756887729
Guido van Rossum7131f842007-02-09 20:13:25 +000068>>> print(Decimal(3) ** 123)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000694.85192780976896427E+58
70>>> inf = Decimal(1) / Decimal(0)
Guido van Rossum7131f842007-02-09 20:13:25 +000071>>> print(inf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000072Infinity
73>>> neginf = Decimal(-1) / Decimal(0)
Guido van Rossum7131f842007-02-09 20:13:25 +000074>>> print(neginf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000075-Infinity
Guido van Rossum7131f842007-02-09 20:13:25 +000076>>> print(neginf + inf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000077NaN
Guido van Rossum7131f842007-02-09 20:13:25 +000078>>> print(neginf * inf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000079-Infinity
Guido van Rossum7131f842007-02-09 20:13:25 +000080>>> print(dig / 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000081Infinity
Raymond Hettingerbf440692004-07-10 14:14:37 +000082>>> getcontext().traps[DivisionByZero] = 1
Guido van Rossum7131f842007-02-09 20:13:25 +000083>>> print(dig / 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000084Traceback (most recent call last):
85 ...
86 ...
87 ...
Guido van Rossum6a2a2a02006-08-26 20:37:44 +000088decimal.DivisionByZero: x / 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000089>>> c = Context()
Raymond Hettingerbf440692004-07-10 14:14:37 +000090>>> c.traps[InvalidOperation] = 0
Guido van Rossum7131f842007-02-09 20:13:25 +000091>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000920
93>>> c.divide(Decimal(0), Decimal(0))
94Decimal("NaN")
Raymond Hettingerbf440692004-07-10 14:14:37 +000095>>> c.traps[InvalidOperation] = 1
Guido van Rossum7131f842007-02-09 20:13:25 +000096>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000971
Raymond Hettinger5aa478b2004-07-09 10:02:53 +000098>>> c.flags[InvalidOperation] = 0
Guido van Rossum7131f842007-02-09 20:13:25 +000099>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001000
Guido van Rossum7131f842007-02-09 20:13:25 +0000101>>> print(c.divide(Decimal(0), Decimal(0)))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000102Traceback (most recent call last):
103 ...
104 ...
105 ...
Guido van Rossum6a2a2a02006-08-26 20:37:44 +0000106decimal.InvalidOperation: 0 / 0
Guido van Rossum7131f842007-02-09 20:13:25 +0000107>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001081
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000109>>> c.flags[InvalidOperation] = 0
Raymond Hettingerbf440692004-07-10 14:14:37 +0000110>>> c.traps[InvalidOperation] = 0
Guido van Rossum7131f842007-02-09 20:13:25 +0000111>>> print(c.divide(Decimal(0), Decimal(0)))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000112NaN
Guido van Rossum7131f842007-02-09 20:13:25 +0000113>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001141
115>>>
116"""
117
118__all__ = [
119 # Two major classes
120 'Decimal', 'Context',
121
122 # Contexts
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +0000123 'DefaultContext', 'BasicContext', 'ExtendedContext',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000124
125 # Exceptions
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +0000126 'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
127 'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000128
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000129 # Constants for use in setting up contexts
130 'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000131 'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000132
133 # Functions for manipulating contexts
Thomas Wouters89f507f2006-12-13 04:49:30 +0000134 'setcontext', 'getcontext', 'localcontext'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000135]
136
Guido van Rossuma13f4a12007-12-10 20:04:04 +0000137import numbers as _numbers
Raymond Hettingereb260842005-06-07 18:52:34 +0000138import copy as _copy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000139
Christian Heimes25bb7832008-01-11 16:17:00 +0000140try:
141 from collections import namedtuple as _namedtuple
142 DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
143except ImportError:
144 DecimalTuple = lambda *args: args
145
Guido van Rossumd8faa362007-04-27 19:54:29 +0000146# Rounding
Raymond Hettinger0ea241e2004-07-04 13:53:24 +0000147ROUND_DOWN = 'ROUND_DOWN'
148ROUND_HALF_UP = 'ROUND_HALF_UP'
149ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
150ROUND_CEILING = 'ROUND_CEILING'
151ROUND_FLOOR = 'ROUND_FLOOR'
152ROUND_UP = 'ROUND_UP'
153ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000154ROUND_05UP = 'ROUND_05UP'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000155
Guido van Rossumd8faa362007-04-27 19:54:29 +0000156# Errors
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000157
158class DecimalException(ArithmeticError):
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000159 """Base exception class.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000160
161 Used exceptions derive from this.
162 If an exception derives from another exception besides this (such as
163 Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
164 called if the others are present. This isn't actually used for
165 anything, though.
166
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000167 handle -- Called when context._raise_error is called and the
168 trap_enabler is set. First argument is self, second is the
169 context. More arguments can be given, those being after
170 the explanation in _raise_error (For example,
171 context._raise_error(NewError, '(-x)!', self._sign) would
172 call NewError().handle(context, self._sign).)
173
174 To define a new exception, it should be sufficient to have it derive
175 from DecimalException.
176 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000177 def handle(self, context, *args):
178 pass
179
180
181class Clamped(DecimalException):
182 """Exponent of a 0 changed to fit bounds.
183
184 This occurs and signals clamped if the exponent of a result has been
185 altered in order to fit the constraints of a specific concrete
Guido van Rossumd8faa362007-04-27 19:54:29 +0000186 representation. This may occur when the exponent of a zero result would
187 be outside the bounds of a representation, or when a large normal
188 number would have an encoded exponent that cannot be represented. In
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000189 this latter case, the exponent is reduced to fit and the corresponding
190 number of zero digits are appended to the coefficient ("fold-down").
191 """
192
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000193class InvalidOperation(DecimalException):
194 """An invalid operation was performed.
195
196 Various bad things cause this:
197
198 Something creates a signaling NaN
199 -INF + INF
Guido van Rossumd8faa362007-04-27 19:54:29 +0000200 0 * (+-)INF
201 (+-)INF / (+-)INF
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000202 x % 0
203 (+-)INF % x
204 x._rescale( non-integer )
205 sqrt(-x) , x > 0
206 0 ** 0
207 x ** (non-integer)
208 x ** (+-)INF
209 An operand is invalid
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000210
211 The result of the operation after these is a quiet positive NaN,
212 except when the cause is a signaling NaN, in which case the result is
213 also a quiet NaN, but with the original sign, and an optional
214 diagnostic information.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000215 """
216 def handle(self, context, *args):
217 if args:
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000218 ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
219 return ans._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000220 return NaN
221
222class ConversionSyntax(InvalidOperation):
223 """Trying to convert badly formed string.
224
225 This occurs and signals invalid-operation if an string is being
226 converted to a number and it does not conform to the numeric string
Guido van Rossumd8faa362007-04-27 19:54:29 +0000227 syntax. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000228 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000229 def handle(self, context, *args):
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000230 return NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000231
232class DivisionByZero(DecimalException, ZeroDivisionError):
233 """Division by 0.
234
235 This occurs and signals division-by-zero if division of a finite number
236 by zero was attempted (during a divide-integer or divide operation, or a
237 power operation with negative right-hand operand), and the dividend was
238 not zero.
239
240 The result of the operation is [sign,inf], where sign is the exclusive
241 or of the signs of the operands for divide, or is 1 for an odd power of
242 -0, for power.
243 """
244
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000245 def handle(self, context, sign, *args):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000246 return Infsign[sign]
247
248class DivisionImpossible(InvalidOperation):
249 """Cannot perform the division adequately.
250
251 This occurs and signals invalid-operation if the integer result of a
252 divide-integer or remainder operation had too many digits (would be
Guido van Rossumd8faa362007-04-27 19:54:29 +0000253 longer than precision). The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000254 """
255
256 def handle(self, context, *args):
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000257 return NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000258
259class DivisionUndefined(InvalidOperation, ZeroDivisionError):
260 """Undefined result of division.
261
262 This occurs and signals invalid-operation if division by zero was
263 attempted (during a divide-integer, divide, or remainder operation), and
Guido van Rossumd8faa362007-04-27 19:54:29 +0000264 the dividend is also zero. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000265 """
266
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000267 def handle(self, context, *args):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000268 return NaN
269
270class Inexact(DecimalException):
271 """Had to round, losing information.
272
273 This occurs and signals inexact whenever the result of an operation is
274 not exact (that is, it needed to be rounded and any discarded digits
Guido van Rossumd8faa362007-04-27 19:54:29 +0000275 were non-zero), or if an overflow or underflow condition occurs. The
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000276 result in all cases is unchanged.
277
278 The inexact signal may be tested (or trapped) to determine if a given
279 operation (or sequence of operations) was inexact.
280 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000281
282class InvalidContext(InvalidOperation):
283 """Invalid context. Unknown rounding, for example.
284
285 This occurs and signals invalid-operation if an invalid context was
Guido van Rossumd8faa362007-04-27 19:54:29 +0000286 detected during an operation. This can occur if contexts are not checked
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000287 on creation and either the precision exceeds the capability of the
288 underlying concrete representation or an unknown or unsupported rounding
Guido van Rossumd8faa362007-04-27 19:54:29 +0000289 was specified. These aspects of the context need only be checked when
290 the values are required to be used. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000291 """
292
293 def handle(self, context, *args):
294 return NaN
295
296class Rounded(DecimalException):
297 """Number got rounded (not necessarily changed during rounding).
298
299 This occurs and signals rounded whenever the result of an operation is
300 rounded (that is, some zero or non-zero digits were discarded from the
Guido van Rossumd8faa362007-04-27 19:54:29 +0000301 coefficient), or if an overflow or underflow condition occurs. The
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000302 result in all cases is unchanged.
303
304 The rounded signal may be tested (or trapped) to determine if a given
305 operation (or sequence of operations) caused a loss of precision.
306 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000307
308class Subnormal(DecimalException):
309 """Exponent < Emin before rounding.
310
311 This occurs and signals subnormal whenever the result of a conversion or
312 operation is subnormal (that is, its adjusted exponent is less than
Guido van Rossumd8faa362007-04-27 19:54:29 +0000313 Emin, before any rounding). The result in all cases is unchanged.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000314
315 The subnormal signal may be tested (or trapped) to determine if a given
316 or operation (or sequence of operations) yielded a subnormal result.
317 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000318
319class Overflow(Inexact, Rounded):
320 """Numerical overflow.
321
322 This occurs and signals overflow if the adjusted exponent of a result
323 (from a conversion or from an operation that is not an attempt to divide
324 by zero), after rounding, would be greater than the largest value that
325 can be handled by the implementation (the value Emax).
326
327 The result depends on the rounding mode:
328
329 For round-half-up and round-half-even (and for round-half-down and
330 round-up, if implemented), the result of the operation is [sign,inf],
Guido van Rossumd8faa362007-04-27 19:54:29 +0000331 where sign is the sign of the intermediate result. For round-down, the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000332 result is the largest finite number that can be represented in the
Guido van Rossumd8faa362007-04-27 19:54:29 +0000333 current precision, with the sign of the intermediate result. For
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000334 round-ceiling, the result is the same as for round-down if the sign of
Guido van Rossumd8faa362007-04-27 19:54:29 +0000335 the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000336 the result is the same as for round-down if the sign of the intermediate
Guido van Rossumd8faa362007-04-27 19:54:29 +0000337 result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000338 will also be raised.
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000339 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000340
341 def handle(self, context, sign, *args):
342 if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000343 ROUND_HALF_DOWN, ROUND_UP):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000344 return Infsign[sign]
345 if sign == 0:
346 if context.rounding == ROUND_CEILING:
347 return Infsign[sign]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000348 return _dec_from_triple(sign, '9'*context.prec,
349 context.Emax-context.prec+1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000350 if sign == 1:
351 if context.rounding == ROUND_FLOOR:
352 return Infsign[sign]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000353 return _dec_from_triple(sign, '9'*context.prec,
354 context.Emax-context.prec+1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000355
356
357class Underflow(Inexact, Rounded, Subnormal):
358 """Numerical underflow with result rounded to 0.
359
360 This occurs and signals underflow if a result is inexact and the
361 adjusted exponent of the result would be smaller (more negative) than
362 the smallest value that can be handled by the implementation (the value
Guido van Rossumd8faa362007-04-27 19:54:29 +0000363 Emin). That is, the result is both inexact and subnormal.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000364
365 The result after an underflow will be a subnormal number rounded, if
Guido van Rossumd8faa362007-04-27 19:54:29 +0000366 necessary, so that its exponent is not less than Etiny. This may result
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000367 in 0 with the sign of the intermediate result and an exponent of Etiny.
368
369 In all cases, Inexact, Rounded, and Subnormal will also be raised.
370 """
371
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000372# List of public traps and flags
Raymond Hettingerfed52962004-07-14 15:41:57 +0000373_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000374 Underflow, InvalidOperation, Subnormal]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000375
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000376# Map conditions (per the spec) to signals
377_condition_map = {ConversionSyntax:InvalidOperation,
378 DivisionImpossible:InvalidOperation,
379 DivisionUndefined:InvalidOperation,
380 InvalidContext:InvalidOperation}
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000381
Guido van Rossumd8faa362007-04-27 19:54:29 +0000382##### Context Functions ##################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000383
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000384# The getcontext() and setcontext() function manage access to a thread-local
385# current context. Py2.4 offers direct support for thread locals. If that
386# is not available, use threading.currentThread() which is slower but will
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000387# work for older Pythons. If threads are not part of the build, create a
388# mock threading object with threading.local() returning the module namespace.
389
390try:
391 import threading
392except ImportError:
393 # Python was compiled without threads; create a mock object instead
394 import sys
Guido van Rossumd8faa362007-04-27 19:54:29 +0000395 class MockThreading(object):
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000396 def local(self, sys=sys):
397 return sys.modules[__name__]
398 threading = MockThreading()
399 del sys, MockThreading
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000400
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000401try:
402 threading.local
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000403
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000404except AttributeError:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000405
Guido van Rossumd8faa362007-04-27 19:54:29 +0000406 # To fix reloading, force it to create a new context
407 # Old contexts have different exceptions in their dicts, making problems.
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000408 if hasattr(threading.currentThread(), '__decimal_context__'):
409 del threading.currentThread().__decimal_context__
410
411 def setcontext(context):
412 """Set this thread's context to context."""
413 if context in (DefaultContext, BasicContext, ExtendedContext):
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000414 context = context.copy()
Raymond Hettinger61992ef2004-08-06 23:42:16 +0000415 context.clear_flags()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000416 threading.currentThread().__decimal_context__ = context
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000417
418 def getcontext():
419 """Returns this thread's context.
420
421 If this thread does not yet have a context, returns
422 a new context and sets this thread's context.
423 New contexts are copies of DefaultContext.
424 """
425 try:
426 return threading.currentThread().__decimal_context__
427 except AttributeError:
428 context = Context()
429 threading.currentThread().__decimal_context__ = context
430 return context
431
432else:
433
434 local = threading.local()
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000435 if hasattr(local, '__decimal_context__'):
436 del local.__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000437
438 def getcontext(_local=local):
439 """Returns this thread's context.
440
441 If this thread does not yet have a context, returns
442 a new context and sets this thread's context.
443 New contexts are copies of DefaultContext.
444 """
445 try:
446 return _local.__decimal_context__
447 except AttributeError:
448 context = Context()
449 _local.__decimal_context__ = context
450 return context
451
452 def setcontext(context, _local=local):
453 """Set this thread's context to context."""
454 if context in (DefaultContext, BasicContext, ExtendedContext):
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000455 context = context.copy()
Raymond Hettinger61992ef2004-08-06 23:42:16 +0000456 context.clear_flags()
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000457 _local.__decimal_context__ = context
458
459 del threading, local # Don't contaminate the namespace
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000460
Thomas Wouters89f507f2006-12-13 04:49:30 +0000461def localcontext(ctx=None):
462 """Return a context manager for a copy of the supplied context
463
464 Uses a copy of the current context if no context is specified
465 The returned context manager creates a local decimal context
466 in a with statement:
467 def sin(x):
468 with localcontext() as ctx:
469 ctx.prec += 2
470 # Rest of sin calculation algorithm
471 # uses a precision 2 greater than normal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000472 return +s # Convert result to normal precision
Thomas Wouters89f507f2006-12-13 04:49:30 +0000473
474 def sin(x):
475 with localcontext(ExtendedContext):
476 # Rest of sin calculation algorithm
477 # uses the Extended Context from the
478 # General Decimal Arithmetic Specification
Guido van Rossumd8faa362007-04-27 19:54:29 +0000479 return +s # Convert result to normal context
Thomas Wouters89f507f2006-12-13 04:49:30 +0000480
481 """
482 # The string below can't be included in the docstring until Python 2.6
483 # as the doctest module doesn't understand __future__ statements
484 """
485 >>> from __future__ import with_statement
Guido van Rossum7131f842007-02-09 20:13:25 +0000486 >>> print(getcontext().prec)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000487 28
488 >>> with localcontext():
489 ... ctx = getcontext()
Thomas Wouterscf297e42007-02-23 15:07:44 +0000490 ... ctx.prec += 2
Guido van Rossum7131f842007-02-09 20:13:25 +0000491 ... print(ctx.prec)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000492 ...
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 30
494 >>> with localcontext(ExtendedContext):
Guido van Rossum7131f842007-02-09 20:13:25 +0000495 ... print(getcontext().prec)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000496 ...
Thomas Wouters89f507f2006-12-13 04:49:30 +0000497 9
Guido van Rossum7131f842007-02-09 20:13:25 +0000498 >>> print(getcontext().prec)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000499 28
500 """
501 if ctx is None: ctx = getcontext()
502 return _ContextManager(ctx)
503
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000504
Guido van Rossumd8faa362007-04-27 19:54:29 +0000505##### Decimal class #######################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000506
Guido van Rossuma13f4a12007-12-10 20:04:04 +0000507class Decimal(_numbers.Real, _numbers.Inexact):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000508 """Floating point class for decimal arithmetic."""
509
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000510 __slots__ = ('_exp','_int','_sign', '_is_special')
511 # Generally, the value of the Decimal instance is given by
512 # (-1)**_sign * _int * 10**_exp
513 # Special values are signified by _is_special == True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000514
Raymond Hettingerdab988d2004-10-09 07:10:44 +0000515 # We're immutable, so use __new__ not __init__
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000516 def __new__(cls, value="0", context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000517 """Create a decimal point instance.
518
519 >>> Decimal('3.14') # string input
520 Decimal("3.14")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000521 >>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000522 Decimal("3.14")
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000523 >>> Decimal(314) # int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000524 Decimal("314")
525 >>> Decimal(Decimal(314)) # another decimal instance
526 Decimal("314")
Christian Heimesa62da1d2008-01-12 19:39:10 +0000527 >>> Decimal(' 3.14 \\n') # leading and trailing whitespace okay
528 Decimal("3.14")
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000529 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000530
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000531 # Note that the coefficient, self._int, is actually stored as
532 # a string rather than as a tuple of digits. This speeds up
533 # the "digits to integer" and "integer to digits" conversions
534 # that are used in almost every arithmetic operation on
535 # Decimals. This is an internal detail: the as_tuple function
536 # and the Decimal constructor still deal with tuples of
537 # digits.
538
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000539 self = object.__new__(cls)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000540
Christian Heimesd59c64c2007-11-30 19:27:20 +0000541 # From a string
542 # REs insist on real strings, so we can too.
543 if isinstance(value, str):
Christian Heimesa62da1d2008-01-12 19:39:10 +0000544 m = _parser(value.strip())
Christian Heimesd59c64c2007-11-30 19:27:20 +0000545 if m is None:
546 if context is None:
547 context = getcontext()
548 return context._raise_error(ConversionSyntax,
549 "Invalid literal for Decimal: %r" % value)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000550
Christian Heimesd59c64c2007-11-30 19:27:20 +0000551 if m.group('sign') == "-":
552 self._sign = 1
553 else:
554 self._sign = 0
555 intpart = m.group('int')
556 if intpart is not None:
557 # finite number
558 fracpart = m.group('frac')
559 exp = int(m.group('exp') or '0')
560 if fracpart is not None:
561 self._int = (intpart+fracpart).lstrip('0') or '0'
562 self._exp = exp - len(fracpart)
563 else:
564 self._int = intpart.lstrip('0') or '0'
565 self._exp = exp
566 self._is_special = False
567 else:
568 diag = m.group('diag')
569 if diag is not None:
570 # NaN
571 self._int = diag.lstrip('0')
572 if m.group('signal'):
573 self._exp = 'N'
574 else:
575 self._exp = 'n'
576 else:
577 # infinity
578 self._int = '0'
579 self._exp = 'F'
580 self._is_special = True
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000581 return self
582
583 # From an integer
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000584 if isinstance(value, int):
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000585 if value >= 0:
586 self._sign = 0
587 else:
588 self._sign = 1
589 self._exp = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000590 self._int = str(abs(value))
Christian Heimesd59c64c2007-11-30 19:27:20 +0000591 self._is_special = False
592 return self
593
594 # From another decimal
595 if isinstance(value, Decimal):
596 self._exp = value._exp
597 self._sign = value._sign
598 self._int = value._int
599 self._is_special = value._is_special
600 return self
601
602 # From an internal working value
603 if isinstance(value, _WorkRep):
604 self._sign = value.sign
605 self._int = str(value.int)
606 self._exp = int(value.exp)
607 self._is_special = False
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000608 return self
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000609
610 # tuple/list conversion (possibly from as_tuple())
611 if isinstance(value, (list,tuple)):
612 if len(value) != 3:
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000613 raise ValueError('Invalid tuple size in creation of Decimal '
614 'from list or tuple. The list or tuple '
615 'should have exactly three elements.')
616 # process sign. The isinstance test rejects floats
617 if not (isinstance(value[0], int) and value[0] in (0,1)):
618 raise ValueError("Invalid sign. The first value in the tuple "
619 "should be an integer; either 0 for a "
620 "positive number or 1 for a negative number.")
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000621 self._sign = value[0]
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000622 if value[2] == 'F':
623 # infinity: value[1] is ignored
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000624 self._int = '0'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000625 self._exp = value[2]
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000626 self._is_special = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000627 else:
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000628 # process and validate the digits in value[1]
629 digits = []
630 for digit in value[1]:
631 if isinstance(digit, int) and 0 <= digit <= 9:
632 # skip leading zeros
633 if digits or digit != 0:
634 digits.append(digit)
635 else:
636 raise ValueError("The second value in the tuple must "
637 "be composed of integers in the range "
638 "0 through 9.")
639 if value[2] in ('n', 'N'):
640 # NaN: digits form the diagnostic
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000641 self._int = ''.join(map(str, digits))
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000642 self._exp = value[2]
643 self._is_special = True
644 elif isinstance(value[2], int):
645 # finite number: digits give the coefficient
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000646 self._int = ''.join(map(str, digits or [0]))
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000647 self._exp = value[2]
648 self._is_special = False
649 else:
650 raise ValueError("The third value in the tuple must "
651 "be an integer, or one of the "
652 "strings 'F', 'n', 'N'.")
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000653 return self
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000654
Raymond Hettingerbf440692004-07-10 14:14:37 +0000655 if isinstance(value, float):
656 raise TypeError("Cannot convert float to Decimal. " +
657 "First convert the float to a string")
658
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000659 raise TypeError("Cannot convert %r to Decimal" % value)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000660
661 def _isnan(self):
662 """Returns whether the number is not actually one.
663
664 0 if a number
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000665 1 if NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000666 2 if sNaN
667 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000668 if self._is_special:
669 exp = self._exp
670 if exp == 'n':
671 return 1
672 elif exp == 'N':
673 return 2
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000674 return 0
675
676 def _isinfinity(self):
677 """Returns whether the number is infinite
678
679 0 if finite or not a number
680 1 if +INF
681 -1 if -INF
682 """
683 if self._exp == 'F':
684 if self._sign:
685 return -1
686 return 1
687 return 0
688
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000689 def _check_nans(self, other=None, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000690 """Returns whether the number is not actually one.
691
692 if self, other are sNaN, signal
693 if self, other are NaN return nan
694 return 0
695
696 Done before operations.
697 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000698
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000699 self_is_nan = self._isnan()
700 if other is None:
701 other_is_nan = False
702 else:
703 other_is_nan = other._isnan()
704
705 if self_is_nan or other_is_nan:
706 if context is None:
707 context = getcontext()
708
709 if self_is_nan == 2:
710 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000711 self)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000712 if other_is_nan == 2:
713 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000714 other)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000715 if self_is_nan:
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000716 return self._fix_nan(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000717
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000718 return other._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000719 return 0
720
Jack Diederich4dafcc42006-11-28 19:15:13 +0000721 def __bool__(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000722 """Return True if self is nonzero; otherwise return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000723
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000724 NaNs and infinities are considered nonzero.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000725 """
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000726 return self._is_special or self._int != '0'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000727
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000728 def __cmp__(self, other):
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000729 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +0000730 if other is NotImplemented:
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000731 # Never return NotImplemented
732 return 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000733
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000734 if self._is_special or other._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000735 # check for nans, without raising on a signaling nan
736 if self._isnan() or other._isnan():
Guido van Rossumd8faa362007-04-27 19:54:29 +0000737 return 1 # Comparison involving NaN's always reports self > other
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000738
739 # INF = INF
740 return cmp(self._isinfinity(), other._isinfinity())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000741
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000742 # check for zeros; note that cmp(0, -0) should return 0
743 if not self:
744 if not other:
745 return 0
746 else:
747 return -((-1)**other._sign)
748 if not other:
749 return (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000750
Guido van Rossumd8faa362007-04-27 19:54:29 +0000751 # If different signs, neg one is less
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000752 if other._sign < self._sign:
753 return -1
754 if self._sign < other._sign:
755 return 1
756
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000757 self_adjusted = self.adjusted()
758 other_adjusted = other.adjusted()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000759 if self_adjusted == other_adjusted:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000760 self_padded = self._int + '0'*(self._exp - other._exp)
761 other_padded = other._int + '0'*(other._exp - self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000762 return cmp(self_padded, other_padded) * (-1)**self._sign
763 elif self_adjusted > other_adjusted:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000764 return (-1)**self._sign
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000765 else: # self_adjusted < other_adjusted
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000766 return -((-1)**self._sign)
767
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000768 def __eq__(self, other):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000769 if not isinstance(other, (Decimal, int)):
Raymond Hettinger267b8682005-03-27 10:47:39 +0000770 return NotImplemented
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000771 return self.__cmp__(other) == 0
772
773 def __ne__(self, other):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000774 if not isinstance(other, (Decimal, int)):
Raymond Hettinger267b8682005-03-27 10:47:39 +0000775 return NotImplemented
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000776 return self.__cmp__(other) != 0
777
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000778 def __lt__(self, other):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000779 if not isinstance(other, (Decimal, int)):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000780 return NotImplemented
781 return self.__cmp__(other) < 0
782
783 def __le__(self, other):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000784 if not isinstance(other, (Decimal, int)):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000785 return NotImplemented
786 return self.__cmp__(other) <= 0
787
788 def __gt__(self, other):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000789 if not isinstance(other, (Decimal, int)):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000790 return NotImplemented
791 return self.__cmp__(other) > 0
792
793 def __ge__(self, other):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000794 if not isinstance(other, (Decimal, int)):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000795 return NotImplemented
796 return self.__cmp__(other) >= 0
797
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000798 def compare(self, other, context=None):
799 """Compares one to another.
800
801 -1 => a < b
802 0 => a = b
803 1 => a > b
804 NaN => one is NaN
805 Like __cmp__, but returns Decimal instances.
806 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000807 other = _convert_other(other, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000808
Guido van Rossumd8faa362007-04-27 19:54:29 +0000809 # Compare(NaN, NaN) = NaN
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000810 if (self._is_special or other and other._is_special):
811 ans = self._check_nans(other, context)
812 if ans:
813 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000814
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000815 return Decimal(self.__cmp__(other))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000816
817 def __hash__(self):
818 """x.__hash__() <==> hash(x)"""
819 # Decimal integers must hash the same as the ints
Christian Heimes2380ac72008-01-09 00:17:24 +0000820 #
821 # The hash of a nonspecial noninteger Decimal must depend only
822 # on the value of that Decimal, and not on its representation.
823 # For example: hash(Decimal("100E-1")) == hash(Decimal("10")).
Raymond Hettingerbea3f6f2005-03-15 04:59:17 +0000824 if self._is_special:
825 if self._isnan():
826 raise TypeError('Cannot hash a NaN value.')
827 return hash(str(self))
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000828 if not self:
829 return 0
830 if self._isinteger():
831 op = _WorkRep(self.to_integral_value())
832 # to make computation feasible for Decimals with large
833 # exponent, we use the fact that hash(n) == hash(m) for
834 # any two nonzero integers n and m such that (i) n and m
835 # have the same sign, and (ii) n is congruent to m modulo
836 # 2**64-1. So we can replace hash((-1)**s*c*10**e) with
837 # hash((-1)**s*c*pow(10, e, 2**64-1).
838 return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1))
Christian Heimes2380ac72008-01-09 00:17:24 +0000839 # The value of a nonzero nonspecial Decimal instance is
840 # faithfully represented by the triple consisting of its sign,
841 # its adjusted exponent, and its coefficient with trailing
842 # zeros removed.
843 return hash((self._sign,
844 self._exp+len(self._int),
845 self._int.rstrip('0')))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000846
847 def as_tuple(self):
848 """Represents the number as a triple tuple.
849
850 To show the internals exactly as they are.
851 """
Christian Heimes25bb7832008-01-11 16:17:00 +0000852 return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000853
854 def __repr__(self):
855 """Represents the number as an instance of Decimal."""
856 # Invariant: eval(repr(d)) == d
857 return 'Decimal("%s")' % str(self)
858
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000859 def __str__(self, eng=False, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000860 """Return string representation of the number in scientific notation.
861
862 Captures all of the information in the underlying representation.
863 """
864
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000865 sign = ['', '-'][self._sign]
Raymond Hettingere5a0a962005-06-20 09:49:42 +0000866 if self._is_special:
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000867 if self._exp == 'F':
868 return sign + 'Infinity'
869 elif self._exp == 'n':
870 return sign + 'NaN' + self._int
871 else: # self._exp == 'N'
872 return sign + 'sNaN' + self._int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000873
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000874 # number of digits of self._int to left of decimal point
875 leftdigits = self._exp + len(self._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000876
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000877 # dotplace is number of digits of self._int to the left of the
878 # decimal point in the mantissa of the output string (that is,
879 # after adjusting the exponent)
880 if self._exp <= 0 and leftdigits > -6:
881 # no exponent required
882 dotplace = leftdigits
883 elif not eng:
884 # usual scientific notation: 1 digit on left of the point
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000885 dotplace = 1
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000886 elif self._int == '0':
887 # engineering notation, zero
888 dotplace = (leftdigits + 1) % 3 - 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000889 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000890 # engineering notation, nonzero
891 dotplace = (leftdigits - 1) % 3 + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000892
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000893 if dotplace <= 0:
894 intpart = '0'
895 fracpart = '.' + '0'*(-dotplace) + self._int
896 elif dotplace >= len(self._int):
897 intpart = self._int+'0'*(dotplace-len(self._int))
898 fracpart = ''
899 else:
900 intpart = self._int[:dotplace]
901 fracpart = '.' + self._int[dotplace:]
902 if leftdigits == dotplace:
903 exp = ''
904 else:
905 if context is None:
906 context = getcontext()
907 exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
908
909 return sign + intpart + fracpart + exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000910
911 def to_eng_string(self, context=None):
912 """Convert to engineering-type string.
913
914 Engineering notation has an exponent which is a multiple of 3, so there
915 are up to 3 digits left of the decimal place.
916
917 Same rules for when in exponential and when as a value as in __str__.
918 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000919 return self.__str__(eng=True, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000920
921 def __neg__(self, context=None):
922 """Returns a copy with the sign switched.
923
924 Rounds, if it has reason.
925 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000926 if self._is_special:
927 ans = self._check_nans(context=context)
928 if ans:
929 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000930
931 if not self:
932 # -Decimal('0') is Decimal('0'), not Decimal('-0')
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000933 ans = self.copy_abs()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000934 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000935 ans = self.copy_negate()
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000936
937 if context is None:
938 context = getcontext()
Christian Heimes2c181612007-12-17 20:04:13 +0000939 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000940
941 def __pos__(self, context=None):
942 """Returns a copy, unless it is a sNaN.
943
944 Rounds the number (if more then precision digits)
945 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000946 if self._is_special:
947 ans = self._check_nans(context=context)
948 if ans:
949 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000950
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000951 if not self:
952 # + (-0) = 0
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000953 ans = self.copy_abs()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000954 else:
955 ans = Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000956
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000957 if context is None:
958 context = getcontext()
Christian Heimes2c181612007-12-17 20:04:13 +0000959 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000960
Christian Heimes2c181612007-12-17 20:04:13 +0000961 def __abs__(self, round=True, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000962 """Returns the absolute value of self.
963
Christian Heimes2c181612007-12-17 20:04:13 +0000964 If the keyword argument 'round' is false, do not round. The
965 expression self.__abs__(round=False) is equivalent to
966 self.copy_abs().
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000967 """
Christian Heimes2c181612007-12-17 20:04:13 +0000968 if not round:
969 return self.copy_abs()
970
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000971 if self._is_special:
972 ans = self._check_nans(context=context)
973 if ans:
974 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000975
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000976 if self._sign:
977 ans = self.__neg__(context=context)
978 else:
979 ans = self.__pos__(context=context)
980
981 return ans
982
983 def __add__(self, other, context=None):
984 """Returns self + other.
985
986 -INF + INF (or the reverse) cause InvalidOperation errors.
987 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000988 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +0000989 if other is NotImplemented:
990 return other
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000991
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000992 if context is None:
993 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000994
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000995 if self._is_special or other._is_special:
996 ans = self._check_nans(other, context)
997 if ans:
998 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000999
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001000 if self._isinfinity():
Guido van Rossumd8faa362007-04-27 19:54:29 +00001001 # If both INF, same sign => same as both, opposite => error.
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001002 if self._sign != other._sign and other._isinfinity():
1003 return context._raise_error(InvalidOperation, '-INF + INF')
1004 return Decimal(self)
1005 if other._isinfinity():
Guido van Rossumd8faa362007-04-27 19:54:29 +00001006 return Decimal(other) # Can't both be infinity here
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001007
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001008 exp = min(self._exp, other._exp)
1009 negativezero = 0
1010 if context.rounding == ROUND_FLOOR and self._sign != other._sign:
Guido van Rossumd8faa362007-04-27 19:54:29 +00001011 # If the answer is 0, the sign should be negative, in this case.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001012 negativezero = 1
1013
1014 if not self and not other:
1015 sign = min(self._sign, other._sign)
1016 if negativezero:
1017 sign = 1
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001018 ans = _dec_from_triple(sign, '0', exp)
Christian Heimes2c181612007-12-17 20:04:13 +00001019 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001020 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001021 if not self:
Facundo Batista99b55482004-10-26 23:38:46 +00001022 exp = max(exp, other._exp - context.prec-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001023 ans = other._rescale(exp, context.rounding)
Christian Heimes2c181612007-12-17 20:04:13 +00001024 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001025 return ans
1026 if not other:
Facundo Batista99b55482004-10-26 23:38:46 +00001027 exp = max(exp, self._exp - context.prec-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001028 ans = self._rescale(exp, context.rounding)
Christian Heimes2c181612007-12-17 20:04:13 +00001029 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001030 return ans
1031
1032 op1 = _WorkRep(self)
1033 op2 = _WorkRep(other)
Christian Heimes2c181612007-12-17 20:04:13 +00001034 op1, op2 = _normalize(op1, op2, context.prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001035
1036 result = _WorkRep()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001037 if op1.sign != op2.sign:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001038 # Equal and opposite
Raymond Hettinger17931de2004-10-27 06:21:46 +00001039 if op1.int == op2.int:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001040 ans = _dec_from_triple(negativezero, '0', exp)
Christian Heimes2c181612007-12-17 20:04:13 +00001041 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001042 return ans
Raymond Hettinger17931de2004-10-27 06:21:46 +00001043 if op1.int < op2.int:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001044 op1, op2 = op2, op1
Guido van Rossumd8faa362007-04-27 19:54:29 +00001045 # OK, now abs(op1) > abs(op2)
Raymond Hettinger17931de2004-10-27 06:21:46 +00001046 if op1.sign == 1:
1047 result.sign = 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001048 op1.sign, op2.sign = op2.sign, op1.sign
1049 else:
Raymond Hettinger17931de2004-10-27 06:21:46 +00001050 result.sign = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +00001051 # So we know the sign, and op1 > 0.
Raymond Hettinger17931de2004-10-27 06:21:46 +00001052 elif op1.sign == 1:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001053 result.sign = 1
Raymond Hettinger17931de2004-10-27 06:21:46 +00001054 op1.sign, op2.sign = (0, 0)
1055 else:
1056 result.sign = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +00001057 # Now, op1 > abs(op2) > 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001058
Raymond Hettinger17931de2004-10-27 06:21:46 +00001059 if op2.sign == 0:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001060 result.int = op1.int + op2.int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001061 else:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001062 result.int = op1.int - op2.int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001063
1064 result.exp = op1.exp
1065 ans = Decimal(result)
Christian Heimes2c181612007-12-17 20:04:13 +00001066 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001067 return ans
1068
1069 __radd__ = __add__
1070
1071 def __sub__(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001072 """Return self - other"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001073 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001074 if other is NotImplemented:
1075 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001076
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001077 if self._is_special or other._is_special:
1078 ans = self._check_nans(other, context=context)
1079 if ans:
1080 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001081
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001082 # self - other is computed as self + other.copy_negate()
1083 return self.__add__(other.copy_negate(), context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001084
1085 def __rsub__(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001086 """Return other - self"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001087 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001088 if other is NotImplemented:
1089 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001090
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001091 return other.__sub__(self, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001092
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001093 def __mul__(self, other, context=None):
1094 """Return self * other.
1095
1096 (+-) INF * 0 (or its reverse) raise InvalidOperation.
1097 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001098 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001099 if other is NotImplemented:
1100 return other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001101
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001102 if context is None:
1103 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001104
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +00001105 resultsign = self._sign ^ other._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001106
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001107 if self._is_special or other._is_special:
1108 ans = self._check_nans(other, context)
1109 if ans:
1110 return ans
1111
1112 if self._isinfinity():
1113 if not other:
1114 return context._raise_error(InvalidOperation, '(+-)INF * 0')
1115 return Infsign[resultsign]
1116
1117 if other._isinfinity():
1118 if not self:
1119 return context._raise_error(InvalidOperation, '0 * (+-)INF')
1120 return Infsign[resultsign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001121
1122 resultexp = self._exp + other._exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001123
1124 # Special case for multiplying by zero
1125 if not self or not other:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001126 ans = _dec_from_triple(resultsign, '0', resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001127 # Fixing in case the exponent is out of bounds
1128 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001129 return ans
1130
1131 # Special case for multiplying by power of 10
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001132 if self._int == '1':
1133 ans = _dec_from_triple(resultsign, other._int, resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001134 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001135 return ans
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001136 if other._int == '1':
1137 ans = _dec_from_triple(resultsign, self._int, resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001138 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001139 return ans
1140
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001141 op1 = _WorkRep(self)
1142 op2 = _WorkRep(other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001143
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001144 ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001145 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001146
1147 return ans
1148 __rmul__ = __mul__
1149
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001150 def __truediv__(self, other, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001151 """Return self / other."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001152 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001153 if other is NotImplemented:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001154 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001155
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001156 if context is None:
1157 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001158
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +00001159 sign = self._sign ^ other._sign
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001160
1161 if self._is_special or other._is_special:
1162 ans = self._check_nans(other, context)
1163 if ans:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001164 return ans
1165
1166 if self._isinfinity() and other._isinfinity():
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001167 return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001168
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001169 if self._isinfinity():
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001170 return Infsign[sign]
1171
1172 if other._isinfinity():
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001173 context._raise_error(Clamped, 'Division by infinity')
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001174 return _dec_from_triple(sign, '0', context.Etiny())
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001175
1176 # Special cases for zeroes
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001177 if not other:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001178 if not self:
1179 return context._raise_error(DivisionUndefined, '0 / 0')
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001180 return context._raise_error(DivisionByZero, 'x / 0', sign)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001181
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001182 if not self:
1183 exp = self._exp - other._exp
1184 coeff = 0
1185 else:
1186 # OK, so neither = 0, INF or NaN
1187 shift = len(other._int) - len(self._int) + context.prec + 1
1188 exp = self._exp - other._exp - shift
1189 op1 = _WorkRep(self)
1190 op2 = _WorkRep(other)
1191 if shift >= 0:
1192 coeff, remainder = divmod(op1.int * 10**shift, op2.int)
1193 else:
1194 coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
1195 if remainder:
1196 # result is not exact; adjust to ensure correct rounding
1197 if coeff % 5 == 0:
1198 coeff += 1
1199 else:
1200 # result is exact; get as close to ideal exponent as possible
1201 ideal_exp = self._exp - other._exp
1202 while exp < ideal_exp and coeff % 10 == 0:
1203 coeff //= 10
1204 exp += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001205
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001206 ans = _dec_from_triple(sign, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001207 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001208
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001209 def _divide(self, other, context):
1210 """Return (self // other, self % other), to context.prec precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001211
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001212 Assumes that neither self nor other is a NaN, that self is not
1213 infinite and that other is nonzero.
1214 """
1215 sign = self._sign ^ other._sign
1216 if other._isinfinity():
1217 ideal_exp = self._exp
1218 else:
1219 ideal_exp = min(self._exp, other._exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001220
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001221 expdiff = self.adjusted() - other.adjusted()
1222 if not self or other._isinfinity() or expdiff <= -2:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001223 return (_dec_from_triple(sign, '0', 0),
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001224 self._rescale(ideal_exp, context.rounding))
1225 if expdiff <= context.prec:
1226 op1 = _WorkRep(self)
1227 op2 = _WorkRep(other)
1228 if op1.exp >= op2.exp:
1229 op1.int *= 10**(op1.exp - op2.exp)
1230 else:
1231 op2.int *= 10**(op2.exp - op1.exp)
1232 q, r = divmod(op1.int, op2.int)
1233 if q < 10**context.prec:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001234 return (_dec_from_triple(sign, str(q), 0),
1235 _dec_from_triple(self._sign, str(r), ideal_exp))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001236
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001237 # Here the quotient is too large to be representable
1238 ans = context._raise_error(DivisionImpossible,
1239 'quotient too large in //, % or divmod')
1240 return ans, ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001241
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001242 def __rtruediv__(self, other, context=None):
1243 """Swaps self/other and returns __truediv__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001244 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001245 if other is NotImplemented:
1246 return other
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001247 return other.__truediv__(self, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001248
1249 def __divmod__(self, other, context=None):
1250 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001251 Return (self // other, self % other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001252 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001253 other = _convert_other(other)
1254 if other is NotImplemented:
1255 return other
1256
1257 if context is None:
1258 context = getcontext()
1259
1260 ans = self._check_nans(other, context)
1261 if ans:
1262 return (ans, ans)
1263
1264 sign = self._sign ^ other._sign
1265 if self._isinfinity():
1266 if other._isinfinity():
1267 ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
1268 return ans, ans
1269 else:
1270 return (Infsign[sign],
1271 context._raise_error(InvalidOperation, 'INF % x'))
1272
1273 if not other:
1274 if not self:
1275 ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
1276 return ans, ans
1277 else:
1278 return (context._raise_error(DivisionByZero, 'x // 0', sign),
1279 context._raise_error(InvalidOperation, 'x % 0'))
1280
1281 quotient, remainder = self._divide(other, context)
Christian Heimes2c181612007-12-17 20:04:13 +00001282 remainder = remainder._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001283 return quotient, remainder
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001284
1285 def __rdivmod__(self, other, context=None):
1286 """Swaps self/other and returns __divmod__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001287 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001288 if other is NotImplemented:
1289 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001290 return other.__divmod__(self, context=context)
1291
1292 def __mod__(self, other, context=None):
1293 """
1294 self % other
1295 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001296 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001297 if other is NotImplemented:
1298 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001299
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001300 if context is None:
1301 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001302
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001303 ans = self._check_nans(other, context)
1304 if ans:
1305 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001306
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001307 if self._isinfinity():
1308 return context._raise_error(InvalidOperation, 'INF % x')
1309 elif not other:
1310 if self:
1311 return context._raise_error(InvalidOperation, 'x % 0')
1312 else:
1313 return context._raise_error(DivisionUndefined, '0 % 0')
1314
1315 remainder = self._divide(other, context)[1]
Christian Heimes2c181612007-12-17 20:04:13 +00001316 remainder = remainder._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001317 return remainder
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001318
1319 def __rmod__(self, other, context=None):
1320 """Swaps self/other and returns __mod__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001321 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001322 if other is NotImplemented:
1323 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001324 return other.__mod__(self, context=context)
1325
1326 def remainder_near(self, other, context=None):
1327 """
1328 Remainder nearest to 0- abs(remainder-near) <= other/2
1329 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001330 if context is None:
1331 context = getcontext()
1332
1333 other = _convert_other(other, raiseit=True)
1334
1335 ans = self._check_nans(other, context)
1336 if ans:
1337 return ans
1338
1339 # self == +/-infinity -> InvalidOperation
1340 if self._isinfinity():
1341 return context._raise_error(InvalidOperation,
1342 'remainder_near(infinity, x)')
1343
1344 # other == 0 -> either InvalidOperation or DivisionUndefined
1345 if not other:
1346 if self:
1347 return context._raise_error(InvalidOperation,
1348 'remainder_near(x, 0)')
1349 else:
1350 return context._raise_error(DivisionUndefined,
1351 'remainder_near(0, 0)')
1352
1353 # other = +/-infinity -> remainder = self
1354 if other._isinfinity():
1355 ans = Decimal(self)
1356 return ans._fix(context)
1357
1358 # self = 0 -> remainder = self, with ideal exponent
1359 ideal_exponent = min(self._exp, other._exp)
1360 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001361 ans = _dec_from_triple(self._sign, '0', ideal_exponent)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001362 return ans._fix(context)
1363
1364 # catch most cases of large or small quotient
1365 expdiff = self.adjusted() - other.adjusted()
1366 if expdiff >= context.prec + 1:
1367 # expdiff >= prec+1 => abs(self/other) > 10**prec
1368 return context._raise_error(DivisionImpossible)
1369 if expdiff <= -2:
1370 # expdiff <= -2 => abs(self/other) < 0.1
1371 ans = self._rescale(ideal_exponent, context.rounding)
1372 return ans._fix(context)
1373
1374 # adjust both arguments to have the same exponent, then divide
1375 op1 = _WorkRep(self)
1376 op2 = _WorkRep(other)
1377 if op1.exp >= op2.exp:
1378 op1.int *= 10**(op1.exp - op2.exp)
1379 else:
1380 op2.int *= 10**(op2.exp - op1.exp)
1381 q, r = divmod(op1.int, op2.int)
1382 # remainder is r*10**ideal_exponent; other is +/-op2.int *
1383 # 10**ideal_exponent. Apply correction to ensure that
1384 # abs(remainder) <= abs(other)/2
1385 if 2*r + (q&1) > op2.int:
1386 r -= op2.int
1387 q += 1
1388
1389 if q >= 10**context.prec:
1390 return context._raise_error(DivisionImpossible)
1391
1392 # result has same sign as self unless r is negative
1393 sign = self._sign
1394 if r < 0:
1395 sign = 1-sign
1396 r = -r
1397
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001398 ans = _dec_from_triple(sign, str(r), ideal_exponent)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001399 return ans._fix(context)
1400
1401 def __floordiv__(self, other, context=None):
1402 """self // other"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001403 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001404 if other is NotImplemented:
1405 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001406
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001407 if context is None:
1408 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001409
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001410 ans = self._check_nans(other, context)
1411 if ans:
1412 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001413
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001414 if self._isinfinity():
1415 if other._isinfinity():
1416 return context._raise_error(InvalidOperation, 'INF // INF')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001417 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001418 return Infsign[self._sign ^ other._sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001419
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001420 if not other:
1421 if self:
1422 return context._raise_error(DivisionByZero, 'x // 0',
1423 self._sign ^ other._sign)
1424 else:
1425 return context._raise_error(DivisionUndefined, '0 // 0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001426
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001427 return self._divide(other, context)[0]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001428
1429 def __rfloordiv__(self, other, context=None):
1430 """Swaps self/other and returns __floordiv__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001431 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001432 if other is NotImplemented:
1433 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001434 return other.__floordiv__(self, context=context)
1435
1436 def __float__(self):
1437 """Float representation."""
1438 return float(str(self))
1439
1440 def __int__(self):
Brett Cannon46b08022005-03-01 03:12:26 +00001441 """Converts self to an int, truncating if necessary."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001442 if self._is_special:
1443 if self._isnan():
1444 context = getcontext()
1445 return context._raise_error(InvalidContext)
1446 elif self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001447 raise OverflowError("Cannot convert infinity to int")
1448 s = (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001449 if self._exp >= 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001450 return s*int(self._int)*10**self._exp
Raymond Hettinger605ed022004-11-24 07:28:48 +00001451 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001452 return s*int(self._int[:self._exp] or '0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001453
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001454 def _fix_nan(self, context):
1455 """Decapitate the payload of a NaN to fit the context"""
1456 payload = self._int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001457
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001458 # maximum length of payload is precision if _clamp=0,
1459 # precision-1 if _clamp=1.
1460 max_payload_len = context.prec - context._clamp
1461 if len(payload) > max_payload_len:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001462 payload = payload[len(payload)-max_payload_len:].lstrip('0')
1463 return _dec_from_triple(self._sign, payload, self._exp, True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001464 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001465
Raymond Hettingerdab988d2004-10-09 07:10:44 +00001466 def _fix(self, context):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001467 """Round if it is necessary to keep self within prec precision.
1468
1469 Rounds and fixes the exponent. Does not raise on a sNaN.
1470
1471 Arguments:
1472 self - Decimal instance
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001473 context - context used.
1474 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001475
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001476 if self._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001477 if self._isnan():
1478 # decapitate payload if necessary
1479 return self._fix_nan(context)
1480 else:
1481 # self is +/-Infinity; return unaltered
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001482 return Decimal(self)
1483
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001484 # if self is zero then exponent should be between Etiny and
1485 # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.
1486 Etiny = context.Etiny()
1487 Etop = context.Etop()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001488 if not self:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001489 exp_max = [context.Emax, Etop][context._clamp]
1490 new_exp = min(max(self._exp, Etiny), exp_max)
1491 if new_exp != self._exp:
1492 context._raise_error(Clamped)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001493 return _dec_from_triple(self._sign, '0', new_exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001494 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001495 return Decimal(self)
1496
1497 # exp_min is the smallest allowable exponent of the result,
1498 # equal to max(self.adjusted()-context.prec+1, Etiny)
1499 exp_min = len(self._int) + self._exp - context.prec
1500 if exp_min > Etop:
1501 # overflow: exp_min > Etop iff self.adjusted() > Emax
1502 context._raise_error(Inexact)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001503 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001504 return context._raise_error(Overflow, 'above Emax', self._sign)
1505 self_is_subnormal = exp_min < Etiny
1506 if self_is_subnormal:
1507 context._raise_error(Subnormal)
1508 exp_min = Etiny
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001509
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001510 # round if self has too many digits
1511 if self._exp < exp_min:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001512 context._raise_error(Rounded)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001513 digits = len(self._int) + self._exp - exp_min
1514 if digits < 0:
1515 self = _dec_from_triple(self._sign, '1', exp_min-1)
1516 digits = 0
1517 this_function = getattr(self, self._pick_rounding_function[context.rounding])
1518 changed = this_function(digits)
1519 coeff = self._int[:digits] or '0'
1520 if changed == 1:
1521 coeff = str(int(coeff)+1)
1522 ans = _dec_from_triple(self._sign, coeff, exp_min)
1523
1524 if changed:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001525 context._raise_error(Inexact)
1526 if self_is_subnormal:
1527 context._raise_error(Underflow)
1528 if not ans:
1529 # raise Clamped on underflow to 0
1530 context._raise_error(Clamped)
1531 elif len(ans._int) == context.prec+1:
1532 # we get here only if rescaling rounds the
1533 # cofficient up to exactly 10**context.prec
1534 if ans._exp < Etop:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001535 ans = _dec_from_triple(ans._sign,
1536 ans._int[:-1], ans._exp+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001537 else:
1538 # Inexact and Rounded have already been raised
1539 ans = context._raise_error(Overflow, 'above Emax',
1540 self._sign)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001541 return ans
1542
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001543 # fold down if _clamp == 1 and self has too few digits
1544 if context._clamp == 1 and self._exp > Etop:
1545 context._raise_error(Clamped)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001546 self_padded = self._int + '0'*(self._exp - Etop)
1547 return _dec_from_triple(self._sign, self_padded, Etop)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001548
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001549 # here self was representable to begin with; return unchanged
1550 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001551
1552 _pick_rounding_function = {}
1553
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001554 # for each of the rounding functions below:
1555 # self is a finite, nonzero Decimal
1556 # prec is an integer satisfying 0 <= prec < len(self._int)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001557 #
1558 # each function returns either -1, 0, or 1, as follows:
1559 # 1 indicates that self should be rounded up (away from zero)
1560 # 0 indicates that self should be truncated, and that all the
1561 # digits to be truncated are zeros (so the value is unchanged)
1562 # -1 indicates that there are nonzero digits to be truncated
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001563
1564 def _round_down(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001565 """Also known as round-towards-0, truncate."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001566 if _all_zeros(self._int, prec):
1567 return 0
1568 else:
1569 return -1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001570
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001571 def _round_up(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001572 """Rounds away from 0."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001573 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001574
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001575 def _round_half_up(self, prec):
1576 """Rounds 5 up (away from 0)"""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001577 if self._int[prec] in '56789':
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001578 return 1
1579 elif _all_zeros(self._int, prec):
1580 return 0
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001581 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001582 return -1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001583
1584 def _round_half_down(self, prec):
1585 """Round 5 down"""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001586 if _exact_half(self._int, prec):
1587 return -1
1588 else:
1589 return self._round_half_up(prec)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001590
1591 def _round_half_even(self, prec):
1592 """Round 5 to even, rest to nearest."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001593 if _exact_half(self._int, prec) and \
1594 (prec == 0 or self._int[prec-1] in '02468'):
1595 return -1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001596 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001597 return self._round_half_up(prec)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001598
1599 def _round_ceiling(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001600 """Rounds up (not away from 0 if negative.)"""
1601 if self._sign:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001602 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001603 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001604 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001605
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001606 def _round_floor(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001607 """Rounds down (not towards 0 if negative)"""
1608 if not self._sign:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001609 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001610 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001611 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001612
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001613 def _round_05up(self, prec):
1614 """Round down unless digit prec-1 is 0 or 5."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001615 if prec and self._int[prec-1] not in '05':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001616 return self._round_down(prec)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001617 else:
1618 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001619
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001620 def fma(self, other, third, context=None):
1621 """Fused multiply-add.
1622
1623 Returns self*other+third with no rounding of the intermediate
1624 product self*other.
1625
1626 self and other are multiplied together, with no rounding of
1627 the result. The third operand is then added to the result,
1628 and a single final rounding is performed.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001629 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001630
1631 other = _convert_other(other, raiseit=True)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001632
1633 # compute product; raise InvalidOperation if either operand is
1634 # a signaling NaN or if the product is zero times infinity.
1635 if self._is_special or other._is_special:
1636 if context is None:
1637 context = getcontext()
1638 if self._exp == 'N':
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001639 return context._raise_error(InvalidOperation, 'sNaN', self)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001640 if other._exp == 'N':
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001641 return context._raise_error(InvalidOperation, 'sNaN', other)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001642 if self._exp == 'n':
1643 product = self
1644 elif other._exp == 'n':
1645 product = other
1646 elif self._exp == 'F':
1647 if not other:
1648 return context._raise_error(InvalidOperation,
1649 'INF * 0 in fma')
1650 product = Infsign[self._sign ^ other._sign]
1651 elif other._exp == 'F':
1652 if not self:
1653 return context._raise_error(InvalidOperation,
1654 '0 * INF in fma')
1655 product = Infsign[self._sign ^ other._sign]
1656 else:
1657 product = _dec_from_triple(self._sign ^ other._sign,
1658 str(int(self._int) * int(other._int)),
1659 self._exp + other._exp)
1660
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001661 third = _convert_other(third, raiseit=True)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001662 return product.__add__(third, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001663
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001664 def _power_modulo(self, other, modulo, context=None):
1665 """Three argument version of __pow__"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001666
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001667 # if can't convert other and modulo to Decimal, raise
1668 # TypeError; there's no point returning NotImplemented (no
1669 # equivalent of __rpow__ for three argument pow)
1670 other = _convert_other(other, raiseit=True)
1671 modulo = _convert_other(modulo, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001672
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001673 if context is None:
1674 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001675
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001676 # deal with NaNs: if there are any sNaNs then first one wins,
1677 # (i.e. behaviour for NaNs is identical to that of fma)
1678 self_is_nan = self._isnan()
1679 other_is_nan = other._isnan()
1680 modulo_is_nan = modulo._isnan()
1681 if self_is_nan or other_is_nan or modulo_is_nan:
1682 if self_is_nan == 2:
1683 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001684 self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001685 if other_is_nan == 2:
1686 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001687 other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001688 if modulo_is_nan == 2:
1689 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001690 modulo)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001691 if self_is_nan:
1692 return self._fix_nan(context)
1693 if other_is_nan:
1694 return other._fix_nan(context)
1695 return modulo._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001696
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001697 # check inputs: we apply same restrictions as Python's pow()
1698 if not (self._isinteger() and
1699 other._isinteger() and
1700 modulo._isinteger()):
1701 return context._raise_error(InvalidOperation,
1702 'pow() 3rd argument not allowed '
1703 'unless all arguments are integers')
1704 if other < 0:
1705 return context._raise_error(InvalidOperation,
1706 'pow() 2nd argument cannot be '
1707 'negative when 3rd argument specified')
1708 if not modulo:
1709 return context._raise_error(InvalidOperation,
1710 'pow() 3rd argument cannot be 0')
1711
1712 # additional restriction for decimal: the modulus must be less
1713 # than 10**prec in absolute value
1714 if modulo.adjusted() >= context.prec:
1715 return context._raise_error(InvalidOperation,
1716 'insufficient precision: pow() 3rd '
1717 'argument must not have more than '
1718 'precision digits')
1719
1720 # define 0**0 == NaN, for consistency with two-argument pow
1721 # (even though it hurts!)
1722 if not other and not self:
1723 return context._raise_error(InvalidOperation,
1724 'at least one of pow() 1st argument '
1725 'and 2nd argument must be nonzero ;'
1726 '0**0 is not defined')
1727
1728 # compute sign of result
1729 if other._iseven():
1730 sign = 0
1731 else:
1732 sign = self._sign
1733
1734 # convert modulo to a Python integer, and self and other to
1735 # Decimal integers (i.e. force their exponents to be >= 0)
1736 modulo = abs(int(modulo))
1737 base = _WorkRep(self.to_integral_value())
1738 exponent = _WorkRep(other.to_integral_value())
1739
1740 # compute result using integer pow()
1741 base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
1742 for i in range(exponent.exp):
1743 base = pow(base, 10, modulo)
1744 base = pow(base, exponent.int, modulo)
1745
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001746 return _dec_from_triple(sign, str(base), 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001747
1748 def _power_exact(self, other, p):
1749 """Attempt to compute self**other exactly.
1750
1751 Given Decimals self and other and an integer p, attempt to
1752 compute an exact result for the power self**other, with p
1753 digits of precision. Return None if self**other is not
1754 exactly representable in p digits.
1755
1756 Assumes that elimination of special cases has already been
1757 performed: self and other must both be nonspecial; self must
1758 be positive and not numerically equal to 1; other must be
1759 nonzero. For efficiency, other._exp should not be too large,
1760 so that 10**abs(other._exp) is a feasible calculation."""
1761
1762 # In the comments below, we write x for the value of self and
1763 # y for the value of other. Write x = xc*10**xe and y =
1764 # yc*10**ye.
1765
1766 # The main purpose of this method is to identify the *failure*
1767 # of x**y to be exactly representable with as little effort as
1768 # possible. So we look for cheap and easy tests that
1769 # eliminate the possibility of x**y being exact. Only if all
1770 # these tests are passed do we go on to actually compute x**y.
1771
1772 # Here's the main idea. First normalize both x and y. We
1773 # express y as a rational m/n, with m and n relatively prime
1774 # and n>0. Then for x**y to be exactly representable (at
1775 # *any* precision), xc must be the nth power of a positive
1776 # integer and xe must be divisible by n. If m is negative
1777 # then additionally xc must be a power of either 2 or 5, hence
1778 # a power of 2**n or 5**n.
1779 #
1780 # There's a limit to how small |y| can be: if y=m/n as above
1781 # then:
1782 #
1783 # (1) if xc != 1 then for the result to be representable we
1784 # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So
1785 # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
1786 # 2**(1/|y|), hence xc**|y| < 2 and the result is not
1787 # representable.
1788 #
1789 # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if
1790 # |y| < 1/|xe| then the result is not representable.
1791 #
1792 # Note that since x is not equal to 1, at least one of (1) and
1793 # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
1794 # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
1795 #
1796 # There's also a limit to how large y can be, at least if it's
1797 # positive: the normalized result will have coefficient xc**y,
1798 # so if it's representable then xc**y < 10**p, and y <
1799 # p/log10(xc). Hence if y*log10(xc) >= p then the result is
1800 # not exactly representable.
1801
1802 # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
1803 # so |y| < 1/xe and the result is not representable.
1804 # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
1805 # < 1/nbits(xc).
1806
1807 x = _WorkRep(self)
1808 xc, xe = x.int, x.exp
1809 while xc % 10 == 0:
1810 xc //= 10
1811 xe += 1
1812
1813 y = _WorkRep(other)
1814 yc, ye = y.int, y.exp
1815 while yc % 10 == 0:
1816 yc //= 10
1817 ye += 1
1818
1819 # case where xc == 1: result is 10**(xe*y), with xe*y
1820 # required to be an integer
1821 if xc == 1:
1822 if ye >= 0:
1823 exponent = xe*yc*10**ye
1824 else:
1825 exponent, remainder = divmod(xe*yc, 10**-ye)
1826 if remainder:
1827 return None
1828 if y.sign == 1:
1829 exponent = -exponent
1830 # if other is a nonnegative integer, use ideal exponent
1831 if other._isinteger() and other._sign == 0:
1832 ideal_exponent = self._exp*int(other)
1833 zeros = min(exponent-ideal_exponent, p-1)
1834 else:
1835 zeros = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001836 return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001837
1838 # case where y is negative: xc must be either a power
1839 # of 2 or a power of 5.
1840 if y.sign == 1:
1841 last_digit = xc % 10
1842 if last_digit in (2,4,6,8):
1843 # quick test for power of 2
1844 if xc & -xc != xc:
1845 return None
1846 # now xc is a power of 2; e is its exponent
1847 e = _nbits(xc)-1
1848 # find e*y and xe*y; both must be integers
1849 if ye >= 0:
1850 y_as_int = yc*10**ye
1851 e = e*y_as_int
1852 xe = xe*y_as_int
1853 else:
1854 ten_pow = 10**-ye
1855 e, remainder = divmod(e*yc, ten_pow)
1856 if remainder:
1857 return None
1858 xe, remainder = divmod(xe*yc, ten_pow)
1859 if remainder:
1860 return None
1861
1862 if e*65 >= p*93: # 93/65 > log(10)/log(5)
1863 return None
1864 xc = 5**e
1865
1866 elif last_digit == 5:
1867 # e >= log_5(xc) if xc is a power of 5; we have
1868 # equality all the way up to xc=5**2658
1869 e = _nbits(xc)*28//65
1870 xc, remainder = divmod(5**e, xc)
1871 if remainder:
1872 return None
1873 while xc % 5 == 0:
1874 xc //= 5
1875 e -= 1
1876 if ye >= 0:
1877 y_as_integer = yc*10**ye
1878 e = e*y_as_integer
1879 xe = xe*y_as_integer
1880 else:
1881 ten_pow = 10**-ye
1882 e, remainder = divmod(e*yc, ten_pow)
1883 if remainder:
1884 return None
1885 xe, remainder = divmod(xe*yc, ten_pow)
1886 if remainder:
1887 return None
1888 if e*3 >= p*10: # 10/3 > log(10)/log(2)
1889 return None
1890 xc = 2**e
1891 else:
1892 return None
1893
1894 if xc >= 10**p:
1895 return None
1896 xe = -e-xe
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001897 return _dec_from_triple(0, str(xc), xe)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001898
1899 # now y is positive; find m and n such that y = m/n
1900 if ye >= 0:
1901 m, n = yc*10**ye, 1
1902 else:
1903 if xe != 0 and len(str(abs(yc*xe))) <= -ye:
1904 return None
1905 xc_bits = _nbits(xc)
1906 if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
1907 return None
1908 m, n = yc, 10**(-ye)
1909 while m % 2 == n % 2 == 0:
1910 m //= 2
1911 n //= 2
1912 while m % 5 == n % 5 == 0:
1913 m //= 5
1914 n //= 5
1915
1916 # compute nth root of xc*10**xe
1917 if n > 1:
1918 # if 1 < xc < 2**n then xc isn't an nth power
1919 if xc != 1 and xc_bits <= n:
1920 return None
1921
1922 xe, rem = divmod(xe, n)
1923 if rem != 0:
1924 return None
1925
1926 # compute nth root of xc using Newton's method
1927 a = 1 << -(-_nbits(xc)//n) # initial estimate
1928 while True:
1929 q, r = divmod(xc, a**(n-1))
1930 if a <= q:
1931 break
1932 else:
1933 a = (a*(n-1) + q)//n
1934 if not (a == q and r == 0):
1935 return None
1936 xc = a
1937
1938 # now xc*10**xe is the nth root of the original xc*10**xe
1939 # compute mth power of xc*10**xe
1940
1941 # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
1942 # 10**p and the result is not representable.
1943 if xc > 1 and m > p*100//_log10_lb(xc):
1944 return None
1945 xc = xc**m
1946 xe *= m
1947 if xc > 10**p:
1948 return None
1949
1950 # by this point the result *is* exactly representable
1951 # adjust the exponent to get as close as possible to the ideal
1952 # exponent, if necessary
1953 str_xc = str(xc)
1954 if other._isinteger() and other._sign == 0:
1955 ideal_exponent = self._exp*int(other)
1956 zeros = min(xe-ideal_exponent, p-len(str_xc))
1957 else:
1958 zeros = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001959 return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001960
1961 def __pow__(self, other, modulo=None, context=None):
1962 """Return self ** other [ % modulo].
1963
1964 With two arguments, compute self**other.
1965
1966 With three arguments, compute (self**other) % modulo. For the
1967 three argument form, the following restrictions on the
1968 arguments hold:
1969
1970 - all three arguments must be integral
1971 - other must be nonnegative
1972 - either self or other (or both) must be nonzero
1973 - modulo must be nonzero and must have at most p digits,
1974 where p is the context precision.
1975
1976 If any of these restrictions is violated the InvalidOperation
1977 flag is raised.
1978
1979 The result of pow(self, other, modulo) is identical to the
1980 result that would be obtained by computing (self**other) %
1981 modulo with unbounded precision, but is computed more
1982 efficiently. It is always exact.
1983 """
1984
1985 if modulo is not None:
1986 return self._power_modulo(other, modulo, context)
1987
1988 other = _convert_other(other)
1989 if other is NotImplemented:
1990 return other
1991
1992 if context is None:
1993 context = getcontext()
1994
1995 # either argument is a NaN => result is NaN
1996 ans = self._check_nans(other, context)
1997 if ans:
1998 return ans
1999
2000 # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
2001 if not other:
2002 if not self:
2003 return context._raise_error(InvalidOperation, '0 ** 0')
2004 else:
2005 return Dec_p1
2006
2007 # result has sign 1 iff self._sign is 1 and other is an odd integer
2008 result_sign = 0
2009 if self._sign == 1:
2010 if other._isinteger():
2011 if not other._iseven():
2012 result_sign = 1
2013 else:
2014 # -ve**noninteger = NaN
2015 # (-0)**noninteger = 0**noninteger
2016 if self:
2017 return context._raise_error(InvalidOperation,
2018 'x ** y with x negative and y not an integer')
2019 # negate self, without doing any unwanted rounding
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002020 self = self.copy_negate()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002021
2022 # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
2023 if not self:
2024 if other._sign == 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002025 return _dec_from_triple(result_sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002026 else:
2027 return Infsign[result_sign]
2028
2029 # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002030 if self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002031 if other._sign == 0:
2032 return Infsign[result_sign]
2033 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002034 return _dec_from_triple(result_sign, '0', 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002035
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002036 # 1**other = 1, but the choice of exponent and the flags
2037 # depend on the exponent of self, and on whether other is a
2038 # positive integer, a negative integer, or neither
2039 if self == Dec_p1:
2040 if other._isinteger():
2041 # exp = max(self._exp*max(int(other), 0),
2042 # 1-context.prec) but evaluating int(other) directly
2043 # is dangerous until we know other is small (other
2044 # could be 1e999999999)
2045 if other._sign == 1:
2046 multiplier = 0
2047 elif other > context.prec:
2048 multiplier = context.prec
2049 else:
2050 multiplier = int(other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002051
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002052 exp = self._exp * multiplier
2053 if exp < 1-context.prec:
2054 exp = 1-context.prec
2055 context._raise_error(Rounded)
2056 else:
2057 context._raise_error(Inexact)
2058 context._raise_error(Rounded)
2059 exp = 1-context.prec
2060
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002061 return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002062
2063 # compute adjusted exponent of self
2064 self_adj = self.adjusted()
2065
2066 # self ** infinity is infinity if self > 1, 0 if self < 1
2067 # self ** -infinity is infinity if self < 1, 0 if self > 1
2068 if other._isinfinity():
2069 if (other._sign == 0) == (self_adj < 0):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002070 return _dec_from_triple(result_sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002071 else:
2072 return Infsign[result_sign]
2073
2074 # from here on, the result always goes through the call
2075 # to _fix at the end of this function.
2076 ans = None
2077
2078 # crude test to catch cases of extreme overflow/underflow. If
2079 # log10(self)*other >= 10**bound and bound >= len(str(Emax))
2080 # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
2081 # self**other >= 10**(Emax+1), so overflow occurs. The test
2082 # for underflow is similar.
2083 bound = self._log10_exp_bound() + other.adjusted()
2084 if (self_adj >= 0) == (other._sign == 0):
2085 # self > 1 and other +ve, or self < 1 and other -ve
2086 # possibility of overflow
2087 if bound >= len(str(context.Emax)):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002088 ans = _dec_from_triple(result_sign, '1', context.Emax+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002089 else:
2090 # self > 1 and other -ve, or self < 1 and other +ve
2091 # possibility of underflow to 0
2092 Etiny = context.Etiny()
2093 if bound >= len(str(-Etiny)):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002094 ans = _dec_from_triple(result_sign, '1', Etiny-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002095
2096 # try for an exact result with precision +1
2097 if ans is None:
2098 ans = self._power_exact(other, context.prec + 1)
2099 if ans is not None and result_sign == 1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002100 ans = _dec_from_triple(1, ans._int, ans._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002101
2102 # usual case: inexact result, x**y computed directly as exp(y*log(x))
2103 if ans is None:
2104 p = context.prec
2105 x = _WorkRep(self)
2106 xc, xe = x.int, x.exp
2107 y = _WorkRep(other)
2108 yc, ye = y.int, y.exp
2109 if y.sign == 1:
2110 yc = -yc
2111
2112 # compute correctly rounded result: start with precision +3,
2113 # then increase precision until result is unambiguously roundable
2114 extra = 3
2115 while True:
2116 coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
2117 if coeff % (5*10**(len(str(coeff))-p-1)):
2118 break
2119 extra += 3
2120
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002121 ans = _dec_from_triple(result_sign, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002122
2123 # the specification says that for non-integer other we need to
2124 # raise Inexact, even when the result is actually exact. In
2125 # the same way, we need to raise Underflow here if the result
2126 # is subnormal. (The call to _fix will take care of raising
2127 # Rounded and Subnormal, as usual.)
2128 if not other._isinteger():
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002129 context._raise_error(Inexact)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002130 # pad with zeros up to length context.prec+1 if necessary
2131 if len(ans._int) <= context.prec:
2132 expdiff = context.prec+1 - len(ans._int)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002133 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
2134 ans._exp-expdiff)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002135 if ans.adjusted() < context.Emin:
2136 context._raise_error(Underflow)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002137
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002138 # unlike exp, ln and log10, the power function respects the
2139 # rounding mode; no need to use ROUND_HALF_EVEN here
2140 ans = ans._fix(context)
2141 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002142
2143 def __rpow__(self, other, context=None):
2144 """Swaps self/other and returns __pow__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002145 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00002146 if other is NotImplemented:
2147 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002148 return other.__pow__(self, context=context)
2149
2150 def normalize(self, context=None):
2151 """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002152
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002153 if context is None:
2154 context = getcontext()
2155
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002156 if self._is_special:
2157 ans = self._check_nans(context=context)
2158 if ans:
2159 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002160
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002161 dup = self._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002162 if dup._isinfinity():
2163 return dup
2164
2165 if not dup:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002166 return _dec_from_triple(dup._sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002167 exp_max = [context.Emax, context.Etop()][context._clamp]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002168 end = len(dup._int)
2169 exp = dup._exp
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002170 while dup._int[end-1] == '0' and exp < exp_max:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002171 exp += 1
2172 end -= 1
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002173 return _dec_from_triple(dup._sign, dup._int[:end], exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002174
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002175 def quantize(self, exp, rounding=None, context=None, watchexp=True):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002176 """Quantize self so its exponent is the same as that of exp.
2177
2178 Similar to self._rescale(exp._exp) but with error checking.
2179 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002180 exp = _convert_other(exp, raiseit=True)
2181
2182 if context is None:
2183 context = getcontext()
2184 if rounding is None:
2185 rounding = context.rounding
2186
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002187 if self._is_special or exp._is_special:
2188 ans = self._check_nans(exp, context)
2189 if ans:
2190 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002191
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002192 if exp._isinfinity() or self._isinfinity():
2193 if exp._isinfinity() and self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002194 return Decimal(self) # if both are inf, it is OK
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002195 return context._raise_error(InvalidOperation,
2196 'quantize with one INF')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002197
2198 # if we're not watching exponents, do a simple rescale
2199 if not watchexp:
2200 ans = self._rescale(exp._exp, rounding)
2201 # raise Inexact and Rounded where appropriate
2202 if ans._exp > self._exp:
2203 context._raise_error(Rounded)
2204 if ans != self:
2205 context._raise_error(Inexact)
2206 return ans
2207
2208 # exp._exp should be between Etiny and Emax
2209 if not (context.Etiny() <= exp._exp <= context.Emax):
2210 return context._raise_error(InvalidOperation,
2211 'target exponent out of bounds in quantize')
2212
2213 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002214 ans = _dec_from_triple(self._sign, '0', exp._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002215 return ans._fix(context)
2216
2217 self_adjusted = self.adjusted()
2218 if self_adjusted > context.Emax:
2219 return context._raise_error(InvalidOperation,
2220 'exponent of quantize result too large for current context')
2221 if self_adjusted - exp._exp + 1 > context.prec:
2222 return context._raise_error(InvalidOperation,
2223 'quantize result has too many digits for current context')
2224
2225 ans = self._rescale(exp._exp, rounding)
2226 if ans.adjusted() > context.Emax:
2227 return context._raise_error(InvalidOperation,
2228 'exponent of quantize result too large for current context')
2229 if len(ans._int) > context.prec:
2230 return context._raise_error(InvalidOperation,
2231 'quantize result has too many digits for current context')
2232
2233 # raise appropriate flags
2234 if ans._exp > self._exp:
2235 context._raise_error(Rounded)
2236 if ans != self:
2237 context._raise_error(Inexact)
2238 if ans and ans.adjusted() < context.Emin:
2239 context._raise_error(Subnormal)
2240
2241 # call to fix takes care of any necessary folddown
2242 ans = ans._fix(context)
2243 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002244
2245 def same_quantum(self, other):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002246 """Return True if self and other have the same exponent; otherwise
2247 return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002248
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002249 If either operand is a special value, the following rules are used:
2250 * return True if both operands are infinities
2251 * return True if both operands are NaNs
2252 * otherwise, return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002253 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002254 other = _convert_other(other, raiseit=True)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002255 if self._is_special or other._is_special:
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002256 return (self.is_nan() and other.is_nan() or
2257 self.is_infinite() and other.is_infinite())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002258 return self._exp == other._exp
2259
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002260 def _rescale(self, exp, rounding):
2261 """Rescale self so that the exponent is exp, either by padding with zeros
2262 or by truncating digits, using the given rounding mode.
2263
2264 Specials are returned without change. This operation is
2265 quiet: it raises no flags, and uses no information from the
2266 context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002267
2268 exp = exp to scale to (an integer)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002269 rounding = rounding mode
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002270 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002271 if self._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002272 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002273 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002274 return _dec_from_triple(self._sign, '0', exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002275
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002276 if self._exp >= exp:
2277 # pad answer with zeros if necessary
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002278 return _dec_from_triple(self._sign,
2279 self._int + '0'*(self._exp - exp), exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002280
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002281 # too many digits; round and lose data. If self.adjusted() <
2282 # exp-1, replace self by 10**(exp-1) before rounding
2283 digits = len(self._int) + self._exp - exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002284 if digits < 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002285 self = _dec_from_triple(self._sign, '1', exp-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002286 digits = 0
2287 this_function = getattr(self, self._pick_rounding_function[rounding])
Christian Heimescbf3b5c2007-12-03 21:02:03 +00002288 changed = this_function(digits)
2289 coeff = self._int[:digits] or '0'
2290 if changed == 1:
2291 coeff = str(int(coeff)+1)
2292 return _dec_from_triple(self._sign, coeff, exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002293
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002294 def to_integral_exact(self, rounding=None, context=None):
2295 """Rounds to a nearby integer.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002296
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002297 If no rounding mode is specified, take the rounding mode from
2298 the context. This method raises the Rounded and Inexact flags
2299 when appropriate.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002300
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002301 See also: to_integral_value, which does exactly the same as
2302 this method except that it doesn't raise Inexact or Rounded.
2303 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002304 if self._is_special:
2305 ans = self._check_nans(context=context)
2306 if ans:
2307 return ans
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002308 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002309 if self._exp >= 0:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002310 return Decimal(self)
2311 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002312 return _dec_from_triple(self._sign, '0', 0)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002313 if context is None:
2314 context = getcontext()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002315 if rounding is None:
2316 rounding = context.rounding
2317 context._raise_error(Rounded)
2318 ans = self._rescale(0, rounding)
2319 if ans != self:
2320 context._raise_error(Inexact)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002321 return ans
2322
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002323 def to_integral_value(self, rounding=None, context=None):
2324 """Rounds to the nearest integer, without raising inexact, rounded."""
2325 if context is None:
2326 context = getcontext()
2327 if rounding is None:
2328 rounding = context.rounding
2329 if self._is_special:
2330 ans = self._check_nans(context=context)
2331 if ans:
2332 return ans
2333 return Decimal(self)
2334 if self._exp >= 0:
2335 return Decimal(self)
2336 else:
2337 return self._rescale(0, rounding)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002338
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002339 # the method name changed, but we provide also the old one, for compatibility
2340 to_integral = to_integral_value
2341
2342 def sqrt(self, context=None):
2343 """Return the square root of self."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002344 if self._is_special:
2345 ans = self._check_nans(context=context)
2346 if ans:
2347 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002348
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002349 if self._isinfinity() and self._sign == 0:
2350 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002351
2352 if not self:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002353 # exponent = self._exp // 2. sqrt(-0) = -0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002354 ans = _dec_from_triple(self._sign, '0', self._exp // 2)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002355 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002356
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002357 if context is None:
2358 context = getcontext()
2359
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002360 if self._sign == 1:
2361 return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
2362
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002363 # At this point self represents a positive number. Let p be
2364 # the desired precision and express self in the form c*100**e
2365 # with c a positive real number and e an integer, c and e
2366 # being chosen so that 100**(p-1) <= c < 100**p. Then the
2367 # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
2368 # <= sqrt(c) < 10**p, so the closest representable Decimal at
2369 # precision p is n*10**e where n = round_half_even(sqrt(c)),
2370 # the closest integer to sqrt(c) with the even integer chosen
2371 # in the case of a tie.
2372 #
2373 # To ensure correct rounding in all cases, we use the
2374 # following trick: we compute the square root to an extra
2375 # place (precision p+1 instead of precision p), rounding down.
2376 # Then, if the result is inexact and its last digit is 0 or 5,
2377 # we increase the last digit to 1 or 6 respectively; if it's
2378 # exact we leave the last digit alone. Now the final round to
2379 # p places (or fewer in the case of underflow) will round
2380 # correctly and raise the appropriate flags.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002381
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002382 # use an extra digit of precision
2383 prec = context.prec+1
2384
2385 # write argument in the form c*100**e where e = self._exp//2
2386 # is the 'ideal' exponent, to be used if the square root is
2387 # exactly representable. l is the number of 'digits' of c in
2388 # base 100, so that 100**(l-1) <= c < 100**l.
2389 op = _WorkRep(self)
2390 e = op.exp >> 1
2391 if op.exp & 1:
2392 c = op.int * 10
2393 l = (len(self._int) >> 1) + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002394 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002395 c = op.int
2396 l = len(self._int)+1 >> 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002397
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002398 # rescale so that c has exactly prec base 100 'digits'
2399 shift = prec-l
2400 if shift >= 0:
2401 c *= 100**shift
2402 exact = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002403 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002404 c, remainder = divmod(c, 100**-shift)
2405 exact = not remainder
2406 e -= shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002407
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002408 # find n = floor(sqrt(c)) using Newton's method
2409 n = 10**prec
2410 while True:
2411 q = c//n
2412 if n <= q:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002413 break
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002414 else:
2415 n = n + q >> 1
2416 exact = exact and n*n == c
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002417
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002418 if exact:
2419 # result is exact; rescale to use ideal exponent e
2420 if shift >= 0:
2421 # assert n % 10**shift == 0
2422 n //= 10**shift
2423 else:
2424 n *= 10**-shift
2425 e += shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002426 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002427 # result is not exact; fix last digit as described above
2428 if n % 5 == 0:
2429 n += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002430
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002431 ans = _dec_from_triple(0, str(n), e)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002432
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002433 # round, and fit to current context
2434 context = context._shallow_copy()
2435 rounding = context._set_rounding(ROUND_HALF_EVEN)
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002436 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002437 context.rounding = rounding
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002438
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002439 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002440
2441 def max(self, other, context=None):
2442 """Returns the larger value.
2443
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002444 Like max(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002445 NaN (and signals if one is sNaN). Also rounds.
2446 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002447 other = _convert_other(other, raiseit=True)
2448
2449 if context is None:
2450 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002451
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002452 if self._is_special or other._is_special:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002453 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002454 # number is always returned
2455 sn = self._isnan()
2456 on = other._isnan()
2457 if sn or on:
2458 if on == 1 and sn != 2:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002459 return self._fix_nan(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002460 if sn == 1 and on != 2:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002461 return other._fix_nan(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002462 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002463
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002464 c = self.__cmp__(other)
2465 if c == 0:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002466 # If both operands are finite and equal in numerical value
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002467 # then an ordering is applied:
2468 #
Guido van Rossumd8faa362007-04-27 19:54:29 +00002469 # If the signs differ then max returns the operand with the
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002470 # positive sign and min returns the operand with the negative sign
2471 #
Guido van Rossumd8faa362007-04-27 19:54:29 +00002472 # If the signs are the same then the exponent is used to select
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002473 # the result. This is exactly the ordering used in compare_total.
2474 c = self.compare_total(other)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002475
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002476 if c == -1:
2477 ans = other
2478 else:
2479 ans = self
2480
Christian Heimes2c181612007-12-17 20:04:13 +00002481 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002482
2483 def min(self, other, context=None):
2484 """Returns the smaller value.
2485
Guido van Rossumd8faa362007-04-27 19:54:29 +00002486 Like min(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002487 NaN (and signals if one is sNaN). Also rounds.
2488 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002489 other = _convert_other(other, raiseit=True)
2490
2491 if context is None:
2492 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002493
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002494 if self._is_special or other._is_special:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002495 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002496 # number is always returned
2497 sn = self._isnan()
2498 on = other._isnan()
2499 if sn or on:
2500 if on == 1 and sn != 2:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002501 return self._fix_nan(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002502 if sn == 1 and on != 2:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002503 return other._fix_nan(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002504 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002505
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002506 c = self.__cmp__(other)
2507 if c == 0:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002508 c = self.compare_total(other)
2509
2510 if c == -1:
2511 ans = self
2512 else:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002513 ans = other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002514
Christian Heimes2c181612007-12-17 20:04:13 +00002515 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002516
2517 def _isinteger(self):
2518 """Returns whether self is an integer"""
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002519 if self._is_special:
2520 return False
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002521 if self._exp >= 0:
2522 return True
2523 rest = self._int[self._exp:]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002524 return rest == '0'*len(rest)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002525
2526 def _iseven(self):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002527 """Returns True if self is even. Assumes self is an integer."""
2528 if not self or self._exp > 0:
2529 return True
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002530 return self._int[-1+self._exp] in '02468'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002531
2532 def adjusted(self):
2533 """Return the adjusted exponent of self"""
2534 try:
2535 return self._exp + len(self._int) - 1
Guido van Rossumd8faa362007-04-27 19:54:29 +00002536 # If NaN or Infinity, self._exp is string
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002537 except TypeError:
2538 return 0
2539
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002540 def canonical(self, context=None):
2541 """Returns the same Decimal object.
2542
2543 As we do not have different encodings for the same number, the
2544 received object already is in its canonical form.
2545 """
2546 return self
2547
2548 def compare_signal(self, other, context=None):
2549 """Compares self to the other operand numerically.
2550
2551 It's pretty much like compare(), but all NaNs signal, with signaling
2552 NaNs taking precedence over quiet NaNs.
2553 """
2554 if context is None:
2555 context = getcontext()
2556
2557 self_is_nan = self._isnan()
2558 other_is_nan = other._isnan()
2559 if self_is_nan == 2:
2560 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00002561 self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002562 if other_is_nan == 2:
2563 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00002564 other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002565 if self_is_nan:
2566 return context._raise_error(InvalidOperation, 'NaN in compare_signal',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00002567 self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002568 if other_is_nan:
2569 return context._raise_error(InvalidOperation, 'NaN in compare_signal',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00002570 other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002571 return self.compare(other, context=context)
2572
2573 def compare_total(self, other):
2574 """Compares self to other using the abstract representations.
2575
2576 This is not like the standard compare, which use their numerical
2577 value. Note that a total ordering is defined for all possible abstract
2578 representations.
2579 """
2580 # if one is negative and the other is positive, it's easy
2581 if self._sign and not other._sign:
2582 return Dec_n1
2583 if not self._sign and other._sign:
2584 return Dec_p1
2585 sign = self._sign
2586
2587 # let's handle both NaN types
2588 self_nan = self._isnan()
2589 other_nan = other._isnan()
2590 if self_nan or other_nan:
2591 if self_nan == other_nan:
2592 if self._int < other._int:
2593 if sign:
2594 return Dec_p1
2595 else:
2596 return Dec_n1
2597 if self._int > other._int:
2598 if sign:
2599 return Dec_n1
2600 else:
2601 return Dec_p1
2602 return Dec_0
2603
2604 if sign:
2605 if self_nan == 1:
2606 return Dec_n1
2607 if other_nan == 1:
2608 return Dec_p1
2609 if self_nan == 2:
2610 return Dec_n1
2611 if other_nan == 2:
2612 return Dec_p1
2613 else:
2614 if self_nan == 1:
2615 return Dec_p1
2616 if other_nan == 1:
2617 return Dec_n1
2618 if self_nan == 2:
2619 return Dec_p1
2620 if other_nan == 2:
2621 return Dec_n1
2622
2623 if self < other:
2624 return Dec_n1
2625 if self > other:
2626 return Dec_p1
2627
2628 if self._exp < other._exp:
2629 if sign:
2630 return Dec_p1
2631 else:
2632 return Dec_n1
2633 if self._exp > other._exp:
2634 if sign:
2635 return Dec_n1
2636 else:
2637 return Dec_p1
2638 return Dec_0
2639
2640
2641 def compare_total_mag(self, other):
2642 """Compares self to other using abstract repr., ignoring sign.
2643
2644 Like compare_total, but with operand's sign ignored and assumed to be 0.
2645 """
2646 s = self.copy_abs()
2647 o = other.copy_abs()
2648 return s.compare_total(o)
2649
2650 def copy_abs(self):
2651 """Returns a copy with the sign set to 0. """
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002652 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002653
2654 def copy_negate(self):
2655 """Returns a copy with the sign inverted."""
2656 if self._sign:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002657 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002658 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002659 return _dec_from_triple(1, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002660
2661 def copy_sign(self, other):
2662 """Returns self with the sign of other."""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002663 return _dec_from_triple(other._sign, self._int,
2664 self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002665
2666 def exp(self, context=None):
2667 """Returns e ** self."""
2668
2669 if context is None:
2670 context = getcontext()
2671
2672 # exp(NaN) = NaN
2673 ans = self._check_nans(context=context)
2674 if ans:
2675 return ans
2676
2677 # exp(-Infinity) = 0
2678 if self._isinfinity() == -1:
2679 return Dec_0
2680
2681 # exp(0) = 1
2682 if not self:
2683 return Dec_p1
2684
2685 # exp(Infinity) = Infinity
2686 if self._isinfinity() == 1:
2687 return Decimal(self)
2688
2689 # the result is now guaranteed to be inexact (the true
2690 # mathematical result is transcendental). There's no need to
2691 # raise Rounded and Inexact here---they'll always be raised as
2692 # a result of the call to _fix.
2693 p = context.prec
2694 adj = self.adjusted()
2695
2696 # we only need to do any computation for quite a small range
2697 # of adjusted exponents---for example, -29 <= adj <= 10 for
2698 # the default context. For smaller exponent the result is
2699 # indistinguishable from 1 at the given precision, while for
2700 # larger exponent the result either overflows or underflows.
2701 if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
2702 # overflow
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002703 ans = _dec_from_triple(0, '1', context.Emax+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002704 elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
2705 # underflow to 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002706 ans = _dec_from_triple(0, '1', context.Etiny()-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002707 elif self._sign == 0 and adj < -p:
2708 # p+1 digits; final round will raise correct flags
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002709 ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002710 elif self._sign == 1 and adj < -p-1:
2711 # p+1 digits; final round will raise correct flags
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002712 ans = _dec_from_triple(0, '9'*(p+1), -p-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002713 # general case
2714 else:
2715 op = _WorkRep(self)
2716 c, e = op.int, op.exp
2717 if op.sign == 1:
2718 c = -c
2719
2720 # compute correctly rounded result: increase precision by
2721 # 3 digits at a time until we get an unambiguously
2722 # roundable result
2723 extra = 3
2724 while True:
2725 coeff, exp = _dexp(c, e, p+extra)
2726 if coeff % (5*10**(len(str(coeff))-p-1)):
2727 break
2728 extra += 3
2729
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002730 ans = _dec_from_triple(0, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002731
2732 # at this stage, ans should round correctly with *any*
2733 # rounding mode, not just with ROUND_HALF_EVEN
2734 context = context._shallow_copy()
2735 rounding = context._set_rounding(ROUND_HALF_EVEN)
2736 ans = ans._fix(context)
2737 context.rounding = rounding
2738
2739 return ans
2740
2741 def is_canonical(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002742 """Return True if self is canonical; otherwise return False.
2743
2744 Currently, the encoding of a Decimal instance is always
2745 canonical, so this method returns True for any Decimal.
2746 """
2747 return True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002748
2749 def is_finite(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002750 """Return True if self is finite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002751
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002752 A Decimal instance is considered finite if it is neither
2753 infinite nor a NaN.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002754 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002755 return not self._is_special
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002756
2757 def is_infinite(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002758 """Return True if self is infinite; otherwise return False."""
2759 return self._exp == 'F'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002760
2761 def is_nan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002762 """Return True if self is a qNaN or sNaN; otherwise return False."""
2763 return self._exp in ('n', 'N')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002764
2765 def is_normal(self, context=None):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002766 """Return True if self is a normal number; otherwise return False."""
2767 if self._is_special or not self:
2768 return False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002769 if context is None:
2770 context = getcontext()
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002771 return context.Emin <= self.adjusted() <= context.Emax
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002772
2773 def is_qnan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002774 """Return True if self is a quiet NaN; otherwise return False."""
2775 return self._exp == 'n'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002776
2777 def is_signed(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002778 """Return True if self is negative; otherwise return False."""
2779 return self._sign == 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002780
2781 def is_snan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002782 """Return True if self is a signaling NaN; otherwise return False."""
2783 return self._exp == 'N'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002784
2785 def is_subnormal(self, context=None):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002786 """Return True if self is subnormal; otherwise return False."""
2787 if self._is_special or not self:
2788 return False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002789 if context is None:
2790 context = getcontext()
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002791 return self.adjusted() < context.Emin
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002792
2793 def is_zero(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002794 """Return True if self is a zero; otherwise return False."""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002795 return not self._is_special and self._int == '0'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002796
2797 def _ln_exp_bound(self):
2798 """Compute a lower bound for the adjusted exponent of self.ln().
2799 In other words, compute r such that self.ln() >= 10**r. Assumes
2800 that self is finite and positive and that self != 1.
2801 """
2802
2803 # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
2804 adj = self._exp + len(self._int) - 1
2805 if adj >= 1:
2806 # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
2807 return len(str(adj*23//10)) - 1
2808 if adj <= -2:
2809 # argument <= 0.1
2810 return len(str((-1-adj)*23//10)) - 1
2811 op = _WorkRep(self)
2812 c, e = op.int, op.exp
2813 if adj == 0:
2814 # 1 < self < 10
2815 num = str(c-10**-e)
2816 den = str(c)
2817 return len(num) - len(den) - (num < den)
2818 # adj == -1, 0.1 <= self < 1
2819 return e + len(str(10**-e - c)) - 1
2820
2821
2822 def ln(self, context=None):
2823 """Returns the natural (base e) logarithm of self."""
2824
2825 if context is None:
2826 context = getcontext()
2827
2828 # ln(NaN) = NaN
2829 ans = self._check_nans(context=context)
2830 if ans:
2831 return ans
2832
2833 # ln(0.0) == -Infinity
2834 if not self:
2835 return negInf
2836
2837 # ln(Infinity) = Infinity
2838 if self._isinfinity() == 1:
2839 return Inf
2840
2841 # ln(1.0) == 0.0
2842 if self == Dec_p1:
2843 return Dec_0
2844
2845 # ln(negative) raises InvalidOperation
2846 if self._sign == 1:
2847 return context._raise_error(InvalidOperation,
2848 'ln of a negative value')
2849
2850 # result is irrational, so necessarily inexact
2851 op = _WorkRep(self)
2852 c, e = op.int, op.exp
2853 p = context.prec
2854
2855 # correctly rounded result: repeatedly increase precision by 3
2856 # until we get an unambiguously roundable result
2857 places = p - self._ln_exp_bound() + 2 # at least p+3 places
2858 while True:
2859 coeff = _dlog(c, e, places)
2860 # assert len(str(abs(coeff)))-p >= 1
2861 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
2862 break
2863 places += 3
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002864 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002865
2866 context = context._shallow_copy()
2867 rounding = context._set_rounding(ROUND_HALF_EVEN)
2868 ans = ans._fix(context)
2869 context.rounding = rounding
2870 return ans
2871
2872 def _log10_exp_bound(self):
2873 """Compute a lower bound for the adjusted exponent of self.log10().
2874 In other words, find r such that self.log10() >= 10**r.
2875 Assumes that self is finite and positive and that self != 1.
2876 """
2877
2878 # For x >= 10 or x < 0.1 we only need a bound on the integer
2879 # part of log10(self), and this comes directly from the
2880 # exponent of x. For 0.1 <= x <= 10 we use the inequalities
2881 # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
2882 # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0
2883
2884 adj = self._exp + len(self._int) - 1
2885 if adj >= 1:
2886 # self >= 10
2887 return len(str(adj))-1
2888 if adj <= -2:
2889 # self < 0.1
2890 return len(str(-1-adj))-1
2891 op = _WorkRep(self)
2892 c, e = op.int, op.exp
2893 if adj == 0:
2894 # 1 < self < 10
2895 num = str(c-10**-e)
2896 den = str(231*c)
2897 return len(num) - len(den) - (num < den) + 2
2898 # adj == -1, 0.1 <= self < 1
2899 num = str(10**-e-c)
2900 return len(num) + e - (num < "231") - 1
2901
2902 def log10(self, context=None):
2903 """Returns the base 10 logarithm of self."""
2904
2905 if context is None:
2906 context = getcontext()
2907
2908 # log10(NaN) = NaN
2909 ans = self._check_nans(context=context)
2910 if ans:
2911 return ans
2912
2913 # log10(0.0) == -Infinity
2914 if not self:
2915 return negInf
2916
2917 # log10(Infinity) = Infinity
2918 if self._isinfinity() == 1:
2919 return Inf
2920
2921 # log10(negative or -Infinity) raises InvalidOperation
2922 if self._sign == 1:
2923 return context._raise_error(InvalidOperation,
2924 'log10 of a negative value')
2925
2926 # log10(10**n) = n
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002927 if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002928 # answer may need rounding
2929 ans = Decimal(self._exp + len(self._int) - 1)
2930 else:
2931 # result is irrational, so necessarily inexact
2932 op = _WorkRep(self)
2933 c, e = op.int, op.exp
2934 p = context.prec
2935
2936 # correctly rounded result: repeatedly increase precision
2937 # until result is unambiguously roundable
2938 places = p-self._log10_exp_bound()+2
2939 while True:
2940 coeff = _dlog10(c, e, places)
2941 # assert len(str(abs(coeff)))-p >= 1
2942 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
2943 break
2944 places += 3
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002945 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002946
2947 context = context._shallow_copy()
2948 rounding = context._set_rounding(ROUND_HALF_EVEN)
2949 ans = ans._fix(context)
2950 context.rounding = rounding
2951 return ans
2952
2953 def logb(self, context=None):
2954 """ Returns the exponent of the magnitude of self's MSD.
2955
2956 The result is the integer which is the exponent of the magnitude
2957 of the most significant digit of self (as though it were truncated
2958 to a single digit while maintaining the value of that digit and
2959 without limiting the resulting exponent).
2960 """
2961 # logb(NaN) = NaN
2962 ans = self._check_nans(context=context)
2963 if ans:
2964 return ans
2965
2966 if context is None:
2967 context = getcontext()
2968
2969 # logb(+/-Inf) = +Inf
2970 if self._isinfinity():
2971 return Inf
2972
2973 # logb(0) = -Inf, DivisionByZero
2974 if not self:
2975 return context._raise_error(DivisionByZero, 'logb(0)', 1)
2976
2977 # otherwise, simply return the adjusted exponent of self, as a
2978 # Decimal. Note that no attempt is made to fit the result
2979 # into the current context.
2980 return Decimal(self.adjusted())
2981
2982 def _islogical(self):
2983 """Return True if self is a logical operand.
2984
Christian Heimes679db4a2008-01-18 09:56:22 +00002985 For being logical, it must be a finite number with a sign of 0,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002986 an exponent of 0, and a coefficient whose digits must all be
2987 either 0 or 1.
2988 """
2989 if self._sign != 0 or self._exp != 0:
2990 return False
2991 for dig in self._int:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002992 if dig not in '01':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002993 return False
2994 return True
2995
2996 def _fill_logical(self, context, opa, opb):
2997 dif = context.prec - len(opa)
2998 if dif > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002999 opa = '0'*dif + opa
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003000 elif dif < 0:
3001 opa = opa[-context.prec:]
3002 dif = context.prec - len(opb)
3003 if dif > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003004 opb = '0'*dif + opb
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003005 elif dif < 0:
3006 opb = opb[-context.prec:]
3007 return opa, opb
3008
3009 def logical_and(self, other, context=None):
3010 """Applies an 'and' operation between self and other's digits."""
3011 if context is None:
3012 context = getcontext()
3013 if not self._islogical() or not other._islogical():
3014 return context._raise_error(InvalidOperation)
3015
3016 # fill to context.prec
3017 (opa, opb) = self._fill_logical(context, self._int, other._int)
3018
3019 # make the operation, and clean starting zeroes
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003020 result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
3021 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003022
3023 def logical_invert(self, context=None):
3024 """Invert all its digits."""
3025 if context is None:
3026 context = getcontext()
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003027 return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
3028 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003029
3030 def logical_or(self, other, context=None):
3031 """Applies an 'or' operation between self and other's digits."""
3032 if context is None:
3033 context = getcontext()
3034 if not self._islogical() or not other._islogical():
3035 return context._raise_error(InvalidOperation)
3036
3037 # fill to context.prec
3038 (opa, opb) = self._fill_logical(context, self._int, other._int)
3039
3040 # make the operation, and clean starting zeroes
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003041 result = "".join(str(int(a)|int(b)) for a,b in zip(opa,opb))
3042 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003043
3044 def logical_xor(self, other, context=None):
3045 """Applies an 'xor' operation between self and other's digits."""
3046 if context is None:
3047 context = getcontext()
3048 if not self._islogical() or not other._islogical():
3049 return context._raise_error(InvalidOperation)
3050
3051 # fill to context.prec
3052 (opa, opb) = self._fill_logical(context, self._int, other._int)
3053
3054 # make the operation, and clean starting zeroes
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003055 result = "".join(str(int(a)^int(b)) for a,b in zip(opa,opb))
3056 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003057
3058 def max_mag(self, other, context=None):
3059 """Compares the values numerically with their sign ignored."""
3060 other = _convert_other(other, raiseit=True)
3061
3062 if context is None:
3063 context = getcontext()
3064
3065 if self._is_special or other._is_special:
3066 # If one operand is a quiet NaN and the other is number, then the
3067 # number is always returned
3068 sn = self._isnan()
3069 on = other._isnan()
3070 if sn or on:
3071 if on == 1 and sn != 2:
3072 return self._fix_nan(context)
3073 if sn == 1 and on != 2:
3074 return other._fix_nan(context)
3075 return self._check_nans(other, context)
3076
3077 c = self.copy_abs().__cmp__(other.copy_abs())
3078 if c == 0:
3079 c = self.compare_total(other)
3080
3081 if c == -1:
3082 ans = other
3083 else:
3084 ans = self
3085
Christian Heimes2c181612007-12-17 20:04:13 +00003086 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003087
3088 def min_mag(self, other, context=None):
3089 """Compares the values numerically with their sign ignored."""
3090 other = _convert_other(other, raiseit=True)
3091
3092 if context is None:
3093 context = getcontext()
3094
3095 if self._is_special or other._is_special:
3096 # If one operand is a quiet NaN and the other is number, then the
3097 # number is always returned
3098 sn = self._isnan()
3099 on = other._isnan()
3100 if sn or on:
3101 if on == 1 and sn != 2:
3102 return self._fix_nan(context)
3103 if sn == 1 and on != 2:
3104 return other._fix_nan(context)
3105 return self._check_nans(other, context)
3106
3107 c = self.copy_abs().__cmp__(other.copy_abs())
3108 if c == 0:
3109 c = self.compare_total(other)
3110
3111 if c == -1:
3112 ans = self
3113 else:
3114 ans = other
3115
Christian Heimes2c181612007-12-17 20:04:13 +00003116 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003117
3118 def next_minus(self, context=None):
3119 """Returns the largest representable number smaller than itself."""
3120 if context is None:
3121 context = getcontext()
3122
3123 ans = self._check_nans(context=context)
3124 if ans:
3125 return ans
3126
3127 if self._isinfinity() == -1:
3128 return negInf
3129 if self._isinfinity() == 1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003130 return _dec_from_triple(0, '9'*context.prec, context.Etop())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003131
3132 context = context.copy()
3133 context._set_rounding(ROUND_FLOOR)
3134 context._ignore_all_flags()
3135 new_self = self._fix(context)
3136 if new_self != self:
3137 return new_self
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003138 return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
3139 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003140
3141 def next_plus(self, context=None):
3142 """Returns the smallest representable number larger than itself."""
3143 if context is None:
3144 context = getcontext()
3145
3146 ans = self._check_nans(context=context)
3147 if ans:
3148 return ans
3149
3150 if self._isinfinity() == 1:
3151 return Inf
3152 if self._isinfinity() == -1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003153 return _dec_from_triple(1, '9'*context.prec, context.Etop())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003154
3155 context = context.copy()
3156 context._set_rounding(ROUND_CEILING)
3157 context._ignore_all_flags()
3158 new_self = self._fix(context)
3159 if new_self != self:
3160 return new_self
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003161 return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
3162 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003163
3164 def next_toward(self, other, context=None):
3165 """Returns the number closest to self, in the direction towards other.
3166
3167 The result is the closest representable number to self
3168 (excluding self) that is in the direction towards other,
3169 unless both have the same value. If the two operands are
3170 numerically equal, then the result is a copy of self with the
3171 sign set to be the same as the sign of other.
3172 """
3173 other = _convert_other(other, raiseit=True)
3174
3175 if context is None:
3176 context = getcontext()
3177
3178 ans = self._check_nans(other, context)
3179 if ans:
3180 return ans
3181
3182 comparison = self.__cmp__(other)
3183 if comparison == 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003184 return self.copy_sign(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003185
3186 if comparison == -1:
3187 ans = self.next_plus(context)
3188 else: # comparison == 1
3189 ans = self.next_minus(context)
3190
3191 # decide which flags to raise using value of ans
3192 if ans._isinfinity():
3193 context._raise_error(Overflow,
3194 'Infinite result from next_toward',
3195 ans._sign)
3196 context._raise_error(Rounded)
3197 context._raise_error(Inexact)
3198 elif ans.adjusted() < context.Emin:
3199 context._raise_error(Underflow)
3200 context._raise_error(Subnormal)
3201 context._raise_error(Rounded)
3202 context._raise_error(Inexact)
3203 # if precision == 1 then we don't raise Clamped for a
3204 # result 0E-Etiny.
3205 if not ans:
3206 context._raise_error(Clamped)
3207
3208 return ans
3209
3210 def number_class(self, context=None):
3211 """Returns an indication of the class of self.
3212
3213 The class is one of the following strings:
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003214 sNaN
3215 NaN
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003216 -Infinity
3217 -Normal
3218 -Subnormal
3219 -Zero
3220 +Zero
3221 +Subnormal
3222 +Normal
3223 +Infinity
3224 """
3225 if self.is_snan():
3226 return "sNaN"
3227 if self.is_qnan():
3228 return "NaN"
3229 inf = self._isinfinity()
3230 if inf == 1:
3231 return "+Infinity"
3232 if inf == -1:
3233 return "-Infinity"
3234 if self.is_zero():
3235 if self._sign:
3236 return "-Zero"
3237 else:
3238 return "+Zero"
3239 if context is None:
3240 context = getcontext()
3241 if self.is_subnormal(context=context):
3242 if self._sign:
3243 return "-Subnormal"
3244 else:
3245 return "+Subnormal"
3246 # just a normal, regular, boring number, :)
3247 if self._sign:
3248 return "-Normal"
3249 else:
3250 return "+Normal"
3251
3252 def radix(self):
3253 """Just returns 10, as this is Decimal, :)"""
3254 return Decimal(10)
3255
3256 def rotate(self, other, context=None):
3257 """Returns a rotated copy of self, value-of-other times."""
3258 if context is None:
3259 context = getcontext()
3260
3261 ans = self._check_nans(other, context)
3262 if ans:
3263 return ans
3264
3265 if other._exp != 0:
3266 return context._raise_error(InvalidOperation)
3267 if not (-context.prec <= int(other) <= context.prec):
3268 return context._raise_error(InvalidOperation)
3269
3270 if self._isinfinity():
3271 return Decimal(self)
3272
3273 # get values, pad if necessary
3274 torot = int(other)
3275 rotdig = self._int
3276 topad = context.prec - len(rotdig)
3277 if topad:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003278 rotdig = '0'*topad + rotdig
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003279
3280 # let's rotate!
3281 rotated = rotdig[torot:] + rotdig[:torot]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003282 return _dec_from_triple(self._sign,
3283 rotated.lstrip('0') or '0', self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003284
3285 def scaleb (self, other, context=None):
3286 """Returns self operand after adding the second value to its exp."""
3287 if context is None:
3288 context = getcontext()
3289
3290 ans = self._check_nans(other, context)
3291 if ans:
3292 return ans
3293
3294 if other._exp != 0:
3295 return context._raise_error(InvalidOperation)
3296 liminf = -2 * (context.Emax + context.prec)
3297 limsup = 2 * (context.Emax + context.prec)
3298 if not (liminf <= int(other) <= limsup):
3299 return context._raise_error(InvalidOperation)
3300
3301 if self._isinfinity():
3302 return Decimal(self)
3303
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003304 d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003305 d = d._fix(context)
3306 return d
3307
3308 def shift(self, other, context=None):
3309 """Returns a shifted copy of self, value-of-other times."""
3310 if context is None:
3311 context = getcontext()
3312
3313 ans = self._check_nans(other, context)
3314 if ans:
3315 return ans
3316
3317 if other._exp != 0:
3318 return context._raise_error(InvalidOperation)
3319 if not (-context.prec <= int(other) <= context.prec):
3320 return context._raise_error(InvalidOperation)
3321
3322 if self._isinfinity():
3323 return Decimal(self)
3324
3325 # get values, pad if necessary
3326 torot = int(other)
3327 if not torot:
3328 return Decimal(self)
3329 rotdig = self._int
3330 topad = context.prec - len(rotdig)
3331 if topad:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003332 rotdig = '0'*topad + rotdig
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003333
3334 # let's shift!
3335 if torot < 0:
3336 rotated = rotdig[:torot]
3337 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003338 rotated = rotdig + '0'*torot
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003339 rotated = rotated[-context.prec:]
3340
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003341 return _dec_from_triple(self._sign,
3342 rotated.lstrip('0') or '0', self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003343
Guido van Rossumd8faa362007-04-27 19:54:29 +00003344 # Support for pickling, copy, and deepcopy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003345 def __reduce__(self):
3346 return (self.__class__, (str(self),))
3347
3348 def __copy__(self):
3349 if type(self) == Decimal:
3350 return self # I'm immutable; therefore I am my own clone
3351 return self.__class__(str(self))
3352
3353 def __deepcopy__(self, memo):
3354 if type(self) == Decimal:
3355 return self # My components are also immutable
3356 return self.__class__(str(self))
3357
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003358def _dec_from_triple(sign, coefficient, exponent, special=False):
3359 """Create a decimal instance directly, without any validation,
3360 normalization (e.g. removal of leading zeros) or argument
3361 conversion.
3362
3363 This function is for *internal use only*.
3364 """
3365
3366 self = object.__new__(Decimal)
3367 self._sign = sign
3368 self._int = coefficient
3369 self._exp = exponent
3370 self._is_special = special
3371
3372 return self
3373
Guido van Rossumd8faa362007-04-27 19:54:29 +00003374##### Context class #######################################################
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003375
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003376
3377# get rounding method function:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003378rounding_functions = [name for name in Decimal.__dict__.keys()
3379 if name.startswith('_round_')]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003380for name in rounding_functions:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003381 # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003382 globalname = name[1:].upper()
3383 val = globals()[globalname]
3384 Decimal._pick_rounding_function[val] = name
3385
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003386del name, val, globalname, rounding_functions
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003387
Thomas Wouters89f507f2006-12-13 04:49:30 +00003388class _ContextManager(object):
3389 """Context manager class to support localcontext().
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003390
Thomas Wouters89f507f2006-12-13 04:49:30 +00003391 Sets a copy of the supplied context in __enter__() and restores
3392 the previous decimal context in __exit__()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003393 """
3394 def __init__(self, new_context):
Thomas Wouters89f507f2006-12-13 04:49:30 +00003395 self.new_context = new_context.copy()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003396 def __enter__(self):
3397 self.saved_context = getcontext()
3398 setcontext(self.new_context)
3399 return self.new_context
3400 def __exit__(self, t, v, tb):
3401 setcontext(self.saved_context)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003402
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003403class Context(object):
3404 """Contains the context for a Decimal instance.
3405
3406 Contains:
3407 prec - precision (for use in rounding, division, square roots..)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003408 rounding - rounding type (how you round)
Raymond Hettingerbf440692004-07-10 14:14:37 +00003409 traps - If traps[exception] = 1, then the exception is
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003410 raised when it is caused. Otherwise, a value is
3411 substituted in.
3412 flags - When an exception is caused, flags[exception] is incremented.
3413 (Whether or not the trap_enabler is set)
3414 Should be reset by user of Decimal instance.
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003415 Emin - Minimum exponent
3416 Emax - Maximum exponent
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003417 capitals - If 1, 1*10^1 is printed as 1E+1.
3418 If 0, printed as 1e1
Raymond Hettingere0f15812004-07-05 05:36:39 +00003419 _clamp - If 1, change exponents if too high (Default 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003420 """
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003421
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003422 def __init__(self, prec=None, rounding=None,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003423 traps=None, flags=None,
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003424 Emin=None, Emax=None,
Raymond Hettingere0f15812004-07-05 05:36:39 +00003425 capitals=None, _clamp=0,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003426 _ignored_flags=None):
3427 if flags is None:
3428 flags = []
3429 if _ignored_flags is None:
3430 _ignored_flags = []
Raymond Hettingerbf440692004-07-10 14:14:37 +00003431 if not isinstance(flags, dict):
Raymond Hettingerfed52962004-07-14 15:41:57 +00003432 flags = dict([(s,s in flags) for s in _signals])
Raymond Hettingerbf440692004-07-10 14:14:37 +00003433 if traps is not None and not isinstance(traps, dict):
Raymond Hettingerfed52962004-07-14 15:41:57 +00003434 traps = dict([(s,s in traps) for s in _signals])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003435 for name, val in locals().items():
3436 if val is None:
Raymond Hettingereb260842005-06-07 18:52:34 +00003437 setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003438 else:
3439 setattr(self, name, val)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003440 del self.self
3441
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003442 def __repr__(self):
Raymond Hettingerbf440692004-07-10 14:14:37 +00003443 """Show the current context."""
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003444 s = []
Guido van Rossumd8faa362007-04-27 19:54:29 +00003445 s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
3446 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
3447 % vars(self))
3448 names = [f.__name__ for f, v in self.flags.items() if v]
3449 s.append('flags=[' + ', '.join(names) + ']')
3450 names = [t.__name__ for t, v in self.traps.items() if v]
3451 s.append('traps=[' + ', '.join(names) + ']')
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003452 return ', '.join(s) + ')'
3453
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003454 def clear_flags(self):
3455 """Reset all flags to zero"""
3456 for flag in self.flags:
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003457 self.flags[flag] = 0
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003458
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003459 def _shallow_copy(self):
3460 """Returns a shallow copy from self."""
Christian Heimes2c181612007-12-17 20:04:13 +00003461 nc = Context(self.prec, self.rounding, self.traps,
3462 self.flags, self.Emin, self.Emax,
3463 self.capitals, self._clamp, self._ignored_flags)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003464 return nc
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003465
3466 def copy(self):
3467 """Returns a deep copy from self."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00003468 nc = Context(self.prec, self.rounding, self.traps.copy(),
Christian Heimes2c181612007-12-17 20:04:13 +00003469 self.flags.copy(), self.Emin, self.Emax,
3470 self.capitals, self._clamp, self._ignored_flags)
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003471 return nc
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003472 __copy__ = copy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003473
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003474 def _raise_error(self, condition, explanation = None, *args):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003475 """Handles an error
3476
3477 If the flag is in _ignored_flags, returns the default response.
3478 Otherwise, it increments the flag, then, if the corresponding
3479 trap_enabler is set, it reaises the exception. Otherwise, it returns
3480 the default value after incrementing the flag.
3481 """
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003482 error = _condition_map.get(condition, condition)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003483 if error in self._ignored_flags:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003484 # Don't touch the flag
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003485 return error().handle(self, *args)
3486
3487 self.flags[error] += 1
Raymond Hettingerbf440692004-07-10 14:14:37 +00003488 if not self.traps[error]:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003489 # The errors define how to handle themselves.
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003490 return condition().handle(self, *args)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003491
3492 # Errors should only be risked on copies of the context
Guido van Rossumd8faa362007-04-27 19:54:29 +00003493 # self._ignored_flags = []
Collin Winterce36ad82007-08-30 01:19:48 +00003494 raise error(explanation)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003495
3496 def _ignore_all_flags(self):
3497 """Ignore all flags, if they are raised"""
Raymond Hettingerfed52962004-07-14 15:41:57 +00003498 return self._ignore_flags(*_signals)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003499
3500 def _ignore_flags(self, *flags):
3501 """Ignore the flags, if they are raised"""
3502 # Do not mutate-- This way, copies of a context leave the original
3503 # alone.
3504 self._ignored_flags = (self._ignored_flags + list(flags))
3505 return list(flags)
3506
3507 def _regard_flags(self, *flags):
3508 """Stop ignoring the flags, if they are raised"""
3509 if flags and isinstance(flags[0], (tuple,list)):
3510 flags = flags[0]
3511 for flag in flags:
3512 self._ignored_flags.remove(flag)
3513
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003514 def __hash__(self):
3515 """A Context cannot be hashed."""
3516 # We inherit object.__hash__, so we must deny this explicitly
Guido van Rossumd8faa362007-04-27 19:54:29 +00003517 raise TypeError("Cannot hash a Context.")
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003518
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003519 def Etiny(self):
3520 """Returns Etiny (= Emin - prec + 1)"""
3521 return int(self.Emin - self.prec + 1)
3522
3523 def Etop(self):
Raymond Hettingere0f15812004-07-05 05:36:39 +00003524 """Returns maximum exponent (= Emax - prec + 1)"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003525 return int(self.Emax - self.prec + 1)
3526
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003527 def _set_rounding(self, type):
3528 """Sets the rounding type.
3529
3530 Sets the rounding type, and returns the current (previous)
3531 rounding type. Often used like:
3532
3533 context = context.copy()
3534 # so you don't change the calling context
3535 # if an error occurs in the middle.
3536 rounding = context._set_rounding(ROUND_UP)
3537 val = self.__sub__(other, context=context)
3538 context._set_rounding(rounding)
3539
3540 This will make it round up for that operation.
3541 """
3542 rounding = self.rounding
3543 self.rounding= type
3544 return rounding
3545
Raymond Hettingerfed52962004-07-14 15:41:57 +00003546 def create_decimal(self, num='0'):
Christian Heimesa62da1d2008-01-12 19:39:10 +00003547 """Creates a new Decimal instance but using self as context.
3548
3549 This method implements the to-number operation of the
3550 IBM Decimal specification."""
3551
3552 if isinstance(num, str) and num != num.strip():
3553 return self._raise_error(ConversionSyntax,
3554 "no trailing or leading whitespace is "
3555 "permitted.")
3556
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003557 d = Decimal(num, context=self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003558 if d._isnan() and len(d._int) > self.prec - self._clamp:
3559 return self._raise_error(ConversionSyntax,
3560 "diagnostic info too long in NaN")
Raymond Hettingerdab988d2004-10-09 07:10:44 +00003561 return d._fix(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003562
Guido van Rossumd8faa362007-04-27 19:54:29 +00003563 # Methods
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003564 def abs(self, a):
3565 """Returns the absolute value of the operand.
3566
3567 If the operand is negative, the result is the same as using the minus
Guido van Rossumd8faa362007-04-27 19:54:29 +00003568 operation on the operand. Otherwise, the result is the same as using
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003569 the plus operation on the operand.
3570
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003571 >>> ExtendedContext.abs(Decimal('2.1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003572 Decimal("2.1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003573 >>> ExtendedContext.abs(Decimal('-100'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003574 Decimal("100")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003575 >>> ExtendedContext.abs(Decimal('101.5'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003576 Decimal("101.5")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003577 >>> ExtendedContext.abs(Decimal('-101.5'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003578 Decimal("101.5")
3579 """
3580 return a.__abs__(context=self)
3581
3582 def add(self, a, b):
3583 """Return the sum of the two operands.
3584
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003585 >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003586 Decimal("19.00")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003587 >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003588 Decimal("1.02E+4")
3589 """
3590 return a.__add__(b, context=self)
3591
3592 def _apply(self, a):
Raymond Hettingerdab988d2004-10-09 07:10:44 +00003593 return str(a._fix(self))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003594
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003595 def canonical(self, a):
3596 """Returns the same Decimal object.
3597
3598 As we do not have different encodings for the same number, the
3599 received object already is in its canonical form.
3600
3601 >>> ExtendedContext.canonical(Decimal('2.50'))
3602 Decimal("2.50")
3603 """
3604 return a.canonical(context=self)
3605
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003606 def compare(self, a, b):
3607 """Compares values numerically.
3608
3609 If the signs of the operands differ, a value representing each operand
3610 ('-1' if the operand is less than zero, '0' if the operand is zero or
3611 negative zero, or '1' if the operand is greater than zero) is used in
3612 place of that operand for the comparison instead of the actual
3613 operand.
3614
3615 The comparison is then effected by subtracting the second operand from
3616 the first and then returning a value according to the result of the
3617 subtraction: '-1' if the result is less than zero, '0' if the result is
3618 zero or negative zero, or '1' if the result is greater than zero.
3619
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003620 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003621 Decimal("-1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003622 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003623 Decimal("0")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003624 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003625 Decimal("0")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003626 >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003627 Decimal("1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003628 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003629 Decimal("1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003630 >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003631 Decimal("-1")
3632 """
3633 return a.compare(b, context=self)
3634
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003635 def compare_signal(self, a, b):
3636 """Compares the values of the two operands numerically.
3637
3638 It's pretty much like compare(), but all NaNs signal, with signaling
3639 NaNs taking precedence over quiet NaNs.
3640
3641 >>> c = ExtendedContext
3642 >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
3643 Decimal("-1")
3644 >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
3645 Decimal("0")
3646 >>> c.flags[InvalidOperation] = 0
3647 >>> print(c.flags[InvalidOperation])
3648 0
3649 >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
3650 Decimal("NaN")
3651 >>> print(c.flags[InvalidOperation])
3652 1
3653 >>> c.flags[InvalidOperation] = 0
3654 >>> print(c.flags[InvalidOperation])
3655 0
3656 >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
3657 Decimal("NaN")
3658 >>> print(c.flags[InvalidOperation])
3659 1
3660 """
3661 return a.compare_signal(b, context=self)
3662
3663 def compare_total(self, a, b):
3664 """Compares two operands using their abstract representation.
3665
3666 This is not like the standard compare, which use their numerical
3667 value. Note that a total ordering is defined for all possible abstract
3668 representations.
3669
3670 >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
3671 Decimal("-1")
3672 >>> ExtendedContext.compare_total(Decimal('-127'), Decimal('12'))
3673 Decimal("-1")
3674 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
3675 Decimal("-1")
3676 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
3677 Decimal("0")
3678 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('12.300'))
3679 Decimal("1")
3680 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN'))
3681 Decimal("-1")
3682 """
3683 return a.compare_total(b)
3684
3685 def compare_total_mag(self, a, b):
3686 """Compares two operands using their abstract representation ignoring sign.
3687
3688 Like compare_total, but with operand's sign ignored and assumed to be 0.
3689 """
3690 return a.compare_total_mag(b)
3691
3692 def copy_abs(self, a):
3693 """Returns a copy of the operand with the sign set to 0.
3694
3695 >>> ExtendedContext.copy_abs(Decimal('2.1'))
3696 Decimal("2.1")
3697 >>> ExtendedContext.copy_abs(Decimal('-100'))
3698 Decimal("100")
3699 """
3700 return a.copy_abs()
3701
3702 def copy_decimal(self, a):
3703 """Returns a copy of the decimal objet.
3704
3705 >>> ExtendedContext.copy_decimal(Decimal('2.1'))
3706 Decimal("2.1")
3707 >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
3708 Decimal("-1.00")
3709 """
3710 return Decimal(a)
3711
3712 def copy_negate(self, a):
3713 """Returns a copy of the operand with the sign inverted.
3714
3715 >>> ExtendedContext.copy_negate(Decimal('101.5'))
3716 Decimal("-101.5")
3717 >>> ExtendedContext.copy_negate(Decimal('-101.5'))
3718 Decimal("101.5")
3719 """
3720 return a.copy_negate()
3721
3722 def copy_sign(self, a, b):
3723 """Copies the second operand's sign to the first one.
3724
3725 In detail, it returns a copy of the first operand with the sign
3726 equal to the sign of the second operand.
3727
3728 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
3729 Decimal("1.50")
3730 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
3731 Decimal("1.50")
3732 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
3733 Decimal("-1.50")
3734 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
3735 Decimal("-1.50")
3736 """
3737 return a.copy_sign(b)
3738
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003739 def divide(self, a, b):
3740 """Decimal division in a specified context.
3741
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003742 >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003743 Decimal("0.333333333")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003744 >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003745 Decimal("0.666666667")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003746 >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003747 Decimal("2.5")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003748 >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003749 Decimal("0.1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003750 >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003751 Decimal("1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003752 >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003753 Decimal("4.00")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003754 >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003755 Decimal("1.20")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003756 >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003757 Decimal("10")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003758 >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003759 Decimal("1000")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003760 >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003761 Decimal("1.20E+6")
3762 """
Neal Norwitzbcc0db82006-03-24 08:14:36 +00003763 return a.__truediv__(b, context=self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003764
3765 def divide_int(self, a, b):
3766 """Divides two numbers and returns the integer part of the result.
3767
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003768 >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003769 Decimal("0")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003770 >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003771 Decimal("3")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003772 >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003773 Decimal("3")
3774 """
3775 return a.__floordiv__(b, context=self)
3776
3777 def divmod(self, a, b):
3778 return a.__divmod__(b, context=self)
3779
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003780 def exp(self, a):
3781 """Returns e ** a.
3782
3783 >>> c = ExtendedContext.copy()
3784 >>> c.Emin = -999
3785 >>> c.Emax = 999
3786 >>> c.exp(Decimal('-Infinity'))
3787 Decimal("0")
3788 >>> c.exp(Decimal('-1'))
3789 Decimal("0.367879441")
3790 >>> c.exp(Decimal('0'))
3791 Decimal("1")
3792 >>> c.exp(Decimal('1'))
3793 Decimal("2.71828183")
3794 >>> c.exp(Decimal('0.693147181'))
3795 Decimal("2.00000000")
3796 >>> c.exp(Decimal('+Infinity'))
3797 Decimal("Infinity")
3798 """
3799 return a.exp(context=self)
3800
3801 def fma(self, a, b, c):
3802 """Returns a multiplied by b, plus c.
3803
3804 The first two operands are multiplied together, using multiply,
3805 the third operand is then added to the result of that
3806 multiplication, using add, all with only one final rounding.
3807
3808 >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
3809 Decimal("22")
3810 >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
3811 Decimal("-8")
3812 >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
3813 Decimal("1.38435736E+12")
3814 """
3815 return a.fma(b, c, context=self)
3816
3817 def is_canonical(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003818 """Return True if the operand is canonical; otherwise return False.
3819
3820 Currently, the encoding of a Decimal instance is always
3821 canonical, so this method returns True for any Decimal.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003822
3823 >>> ExtendedContext.is_canonical(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003824 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003825 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003826 return a.is_canonical()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003827
3828 def is_finite(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003829 """Return True if the operand is finite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003830
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003831 A Decimal instance is considered finite if it is neither
3832 infinite nor a NaN.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003833
3834 >>> ExtendedContext.is_finite(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003835 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003836 >>> ExtendedContext.is_finite(Decimal('-0.3'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003837 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003838 >>> ExtendedContext.is_finite(Decimal('0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003839 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003840 >>> ExtendedContext.is_finite(Decimal('Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003841 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003842 >>> ExtendedContext.is_finite(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003843 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003844 """
3845 return a.is_finite()
3846
3847 def is_infinite(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003848 """Return True if the operand is infinite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003849
3850 >>> ExtendedContext.is_infinite(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003851 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003852 >>> ExtendedContext.is_infinite(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003853 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003854 >>> ExtendedContext.is_infinite(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003855 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003856 """
3857 return a.is_infinite()
3858
3859 def is_nan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003860 """Return True if the operand is a qNaN or sNaN;
3861 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003862
3863 >>> ExtendedContext.is_nan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003864 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003865 >>> ExtendedContext.is_nan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003866 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003867 >>> ExtendedContext.is_nan(Decimal('-sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003868 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003869 """
3870 return a.is_nan()
3871
3872 def is_normal(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003873 """Return True if the operand is a normal number;
3874 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003875
3876 >>> c = ExtendedContext.copy()
3877 >>> c.Emin = -999
3878 >>> c.Emax = 999
3879 >>> c.is_normal(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003880 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003881 >>> c.is_normal(Decimal('0.1E-999'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003882 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003883 >>> c.is_normal(Decimal('0.00'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003884 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003885 >>> c.is_normal(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003886 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003887 >>> c.is_normal(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003888 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003889 """
3890 return a.is_normal(context=self)
3891
3892 def is_qnan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003893 """Return True if the operand is a quiet NaN; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003894
3895 >>> ExtendedContext.is_qnan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003896 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003897 >>> ExtendedContext.is_qnan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003898 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003899 >>> ExtendedContext.is_qnan(Decimal('sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003900 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003901 """
3902 return a.is_qnan()
3903
3904 def is_signed(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003905 """Return True if the operand is negative; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003906
3907 >>> ExtendedContext.is_signed(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003908 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003909 >>> ExtendedContext.is_signed(Decimal('-12'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003910 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003911 >>> ExtendedContext.is_signed(Decimal('-0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003912 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003913 """
3914 return a.is_signed()
3915
3916 def is_snan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003917 """Return True if the operand is a signaling NaN;
3918 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003919
3920 >>> ExtendedContext.is_snan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003921 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003922 >>> ExtendedContext.is_snan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003923 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003924 >>> ExtendedContext.is_snan(Decimal('sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003925 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003926 """
3927 return a.is_snan()
3928
3929 def is_subnormal(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003930 """Return True if the operand is subnormal; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003931
3932 >>> c = ExtendedContext.copy()
3933 >>> c.Emin = -999
3934 >>> c.Emax = 999
3935 >>> c.is_subnormal(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003936 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003937 >>> c.is_subnormal(Decimal('0.1E-999'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003938 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003939 >>> c.is_subnormal(Decimal('0.00'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003940 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003941 >>> c.is_subnormal(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003942 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003943 >>> c.is_subnormal(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003944 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003945 """
3946 return a.is_subnormal(context=self)
3947
3948 def is_zero(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003949 """Return True if the operand is a zero; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003950
3951 >>> ExtendedContext.is_zero(Decimal('0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003952 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003953 >>> ExtendedContext.is_zero(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003954 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003955 >>> ExtendedContext.is_zero(Decimal('-0E+2'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003956 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003957 """
3958 return a.is_zero()
3959
3960 def ln(self, a):
3961 """Returns the natural (base e) logarithm of the operand.
3962
3963 >>> c = ExtendedContext.copy()
3964 >>> c.Emin = -999
3965 >>> c.Emax = 999
3966 >>> c.ln(Decimal('0'))
3967 Decimal("-Infinity")
3968 >>> c.ln(Decimal('1.000'))
3969 Decimal("0")
3970 >>> c.ln(Decimal('2.71828183'))
3971 Decimal("1.00000000")
3972 >>> c.ln(Decimal('10'))
3973 Decimal("2.30258509")
3974 >>> c.ln(Decimal('+Infinity'))
3975 Decimal("Infinity")
3976 """
3977 return a.ln(context=self)
3978
3979 def log10(self, a):
3980 """Returns the base 10 logarithm of the operand.
3981
3982 >>> c = ExtendedContext.copy()
3983 >>> c.Emin = -999
3984 >>> c.Emax = 999
3985 >>> c.log10(Decimal('0'))
3986 Decimal("-Infinity")
3987 >>> c.log10(Decimal('0.001'))
3988 Decimal("-3")
3989 >>> c.log10(Decimal('1.000'))
3990 Decimal("0")
3991 >>> c.log10(Decimal('2'))
3992 Decimal("0.301029996")
3993 >>> c.log10(Decimal('10'))
3994 Decimal("1")
3995 >>> c.log10(Decimal('70'))
3996 Decimal("1.84509804")
3997 >>> c.log10(Decimal('+Infinity'))
3998 Decimal("Infinity")
3999 """
4000 return a.log10(context=self)
4001
4002 def logb(self, a):
4003 """ Returns the exponent of the magnitude of the operand's MSD.
4004
4005 The result is the integer which is the exponent of the magnitude
4006 of the most significant digit of the operand (as though the
4007 operand were truncated to a single digit while maintaining the
4008 value of that digit and without limiting the resulting exponent).
4009
4010 >>> ExtendedContext.logb(Decimal('250'))
4011 Decimal("2")
4012 >>> ExtendedContext.logb(Decimal('2.50'))
4013 Decimal("0")
4014 >>> ExtendedContext.logb(Decimal('0.03'))
4015 Decimal("-2")
4016 >>> ExtendedContext.logb(Decimal('0'))
4017 Decimal("-Infinity")
4018 """
4019 return a.logb(context=self)
4020
4021 def logical_and(self, a, b):
4022 """Applies the logical operation 'and' between each operand's digits.
4023
4024 The operands must be both logical numbers.
4025
4026 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
4027 Decimal("0")
4028 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
4029 Decimal("0")
4030 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
4031 Decimal("0")
4032 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
4033 Decimal("1")
4034 >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
4035 Decimal("1000")
4036 >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
4037 Decimal("10")
4038 """
4039 return a.logical_and(b, context=self)
4040
4041 def logical_invert(self, a):
4042 """Invert all the digits in the operand.
4043
4044 The operand must be a logical number.
4045
4046 >>> ExtendedContext.logical_invert(Decimal('0'))
4047 Decimal("111111111")
4048 >>> ExtendedContext.logical_invert(Decimal('1'))
4049 Decimal("111111110")
4050 >>> ExtendedContext.logical_invert(Decimal('111111111'))
4051 Decimal("0")
4052 >>> ExtendedContext.logical_invert(Decimal('101010101'))
4053 Decimal("10101010")
4054 """
4055 return a.logical_invert(context=self)
4056
4057 def logical_or(self, a, b):
4058 """Applies the logical operation 'or' between each operand's digits.
4059
4060 The operands must be both logical numbers.
4061
4062 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
4063 Decimal("0")
4064 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
4065 Decimal("1")
4066 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
4067 Decimal("1")
4068 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
4069 Decimal("1")
4070 >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
4071 Decimal("1110")
4072 >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
4073 Decimal("1110")
4074 """
4075 return a.logical_or(b, context=self)
4076
4077 def logical_xor(self, a, b):
4078 """Applies the logical operation 'xor' between each operand's digits.
4079
4080 The operands must be both logical numbers.
4081
4082 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
4083 Decimal("0")
4084 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
4085 Decimal("1")
4086 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
4087 Decimal("1")
4088 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
4089 Decimal("0")
4090 >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
4091 Decimal("110")
4092 >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
4093 Decimal("1101")
4094 """
4095 return a.logical_xor(b, context=self)
4096
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004097 def max(self, a,b):
4098 """max compares two values numerically and returns the maximum.
4099
4100 If either operand is a NaN then the general rules apply.
Christian Heimes679db4a2008-01-18 09:56:22 +00004101 Otherwise, the operands are compared as though by the compare
Guido van Rossumd8faa362007-04-27 19:54:29 +00004102 operation. If they are numerically equal then the left-hand operand
4103 is chosen as the result. Otherwise the maximum (closer to positive
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004104 infinity) of the two operands is chosen as the result.
4105
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004106 >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004107 Decimal("3")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004108 >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004109 Decimal("3")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004110 >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004111 Decimal("1")
4112 >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
4113 Decimal("7")
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004114 """
4115 return a.max(b, context=self)
4116
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004117 def max_mag(self, a, b):
4118 """Compares the values numerically with their sign ignored."""
4119 return a.max_mag(b, context=self)
4120
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004121 def min(self, a,b):
4122 """min compares two values numerically and returns the minimum.
4123
4124 If either operand is a NaN then the general rules apply.
Christian Heimes679db4a2008-01-18 09:56:22 +00004125 Otherwise, the operands are compared as though by the compare
Guido van Rossumd8faa362007-04-27 19:54:29 +00004126 operation. If they are numerically equal then the left-hand operand
4127 is chosen as the result. Otherwise the minimum (closer to negative
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004128 infinity) of the two operands is chosen as the result.
4129
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004130 >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004131 Decimal("2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004132 >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004133 Decimal("-10")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004134 >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004135 Decimal("1.0")
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004136 >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
4137 Decimal("7")
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004138 """
4139 return a.min(b, context=self)
4140
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004141 def min_mag(self, a, b):
4142 """Compares the values numerically with their sign ignored."""
4143 return a.min_mag(b, context=self)
4144
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004145 def minus(self, a):
4146 """Minus corresponds to unary prefix minus in Python.
4147
4148 The operation is evaluated using the same rules as subtract; the
4149 operation minus(a) is calculated as subtract('0', a) where the '0'
4150 has the same exponent as the operand.
4151
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004152 >>> ExtendedContext.minus(Decimal('1.3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004153 Decimal("-1.3")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004154 >>> ExtendedContext.minus(Decimal('-1.3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004155 Decimal("1.3")
4156 """
4157 return a.__neg__(context=self)
4158
4159 def multiply(self, a, b):
4160 """multiply multiplies two operands.
4161
4162 If either operand is a special value then the general rules apply.
4163 Otherwise, the operands are multiplied together ('long multiplication'),
4164 resulting in a number which may be as long as the sum of the lengths
4165 of the two operands.
4166
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004167 >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004168 Decimal("3.60")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004169 >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004170 Decimal("21")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004171 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004172 Decimal("0.72")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004173 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004174 Decimal("-0.0")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004175 >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004176 Decimal("4.28135971E+11")
4177 """
4178 return a.__mul__(b, context=self)
4179
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004180 def next_minus(self, a):
4181 """Returns the largest representable number smaller than a.
4182
4183 >>> c = ExtendedContext.copy()
4184 >>> c.Emin = -999
4185 >>> c.Emax = 999
4186 >>> ExtendedContext.next_minus(Decimal('1'))
4187 Decimal("0.999999999")
4188 >>> c.next_minus(Decimal('1E-1007'))
4189 Decimal("0E-1007")
4190 >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
4191 Decimal("-1.00000004")
4192 >>> c.next_minus(Decimal('Infinity'))
4193 Decimal("9.99999999E+999")
4194 """
4195 return a.next_minus(context=self)
4196
4197 def next_plus(self, a):
4198 """Returns the smallest representable number larger than a.
4199
4200 >>> c = ExtendedContext.copy()
4201 >>> c.Emin = -999
4202 >>> c.Emax = 999
4203 >>> ExtendedContext.next_plus(Decimal('1'))
4204 Decimal("1.00000001")
4205 >>> c.next_plus(Decimal('-1E-1007'))
4206 Decimal("-0E-1007")
4207 >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
4208 Decimal("-1.00000002")
4209 >>> c.next_plus(Decimal('-Infinity'))
4210 Decimal("-9.99999999E+999")
4211 """
4212 return a.next_plus(context=self)
4213
4214 def next_toward(self, a, b):
4215 """Returns the number closest to a, in direction towards b.
4216
4217 The result is the closest representable number from the first
4218 operand (but not the first operand) that is in the direction
4219 towards the second operand, unless the operands have the same
4220 value.
4221
4222 >>> c = ExtendedContext.copy()
4223 >>> c.Emin = -999
4224 >>> c.Emax = 999
4225 >>> c.next_toward(Decimal('1'), Decimal('2'))
4226 Decimal("1.00000001")
4227 >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
4228 Decimal("-0E-1007")
4229 >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
4230 Decimal("-1.00000002")
4231 >>> c.next_toward(Decimal('1'), Decimal('0'))
4232 Decimal("0.999999999")
4233 >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
4234 Decimal("0E-1007")
4235 >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
4236 Decimal("-1.00000004")
4237 >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
4238 Decimal("-0.00")
4239 """
4240 return a.next_toward(b, context=self)
4241
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004242 def normalize(self, a):
Raymond Hettingere0f15812004-07-05 05:36:39 +00004243 """normalize reduces an operand to its simplest form.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004244
4245 Essentially a plus operation with all trailing zeros removed from the
4246 result.
4247
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004248 >>> ExtendedContext.normalize(Decimal('2.1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004249 Decimal("2.1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004250 >>> ExtendedContext.normalize(Decimal('-2.0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004251 Decimal("-2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004252 >>> ExtendedContext.normalize(Decimal('1.200'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004253 Decimal("1.2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004254 >>> ExtendedContext.normalize(Decimal('-120'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004255 Decimal("-1.2E+2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004256 >>> ExtendedContext.normalize(Decimal('120.00'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004257 Decimal("1.2E+2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004258 >>> ExtendedContext.normalize(Decimal('0.00'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004259 Decimal("0")
4260 """
4261 return a.normalize(context=self)
4262
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004263 def number_class(self, a):
4264 """Returns an indication of the class of the operand.
4265
4266 The class is one of the following strings:
4267 -sNaN
4268 -NaN
4269 -Infinity
4270 -Normal
4271 -Subnormal
4272 -Zero
4273 +Zero
4274 +Subnormal
4275 +Normal
4276 +Infinity
4277
4278 >>> c = Context(ExtendedContext)
4279 >>> c.Emin = -999
4280 >>> c.Emax = 999
4281 >>> c.number_class(Decimal('Infinity'))
4282 '+Infinity'
4283 >>> c.number_class(Decimal('1E-10'))
4284 '+Normal'
4285 >>> c.number_class(Decimal('2.50'))
4286 '+Normal'
4287 >>> c.number_class(Decimal('0.1E-999'))
4288 '+Subnormal'
4289 >>> c.number_class(Decimal('0'))
4290 '+Zero'
4291 >>> c.number_class(Decimal('-0'))
4292 '-Zero'
4293 >>> c.number_class(Decimal('-0.1E-999'))
4294 '-Subnormal'
4295 >>> c.number_class(Decimal('-1E-10'))
4296 '-Normal'
4297 >>> c.number_class(Decimal('-2.50'))
4298 '-Normal'
4299 >>> c.number_class(Decimal('-Infinity'))
4300 '-Infinity'
4301 >>> c.number_class(Decimal('NaN'))
4302 'NaN'
4303 >>> c.number_class(Decimal('-NaN'))
4304 'NaN'
4305 >>> c.number_class(Decimal('sNaN'))
4306 'sNaN'
4307 """
4308 return a.number_class(context=self)
4309
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004310 def plus(self, a):
4311 """Plus corresponds to unary prefix plus in Python.
4312
4313 The operation is evaluated using the same rules as add; the
4314 operation plus(a) is calculated as add('0', a) where the '0'
4315 has the same exponent as the operand.
4316
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004317 >>> ExtendedContext.plus(Decimal('1.3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004318 Decimal("1.3")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004319 >>> ExtendedContext.plus(Decimal('-1.3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004320 Decimal("-1.3")
4321 """
4322 return a.__pos__(context=self)
4323
4324 def power(self, a, b, modulo=None):
4325 """Raises a to the power of b, to modulo if given.
4326
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004327 With two arguments, compute a**b. If a is negative then b
4328 must be integral. The result will be inexact unless b is
4329 integral and the result is finite and can be expressed exactly
4330 in 'precision' digits.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004331
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004332 With three arguments, compute (a**b) % modulo. For the
4333 three argument form, the following restrictions on the
4334 arguments hold:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004335
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004336 - all three arguments must be integral
4337 - b must be nonnegative
4338 - at least one of a or b must be nonzero
4339 - modulo must be nonzero and have at most 'precision' digits
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004340
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004341 The result of pow(a, b, modulo) is identical to the result
4342 that would be obtained by computing (a**b) % modulo with
4343 unbounded precision, but is computed more efficiently. It is
4344 always exact.
4345
4346 >>> c = ExtendedContext.copy()
4347 >>> c.Emin = -999
4348 >>> c.Emax = 999
4349 >>> c.power(Decimal('2'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004350 Decimal("8")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004351 >>> c.power(Decimal('-2'), Decimal('3'))
4352 Decimal("-8")
4353 >>> c.power(Decimal('2'), Decimal('-3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004354 Decimal("0.125")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004355 >>> c.power(Decimal('1.7'), Decimal('8'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004356 Decimal("69.7575744")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004357 >>> c.power(Decimal('10'), Decimal('0.301029996'))
4358 Decimal("2.00000000")
4359 >>> c.power(Decimal('Infinity'), Decimal('-1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004360 Decimal("0")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004361 >>> c.power(Decimal('Infinity'), Decimal('0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004362 Decimal("1")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004363 >>> c.power(Decimal('Infinity'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004364 Decimal("Infinity")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004365 >>> c.power(Decimal('-Infinity'), Decimal('-1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004366 Decimal("-0")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004367 >>> c.power(Decimal('-Infinity'), Decimal('0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004368 Decimal("1")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004369 >>> c.power(Decimal('-Infinity'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004370 Decimal("-Infinity")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004371 >>> c.power(Decimal('-Infinity'), Decimal('2'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004372 Decimal("Infinity")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004373 >>> c.power(Decimal('0'), Decimal('0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004374 Decimal("NaN")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004375
4376 >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
4377 Decimal("11")
4378 >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
4379 Decimal("-11")
4380 >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
4381 Decimal("1")
4382 >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
4383 Decimal("11")
4384 >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
4385 Decimal("11729830")
4386 >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
4387 Decimal("-0")
4388 >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
4389 Decimal("1")
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004390 """
4391 return a.__pow__(b, modulo, context=self)
4392
4393 def quantize(self, a, b):
Guido van Rossumd8faa362007-04-27 19:54:29 +00004394 """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004395
4396 The coefficient of the result is derived from that of the left-hand
Guido van Rossumd8faa362007-04-27 19:54:29 +00004397 operand. It may be rounded using the current rounding setting (if the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004398 exponent is being increased), multiplied by a positive power of ten (if
4399 the exponent is being decreased), or is unchanged (if the exponent is
4400 already equal to that of the right-hand operand).
4401
4402 Unlike other operations, if the length of the coefficient after the
4403 quantize operation would be greater than precision then an Invalid
Guido van Rossumd8faa362007-04-27 19:54:29 +00004404 operation condition is raised. This guarantees that, unless there is
4405 an error condition, the exponent of the result of a quantize is always
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004406 equal to that of the right-hand operand.
4407
4408 Also unlike other operations, quantize will never raise Underflow, even
4409 if the result is subnormal and inexact.
4410
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004411 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004412 Decimal("2.170")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004413 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004414 Decimal("2.17")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004415 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004416 Decimal("2.2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004417 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004418 Decimal("2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004419 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004420 Decimal("0E+1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004421 >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004422 Decimal("-Infinity")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004423 >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004424 Decimal("NaN")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004425 >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004426 Decimal("-0")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004427 >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004428 Decimal("-0E+5")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004429 >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004430 Decimal("NaN")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004431 >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004432 Decimal("NaN")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004433 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004434 Decimal("217.0")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004435 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004436 Decimal("217")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004437 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004438 Decimal("2.2E+2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004439 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004440 Decimal("2E+2")
4441 """
4442 return a.quantize(b, context=self)
4443
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004444 def radix(self):
4445 """Just returns 10, as this is Decimal, :)
4446
4447 >>> ExtendedContext.radix()
4448 Decimal("10")
4449 """
4450 return Decimal(10)
4451
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004452 def remainder(self, a, b):
4453 """Returns the remainder from integer division.
4454
4455 The result is the residue of the dividend after the operation of
Guido van Rossumd8faa362007-04-27 19:54:29 +00004456 calculating integer division as described for divide-integer, rounded
4457 to precision digits if necessary. The sign of the result, if
4458 non-zero, is the same as that of the original dividend.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004459
4460 This operation will fail under the same conditions as integer division
4461 (that is, if integer division on the same two operands would fail, the
4462 remainder cannot be calculated).
4463
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004464 >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004465 Decimal("2.1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004466 >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004467 Decimal("1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004468 >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004469 Decimal("-1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004470 >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004471 Decimal("0.2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004472 >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004473 Decimal("0.1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004474 >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004475 Decimal("1.0")
4476 """
4477 return a.__mod__(b, context=self)
4478
4479 def remainder_near(self, a, b):
4480 """Returns to be "a - b * n", where n is the integer nearest the exact
4481 value of "x / b" (if two integers are equally near then the even one
Guido van Rossumd8faa362007-04-27 19:54:29 +00004482 is chosen). If the result is equal to 0 then its sign will be the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004483 sign of a.
4484
4485 This operation will fail under the same conditions as integer division
4486 (that is, if integer division on the same two operands would fail, the
4487 remainder cannot be calculated).
4488
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004489 >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004490 Decimal("-0.9")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004491 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004492 Decimal("-2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004493 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004494 Decimal("1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004495 >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004496 Decimal("-1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004497 >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004498 Decimal("0.2")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004499 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004500 Decimal("0.1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004501 >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004502 Decimal("-0.3")
4503 """
4504 return a.remainder_near(b, context=self)
4505
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004506 def rotate(self, a, b):
4507 """Returns a rotated copy of a, b times.
4508
4509 The coefficient of the result is a rotated copy of the digits in
4510 the coefficient of the first operand. The number of places of
4511 rotation is taken from the absolute value of the second operand,
4512 with the rotation being to the left if the second operand is
4513 positive or to the right otherwise.
4514
4515 >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
4516 Decimal("400000003")
4517 >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
4518 Decimal("12")
4519 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
4520 Decimal("891234567")
4521 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
4522 Decimal("123456789")
4523 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
4524 Decimal("345678912")
4525 """
4526 return a.rotate(b, context=self)
4527
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004528 def same_quantum(self, a, b):
4529 """Returns True if the two operands have the same exponent.
4530
4531 The result is never affected by either the sign or the coefficient of
4532 either operand.
4533
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004534 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004535 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004536 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004537 True
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004538 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004539 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004540 >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004541 True
4542 """
4543 return a.same_quantum(b)
4544
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004545 def scaleb (self, a, b):
4546 """Returns the first operand after adding the second value its exp.
4547
4548 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
4549 Decimal("0.0750")
4550 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
4551 Decimal("7.50")
4552 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
4553 Decimal("7.50E+3")
4554 """
4555 return a.scaleb (b, context=self)
4556
4557 def shift(self, a, b):
4558 """Returns a shifted copy of a, b times.
4559
4560 The coefficient of the result is a shifted copy of the digits
4561 in the coefficient of the first operand. The number of places
4562 to shift is taken from the absolute value of the second operand,
4563 with the shift being to the left if the second operand is
4564 positive or to the right otherwise. Digits shifted into the
4565 coefficient are zeros.
4566
4567 >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
4568 Decimal("400000000")
4569 >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
4570 Decimal("0")
4571 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
4572 Decimal("1234567")
4573 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
4574 Decimal("123456789")
4575 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
4576 Decimal("345678900")
4577 """
4578 return a.shift(b, context=self)
4579
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004580 def sqrt(self, a):
Guido van Rossumd8faa362007-04-27 19:54:29 +00004581 """Square root of a non-negative number to context precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004582
4583 If the result must be inexact, it is rounded using the round-half-even
4584 algorithm.
4585
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004586 >>> ExtendedContext.sqrt(Decimal('0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004587 Decimal("0")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004588 >>> ExtendedContext.sqrt(Decimal('-0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004589 Decimal("-0")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004590 >>> ExtendedContext.sqrt(Decimal('0.39'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004591 Decimal("0.624499800")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004592 >>> ExtendedContext.sqrt(Decimal('100'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004593 Decimal("10")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004594 >>> ExtendedContext.sqrt(Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004595 Decimal("1")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004596 >>> ExtendedContext.sqrt(Decimal('1.0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004597 Decimal("1.0")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004598 >>> ExtendedContext.sqrt(Decimal('1.00'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004599 Decimal("1.0")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004600 >>> ExtendedContext.sqrt(Decimal('7'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004601 Decimal("2.64575131")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004602 >>> ExtendedContext.sqrt(Decimal('10'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004603 Decimal("3.16227766")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004604 >>> ExtendedContext.prec
Raymond Hettinger6ea48452004-07-03 12:26:21 +00004605 9
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004606 """
4607 return a.sqrt(context=self)
4608
4609 def subtract(self, a, b):
Georg Brandlf33d01d2005-08-22 19:35:18 +00004610 """Return the difference between the two operands.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004611
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004612 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004613 Decimal("0.23")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004614 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004615 Decimal("0.00")
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004616 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004617 Decimal("-0.77")
4618 """
4619 return a.__sub__(b, context=self)
4620
4621 def to_eng_string(self, a):
4622 """Converts a number to a string, using scientific notation.
4623
4624 The operation is not affected by the context.
4625 """
4626 return a.to_eng_string(context=self)
4627
4628 def to_sci_string(self, a):
4629 """Converts a number to a string, using scientific notation.
4630
4631 The operation is not affected by the context.
4632 """
4633 return a.__str__(context=self)
4634
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004635 def to_integral_exact(self, a):
4636 """Rounds to an integer.
4637
4638 When the operand has a negative exponent, the result is the same
4639 as using the quantize() operation using the given operand as the
4640 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
4641 of the operand as the precision setting; Inexact and Rounded flags
4642 are allowed in this operation. The rounding mode is taken from the
4643 context.
4644
4645 >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
4646 Decimal("2")
4647 >>> ExtendedContext.to_integral_exact(Decimal('100'))
4648 Decimal("100")
4649 >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
4650 Decimal("100")
4651 >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
4652 Decimal("102")
4653 >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
4654 Decimal("-102")
4655 >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
4656 Decimal("1.0E+6")
4657 >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
4658 Decimal("7.89E+77")
4659 >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
4660 Decimal("-Infinity")
4661 """
4662 return a.to_integral_exact(context=self)
4663
4664 def to_integral_value(self, a):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004665 """Rounds to an integer.
4666
4667 When the operand has a negative exponent, the result is the same
4668 as using the quantize() operation using the given operand as the
4669 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
4670 of the operand as the precision setting, except that no flags will
Guido van Rossumd8faa362007-04-27 19:54:29 +00004671 be set. The rounding mode is taken from the context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004672
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004673 >>> ExtendedContext.to_integral_value(Decimal('2.1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004674 Decimal("2")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004675 >>> ExtendedContext.to_integral_value(Decimal('100'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004676 Decimal("100")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004677 >>> ExtendedContext.to_integral_value(Decimal('100.0'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004678 Decimal("100")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004679 >>> ExtendedContext.to_integral_value(Decimal('101.5'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004680 Decimal("102")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004681 >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004682 Decimal("-102")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004683 >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004684 Decimal("1.0E+6")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004685 >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004686 Decimal("7.89E+77")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004687 >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004688 Decimal("-Infinity")
4689 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004690 return a.to_integral_value(context=self)
4691
4692 # the method name changed, but we provide also the old one, for compatibility
4693 to_integral = to_integral_value
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004694
4695class _WorkRep(object):
4696 __slots__ = ('sign','int','exp')
Raymond Hettinger17931de2004-10-27 06:21:46 +00004697 # sign: 0 or 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004698 # int: int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004699 # exp: None, int, or string
4700
4701 def __init__(self, value=None):
4702 if value is None:
4703 self.sign = None
Raymond Hettinger636a6b12004-09-19 01:54:09 +00004704 self.int = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004705 self.exp = None
Raymond Hettinger17931de2004-10-27 06:21:46 +00004706 elif isinstance(value, Decimal):
4707 self.sign = value._sign
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00004708 self.int = int(value._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004709 self.exp = value._exp
Raymond Hettinger17931de2004-10-27 06:21:46 +00004710 else:
4711 # assert isinstance(value, tuple)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004712 self.sign = value[0]
4713 self.int = value[1]
4714 self.exp = value[2]
4715
4716 def __repr__(self):
4717 return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
4718
4719 __str__ = __repr__
4720
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004721
4722
Christian Heimes2c181612007-12-17 20:04:13 +00004723def _normalize(op1, op2, prec = 0):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004724 """Normalizes op1, op2 to have the same exp and length of coefficient.
4725
4726 Done during addition.
4727 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004728 if op1.exp < op2.exp:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004729 tmp = op2
4730 other = op1
4731 else:
4732 tmp = op1
4733 other = op2
4734
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004735 # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
4736 # Then adding 10**exp to tmp has the same effect (after rounding)
4737 # as adding any positive quantity smaller than 10**exp; similarly
4738 # for subtraction. So if other is smaller than 10**exp we replace
4739 # it with 10**exp. This avoids tmp.exp - other.exp getting too large.
Christian Heimes2c181612007-12-17 20:04:13 +00004740 tmp_len = len(str(tmp.int))
4741 other_len = len(str(other.int))
4742 exp = tmp.exp + min(-1, tmp_len - prec - 2)
4743 if other_len + other.exp - 1 < exp:
4744 other.int = 1
4745 other.exp = exp
Raymond Hettinger636a6b12004-09-19 01:54:09 +00004746
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004747 tmp.int *= 10 ** (tmp.exp - other.exp)
4748 tmp.exp = other.exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004749 return op1, op2
4750
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004751##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004752
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004753# This function from Tim Peters was taken from here:
4754# http://mail.python.org/pipermail/python-list/1999-July/007758.html
4755# The correction being in the function definition is for speed, and
4756# the whole function is not resolved with math.log because of avoiding
4757# the use of floats.
4758def _nbits(n, correction = {
4759 '0': 4, '1': 3, '2': 2, '3': 2,
4760 '4': 1, '5': 1, '6': 1, '7': 1,
4761 '8': 0, '9': 0, 'a': 0, 'b': 0,
4762 'c': 0, 'd': 0, 'e': 0, 'f': 0}):
4763 """Number of bits in binary representation of the positive integer n,
4764 or 0 if n == 0.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004765 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004766 if n < 0:
4767 raise ValueError("The argument to _nbits should be nonnegative.")
4768 hex_n = "%x" % n
4769 return 4*len(hex_n) - correction[hex_n[0]]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004770
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004771def _sqrt_nearest(n, a):
4772 """Closest integer to the square root of the positive integer n. a is
4773 an initial approximation to the square root. Any positive integer
4774 will do for a, but the closer a is to the square root of n the
4775 faster convergence will be.
Raymond Hettinger636a6b12004-09-19 01:54:09 +00004776
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004777 """
4778 if n <= 0 or a <= 0:
4779 raise ValueError("Both arguments to _sqrt_nearest should be positive.")
4780
4781 b=0
4782 while a != b:
4783 b, a = a, a--n//a>>1
4784 return a
4785
4786def _rshift_nearest(x, shift):
4787 """Given an integer x and a nonnegative integer shift, return closest
4788 integer to x / 2**shift; use round-to-even in case of a tie.
4789
4790 """
4791 b, q = 1 << shift, x >> shift
4792 return q + (2*(x & (b-1)) + (q&1) > b)
4793
4794def _div_nearest(a, b):
4795 """Closest integer to a/b, a and b positive integers; rounds to even
4796 in the case of a tie.
4797
4798 """
4799 q, r = divmod(a, b)
4800 return q + (2*r + (q&1) > b)
4801
4802def _ilog(x, M, L = 8):
4803 """Integer approximation to M*log(x/M), with absolute error boundable
4804 in terms only of x/M.
4805
4806 Given positive integers x and M, return an integer approximation to
4807 M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference
4808 between the approximation and the exact result is at most 22. For
4809 L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In
4810 both cases these are upper bounds on the error; it will usually be
4811 much smaller."""
4812
4813 # The basic algorithm is the following: let log1p be the function
4814 # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use
4815 # the reduction
4816 #
4817 # log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
4818 #
4819 # repeatedly until the argument to log1p is small (< 2**-L in
4820 # absolute value). For small y we can use the Taylor series
4821 # expansion
4822 #
4823 # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
4824 #
4825 # truncating at T such that y**T is small enough. The whole
4826 # computation is carried out in a form of fixed-point arithmetic,
4827 # with a real number z being represented by an integer
4828 # approximation to z*M. To avoid loss of precision, the y below
4829 # is actually an integer approximation to 2**R*y*M, where R is the
4830 # number of reductions performed so far.
4831
4832 y = x-M
4833 # argument reduction; R = number of reductions performed
4834 R = 0
4835 while (R <= L and abs(y) << L-R >= M or
4836 R > L and abs(y) >> R-L >= M):
4837 y = _div_nearest((M*y) << 1,
4838 M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
4839 R += 1
4840
4841 # Taylor series with T terms
4842 T = -int(-10*len(str(M))//(3*L))
4843 yshift = _rshift_nearest(y, R)
4844 w = _div_nearest(M, T)
4845 for k in range(T-1, 0, -1):
4846 w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
4847
4848 return _div_nearest(w*y, M)
4849
4850def _dlog10(c, e, p):
4851 """Given integers c, e and p with c > 0, p >= 0, compute an integer
4852 approximation to 10**p * log10(c*10**e), with an absolute error of
4853 at most 1. Assumes that c*10**e is not exactly 1."""
4854
4855 # increase precision by 2; compensate for this by dividing
4856 # final result by 100
4857 p += 2
4858
4859 # write c*10**e as d*10**f with either:
4860 # f >= 0 and 1 <= d <= 10, or
4861 # f <= 0 and 0.1 <= d <= 1.
4862 # Thus for c*10**e close to 1, f = 0
4863 l = len(str(c))
4864 f = e+l - (e+l >= 1)
4865
4866 if p > 0:
4867 M = 10**p
4868 k = e+p-f
4869 if k >= 0:
4870 c *= 10**k
4871 else:
4872 c = _div_nearest(c, 10**-k)
4873
4874 log_d = _ilog(c, M) # error < 5 + 22 = 27
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004875 log_10 = _log10_digits(p) # error < 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004876 log_d = _div_nearest(log_d*M, log_10)
4877 log_tenpower = f*M # exact
4878 else:
4879 log_d = 0 # error < 2.31
4880 log_tenpower = div_nearest(f, 10**-p) # error < 0.5
4881
4882 return _div_nearest(log_tenpower+log_d, 100)
4883
4884def _dlog(c, e, p):
4885 """Given integers c, e and p with c > 0, compute an integer
4886 approximation to 10**p * log(c*10**e), with an absolute error of
4887 at most 1. Assumes that c*10**e is not exactly 1."""
4888
4889 # Increase precision by 2. The precision increase is compensated
4890 # for at the end with a division by 100.
4891 p += 2
4892
4893 # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
4894 # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e)
4895 # as 10**p * log(d) + 10**p*f * log(10).
4896 l = len(str(c))
4897 f = e+l - (e+l >= 1)
4898
4899 # compute approximation to 10**p*log(d), with error < 27
4900 if p > 0:
4901 k = e+p-f
4902 if k >= 0:
4903 c *= 10**k
4904 else:
4905 c = _div_nearest(c, 10**-k) # error of <= 0.5 in c
4906
4907 # _ilog magnifies existing error in c by a factor of at most 10
4908 log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
4909 else:
4910 # p <= 0: just approximate the whole thing by 0; error < 2.31
4911 log_d = 0
4912
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004913 # compute approximation to f*10**p*log(10), with error < 11.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004914 if f:
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004915 extra = len(str(abs(f)))-1
4916 if p + extra >= 0:
4917 # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
4918 # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
4919 f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004920 else:
4921 f_log_ten = 0
4922 else:
4923 f_log_ten = 0
4924
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004925 # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004926 return _div_nearest(f_log_ten + log_d, 100)
4927
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004928class _Log10Memoize(object):
4929 """Class to compute, store, and allow retrieval of, digits of the
4930 constant log(10) = 2.302585.... This constant is needed by
4931 Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
4932 def __init__(self):
4933 self.digits = "23025850929940456840179914546843642076011014886"
4934
4935 def getdigits(self, p):
4936 """Given an integer p >= 0, return floor(10**p)*log(10).
4937
4938 For example, self.getdigits(3) returns 2302.
4939 """
4940 # digits are stored as a string, for quick conversion to
4941 # integer in the case that we've already computed enough
4942 # digits; the stored digits should always be correct
4943 # (truncated, not rounded to nearest).
4944 if p < 0:
4945 raise ValueError("p should be nonnegative")
4946
4947 if p >= len(self.digits):
4948 # compute p+3, p+6, p+9, ... digits; continue until at
4949 # least one of the extra digits is nonzero
4950 extra = 3
4951 while True:
4952 # compute p+extra digits, correct to within 1ulp
4953 M = 10**(p+extra+2)
4954 digits = str(_div_nearest(_ilog(10*M, M), 100))
4955 if digits[-extra:] != '0'*extra:
4956 break
4957 extra += 3
4958 # keep all reliable digits so far; remove trailing zeros
4959 # and next nonzero digit
4960 self.digits = digits.rstrip('0')[:-1]
4961 return int(self.digits[:p+1])
4962
4963_log10_digits = _Log10Memoize().getdigits
4964
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004965def _iexp(x, M, L=8):
4966 """Given integers x and M, M > 0, such that x/M is small in absolute
4967 value, compute an integer approximation to M*exp(x/M). For 0 <=
4968 x/M <= 2.4, the absolute error in the result is bounded by 60 (and
4969 is usually much smaller)."""
4970
4971 # Algorithm: to compute exp(z) for a real number z, first divide z
4972 # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then
4973 # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
4974 # series
4975 #
4976 # expm1(x) = x + x**2/2! + x**3/3! + ...
4977 #
4978 # Now use the identity
4979 #
4980 # expm1(2x) = expm1(x)*(expm1(x)+2)
4981 #
4982 # R times to compute the sequence expm1(z/2**R),
4983 # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
4984
4985 # Find R such that x/2**R/M <= 2**-L
4986 R = _nbits((x<<L)//M)
4987
4988 # Taylor series. (2**L)**T > M
4989 T = -int(-10*len(str(M))//(3*L))
4990 y = _div_nearest(x, T)
4991 Mshift = M<<R
4992 for i in range(T-1, 0, -1):
4993 y = _div_nearest(x*(Mshift + y), Mshift * i)
4994
4995 # Expansion
4996 for k in range(R-1, -1, -1):
4997 Mshift = M<<(k+2)
4998 y = _div_nearest(y*(y+Mshift), Mshift)
4999
5000 return M+y
5001
5002def _dexp(c, e, p):
5003 """Compute an approximation to exp(c*10**e), with p decimal places of
5004 precision.
5005
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005006 Returns integers d, f such that:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005007
5008 10**(p-1) <= d <= 10**p, and
5009 (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
5010
5011 In other words, d*10**f is an approximation to exp(c*10**e) with p
5012 digits of precision, and with an error in d of at most 1. This is
5013 almost, but not quite, the same as the error being < 1ulp: when d
5014 = 10**(p-1) the error could be up to 10 ulp."""
5015
5016 # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
5017 p += 2
5018
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005019 # compute log(10) with extra precision = adjusted exponent of c*10**e
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005020 extra = max(0, e + len(str(c)) - 1)
5021 q = p + extra
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005022
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005023 # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005024 # rounding down
5025 shift = e+q
5026 if shift >= 0:
5027 cshift = c*10**shift
5028 else:
5029 cshift = c//10**-shift
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005030 quot, rem = divmod(cshift, _log10_digits(q))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005031
5032 # reduce remainder back to original precision
5033 rem = _div_nearest(rem, 10**extra)
5034
5035 # error in result of _iexp < 120; error after division < 0.62
5036 return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
5037
5038def _dpower(xc, xe, yc, ye, p):
5039 """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
5040 y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that:
5041
5042 10**(p-1) <= c <= 10**p, and
5043 (c-1)*10**e < x**y < (c+1)*10**e
5044
5045 in other words, c*10**e is an approximation to x**y with p digits
5046 of precision, and with an error in c of at most 1. (This is
5047 almost, but not quite, the same as the error being < 1ulp: when c
5048 == 10**(p-1) we can only guarantee error < 10ulp.)
5049
5050 We assume that: x is positive and not equal to 1, and y is nonzero.
5051 """
5052
5053 # Find b such that 10**(b-1) <= |y| <= 10**b
5054 b = len(str(abs(yc))) + ye
5055
5056 # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
5057 lxc = _dlog(xc, xe, p+b+1)
5058
5059 # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
5060 shift = ye-b
5061 if shift >= 0:
5062 pc = lxc*yc*10**shift
5063 else:
5064 pc = _div_nearest(lxc*yc, 10**-shift)
5065
5066 if pc == 0:
5067 # we prefer a result that isn't exactly 1; this makes it
5068 # easier to compute a correctly rounded result in __pow__
5069 if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
5070 coeff, exp = 10**(p-1)+1, 1-p
5071 else:
5072 coeff, exp = 10**p-1, -p
5073 else:
5074 coeff, exp = _dexp(pc, -(p+1), p+1)
5075 coeff = _div_nearest(coeff, 10)
5076 exp += 1
5077
5078 return coeff, exp
5079
5080def _log10_lb(c, correction = {
5081 '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
5082 '6': 23, '7': 16, '8': 10, '9': 5}):
5083 """Compute a lower bound for 100*log10(c) for a positive integer c."""
5084 if c <= 0:
5085 raise ValueError("The argument to _log10_lb should be nonnegative.")
5086 str_c = str(c)
5087 return 100*len(str_c) - correction[str_c[0]]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005088
Guido van Rossumd8faa362007-04-27 19:54:29 +00005089##### Helper Functions ####################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005090
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005091def _convert_other(other, raiseit=False):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005092 """Convert other to Decimal.
5093
5094 Verifies that it's ok to use in an implicit construction.
5095 """
5096 if isinstance(other, Decimal):
5097 return other
Walter Dörwaldaa97f042007-05-03 21:05:51 +00005098 if isinstance(other, int):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005099 return Decimal(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005100 if raiseit:
5101 raise TypeError("Unable to convert %s to Decimal" % other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00005102 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005103
Guido van Rossumd8faa362007-04-27 19:54:29 +00005104##### Setup Specific Contexts ############################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005105
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005106# The default context prototype used by Context()
Raymond Hettingerfed52962004-07-14 15:41:57 +00005107# Is mutable, so that new contexts can have different default values
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005108
5109DefaultContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005110 prec=28, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005111 traps=[DivisionByZero, Overflow, InvalidOperation],
5112 flags=[],
Raymond Hettinger99148e72004-07-14 19:56:56 +00005113 Emax=999999999,
5114 Emin=-999999999,
Raymond Hettingere0f15812004-07-05 05:36:39 +00005115 capitals=1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005116)
5117
5118# Pre-made alternate contexts offered by the specification
5119# Don't change these; the user should be able to select these
5120# contexts and be able to reproduce results from other implementations
5121# of the spec.
5122
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005123BasicContext = Context(
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005124 prec=9, rounding=ROUND_HALF_UP,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005125 traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
5126 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005127)
5128
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005129ExtendedContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005130 prec=9, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005131 traps=[],
5132 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005133)
5134
5135
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005136##### crud for parsing strings #############################################
5137import re
5138
5139# Regular expression used for parsing numeric strings. Additional
5140# comments:
5141#
5142# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
5143# whitespace. But note that the specification disallows whitespace in
5144# a numeric string.
5145#
5146# 2. For finite numbers (not infinities and NaNs) the body of the
5147# number between the optional sign and the optional exponent must have
5148# at least one decimal digit, possibly after the decimal point. The
5149# lookahead expression '(?=\d|\.\d)' checks this.
5150#
5151# As the flag UNICODE is not enabled here, we're explicitly avoiding any
5152# other meaning for \d than the numbers [0-9].
5153
5154import re
5155_parser = re.compile(r""" # A numeric string consists of:
5156# \s*
5157 (?P<sign>[-+])? # an optional sign, followed by either...
5158 (
5159 (?=\d|\.\d) # ...a number (with at least one digit)
5160 (?P<int>\d*) # consisting of a (possibly empty) integer part
5161 (\.(?P<frac>\d*))? # followed by an optional fractional part
5162 (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
5163 |
5164 Inf(inity)? # ...an infinity, or...
5165 |
5166 (?P<signal>s)? # ...an (optionally signaling)
5167 NaN # NaN
5168 (?P<diag>\d*) # with (possibly empty) diagnostic information.
5169 )
5170# \s*
Christian Heimesa62da1d2008-01-12 19:39:10 +00005171 \Z
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005172""", re.VERBOSE | re.IGNORECASE).match
5173
Christian Heimescbf3b5c2007-12-03 21:02:03 +00005174_all_zeros = re.compile('0*$').match
5175_exact_half = re.compile('50*$').match
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005176del re
5177
5178
Guido van Rossumd8faa362007-04-27 19:54:29 +00005179##### Useful Constants (internal use only) ################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005180
Guido van Rossumd8faa362007-04-27 19:54:29 +00005181# Reusable defaults
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005182Inf = Decimal('Inf')
5183negInf = Decimal('-Inf')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005184NaN = Decimal('NaN')
5185Dec_0 = Decimal(0)
5186Dec_p1 = Decimal(1)
5187Dec_n1 = Decimal(-1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005188
Guido van Rossumd8faa362007-04-27 19:54:29 +00005189# Infsign[sign] is infinity w/ that sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005190Infsign = (Inf, negInf)
5191
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005192
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005193
5194if __name__ == '__main__':
5195 import doctest, sys
5196 doctest.testmod(sys.modules[__name__])