blob: 5e53d8e3c5e6c365645b76b9d436e15391b3a6ea [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
Facundo Batista6ab24792009-02-16 15:41:37 +000010# This module should be kept in sync with the latest updates of the
11# IBM specification as it evolves. Those updates will be treated
Raymond Hettinger27dbcf22004-08-19 22:39:55 +000012# as bug fixes (deviation from the spec is a compatibility, usability
13# bug) and will be backported. At this point the spec is stabilizing
14# and the updates are becoming fewer, smaller, and less significant.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000015
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000016"""
Facundo Batista6ab24792009-02-16 15:41:37 +000017This is an implementation of decimal floating point arithmetic based on
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000018the General Decimal Arithmetic Specification:
19
Raymond Hettinger960dc362009-04-21 03:43:15 +000020 http://speleotrove.com/decimal/decarith.html
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000021
Raymond Hettinger0ea241e2004-07-04 13:53:24 +000022and IEEE standard 854-1987:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000023
24 www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
25
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000026Decimal floating point has finite precision with arbitrarily large bounds.
27
Guido van Rossumd8faa362007-04-27 19:54:29 +000028The purpose of this module is to support arithmetic using familiar
29"schoolhouse" rules and to avoid some of the tricky representation
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000030issues associated with binary floating point. The package is especially
31useful for financial applications or for contexts where users have
32expectations that are at odds with binary floating point (for instance,
33in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
Christian Heimes68f5fbe2008-02-14 08:27:37 +000034of the expected Decimal('0.00') returned by decimal floating point).
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000035
36Here are some examples of using the decimal module:
37
38>>> from decimal import *
Raymond Hettingerbd7f76d2004-07-08 00:49:18 +000039>>> setcontext(ExtendedContext)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000040>>> Decimal(0)
Christian Heimes68f5fbe2008-02-14 08:27:37 +000041Decimal('0')
42>>> Decimal('1')
43Decimal('1')
44>>> Decimal('-.0123')
45Decimal('-0.0123')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000046>>> Decimal(123456)
Christian Heimes68f5fbe2008-02-14 08:27:37 +000047Decimal('123456')
48>>> Decimal('123.45e12345678901234567890')
49Decimal('1.2345E+12345678901234567892')
50>>> Decimal('1.33') + Decimal('1.27')
51Decimal('2.60')
52>>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41')
53Decimal('-2.20')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000054>>> dig = Decimal(1)
Guido van Rossum7131f842007-02-09 20:13:25 +000055>>> print(dig / Decimal(3))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000560.333333333
57>>> getcontext().prec = 18
Guido van Rossum7131f842007-02-09 20:13:25 +000058>>> print(dig / Decimal(3))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000590.333333333333333333
Guido van Rossum7131f842007-02-09 20:13:25 +000060>>> print(dig.sqrt())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000611
Guido van Rossum7131f842007-02-09 20:13:25 +000062>>> print(Decimal(3).sqrt())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000631.73205080756887729
Guido van Rossum7131f842007-02-09 20:13:25 +000064>>> print(Decimal(3) ** 123)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000654.85192780976896427E+58
66>>> inf = Decimal(1) / Decimal(0)
Guido van Rossum7131f842007-02-09 20:13:25 +000067>>> print(inf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000068Infinity
69>>> neginf = Decimal(-1) / Decimal(0)
Guido van Rossum7131f842007-02-09 20:13:25 +000070>>> print(neginf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000071-Infinity
Guido van Rossum7131f842007-02-09 20:13:25 +000072>>> print(neginf + inf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000073NaN
Guido van Rossum7131f842007-02-09 20:13:25 +000074>>> print(neginf * inf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000075-Infinity
Guido van Rossum7131f842007-02-09 20:13:25 +000076>>> print(dig / 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000077Infinity
Raymond Hettingerbf440692004-07-10 14:14:37 +000078>>> getcontext().traps[DivisionByZero] = 1
Guido van Rossum7131f842007-02-09 20:13:25 +000079>>> print(dig / 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000080Traceback (most recent call last):
81 ...
82 ...
83 ...
Guido van Rossum6a2a2a02006-08-26 20:37:44 +000084decimal.DivisionByZero: x / 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000085>>> c = Context()
Raymond Hettingerbf440692004-07-10 14:14:37 +000086>>> c.traps[InvalidOperation] = 0
Guido van Rossum7131f842007-02-09 20:13:25 +000087>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000880
89>>> c.divide(Decimal(0), Decimal(0))
Christian Heimes68f5fbe2008-02-14 08:27:37 +000090Decimal('NaN')
Raymond Hettingerbf440692004-07-10 14:14:37 +000091>>> c.traps[InvalidOperation] = 1
Guido van Rossum7131f842007-02-09 20:13:25 +000092>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000931
Raymond Hettinger5aa478b2004-07-09 10:02:53 +000094>>> c.flags[InvalidOperation] = 0
Guido van Rossum7131f842007-02-09 20:13:25 +000095>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000960
Guido van Rossum7131f842007-02-09 20:13:25 +000097>>> print(c.divide(Decimal(0), Decimal(0)))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000098Traceback (most recent call last):
99 ...
100 ...
101 ...
Guido van Rossum6a2a2a02006-08-26 20:37:44 +0000102decimal.InvalidOperation: 0 / 0
Guido van Rossum7131f842007-02-09 20:13:25 +0000103>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001041
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000105>>> c.flags[InvalidOperation] = 0
Raymond Hettingerbf440692004-07-10 14:14:37 +0000106>>> c.traps[InvalidOperation] = 0
Guido van Rossum7131f842007-02-09 20:13:25 +0000107>>> print(c.divide(Decimal(0), Decimal(0)))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000108NaN
Guido van Rossum7131f842007-02-09 20:13:25 +0000109>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001101
111>>>
112"""
113
114__all__ = [
115 # Two major classes
116 'Decimal', 'Context',
117
118 # Contexts
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +0000119 'DefaultContext', 'BasicContext', 'ExtendedContext',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000120
121 # Exceptions
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +0000122 'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
123 'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000124
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000125 # Constants for use in setting up contexts
126 'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000127 'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000128
129 # Functions for manipulating contexts
Thomas Wouters89f507f2006-12-13 04:49:30 +0000130 'setcontext', 'getcontext', 'localcontext'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000131]
132
Raymond Hettinger960dc362009-04-21 03:43:15 +0000133__version__ = '1.70' # Highest version of the spec this complies with
134
Raymond Hettingereb260842005-06-07 18:52:34 +0000135import copy as _copy
Raymond Hettinger771ed762009-01-03 19:20:32 +0000136import math as _math
Raymond Hettinger82417ca2009-02-03 03:54:28 +0000137import numbers as _numbers
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000138
Christian Heimes25bb7832008-01-11 16:17:00 +0000139try:
140 from collections import namedtuple as _namedtuple
141 DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
142except ImportError:
143 DecimalTuple = lambda *args: args
144
Guido van Rossumd8faa362007-04-27 19:54:29 +0000145# Rounding
Raymond Hettinger0ea241e2004-07-04 13:53:24 +0000146ROUND_DOWN = 'ROUND_DOWN'
147ROUND_HALF_UP = 'ROUND_HALF_UP'
148ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
149ROUND_CEILING = 'ROUND_CEILING'
150ROUND_FLOOR = 'ROUND_FLOOR'
151ROUND_UP = 'ROUND_UP'
152ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000153ROUND_05UP = 'ROUND_05UP'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000154
Guido van Rossumd8faa362007-04-27 19:54:29 +0000155# Errors
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000156
157class DecimalException(ArithmeticError):
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000158 """Base exception class.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000159
160 Used exceptions derive from this.
161 If an exception derives from another exception besides this (such as
162 Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
163 called if the others are present. This isn't actually used for
164 anything, though.
165
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000166 handle -- Called when context._raise_error is called and the
Stefan Krah395653e2010-05-19 15:54:54 +0000167 trap_enabler is not set. First argument is self, second is the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000168 context. More arguments can be given, those being after
169 the explanation in _raise_error (For example,
170 context._raise_error(NewError, '(-x)!', self._sign) would
171 call NewError().handle(context, self._sign).)
172
173 To define a new exception, it should be sufficient to have it derive
174 from DecimalException.
175 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000176 def handle(self, context, *args):
177 pass
178
179
180class Clamped(DecimalException):
181 """Exponent of a 0 changed to fit bounds.
182
183 This occurs and signals clamped if the exponent of a result has been
184 altered in order to fit the constraints of a specific concrete
Guido van Rossumd8faa362007-04-27 19:54:29 +0000185 representation. This may occur when the exponent of a zero result would
186 be outside the bounds of a representation, or when a large normal
187 number would have an encoded exponent that cannot be represented. In
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000188 this latter case, the exponent is reduced to fit and the corresponding
189 number of zero digits are appended to the coefficient ("fold-down").
190 """
191
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000192class InvalidOperation(DecimalException):
193 """An invalid operation was performed.
194
195 Various bad things cause this:
196
197 Something creates a signaling NaN
198 -INF + INF
Guido van Rossumd8faa362007-04-27 19:54:29 +0000199 0 * (+-)INF
200 (+-)INF / (+-)INF
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000201 x % 0
202 (+-)INF % x
203 x._rescale( non-integer )
204 sqrt(-x) , x > 0
205 0 ** 0
206 x ** (non-integer)
207 x ** (+-)INF
208 An operand is invalid
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000209
210 The result of the operation after these is a quiet positive NaN,
211 except when the cause is a signaling NaN, in which case the result is
212 also a quiet NaN, but with the original sign, and an optional
213 diagnostic information.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000214 """
215 def handle(self, context, *args):
216 if args:
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000217 ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
218 return ans._fix_nan(context)
Mark Dickinsonf9236412009-01-02 23:23:21 +0000219 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000220
221class ConversionSyntax(InvalidOperation):
222 """Trying to convert badly formed string.
223
224 This occurs and signals invalid-operation if an string is being
225 converted to a number and it does not conform to the numeric string
Guido van Rossumd8faa362007-04-27 19:54:29 +0000226 syntax. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000227 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000228 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000229 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000230
231class DivisionByZero(DecimalException, ZeroDivisionError):
232 """Division by 0.
233
234 This occurs and signals division-by-zero if division of a finite number
235 by zero was attempted (during a divide-integer or divide operation, or a
236 power operation with negative right-hand operand), and the dividend was
237 not zero.
238
239 The result of the operation is [sign,inf], where sign is the exclusive
240 or of the signs of the operands for divide, or is 1 for an odd power of
241 -0, for power.
242 """
243
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000244 def handle(self, context, sign, *args):
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000245 return _SignedInfinity[sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000246
247class DivisionImpossible(InvalidOperation):
248 """Cannot perform the division adequately.
249
250 This occurs and signals invalid-operation if the integer result of a
251 divide-integer or remainder operation had too many digits (would be
Guido van Rossumd8faa362007-04-27 19:54:29 +0000252 longer than precision). The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000253 """
254
255 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000256 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000257
258class DivisionUndefined(InvalidOperation, ZeroDivisionError):
259 """Undefined result of division.
260
261 This occurs and signals invalid-operation if division by zero was
262 attempted (during a divide-integer, divide, or remainder operation), and
Guido van Rossumd8faa362007-04-27 19:54:29 +0000263 the dividend is also zero. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000264 """
265
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000266 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000267 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000268
269class Inexact(DecimalException):
270 """Had to round, losing information.
271
272 This occurs and signals inexact whenever the result of an operation is
273 not exact (that is, it needed to be rounded and any discarded digits
Guido van Rossumd8faa362007-04-27 19:54:29 +0000274 were non-zero), or if an overflow or underflow condition occurs. The
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000275 result in all cases is unchanged.
276
277 The inexact signal may be tested (or trapped) to determine if a given
278 operation (or sequence of operations) was inexact.
279 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000280
281class InvalidContext(InvalidOperation):
282 """Invalid context. Unknown rounding, for example.
283
284 This occurs and signals invalid-operation if an invalid context was
Guido van Rossumd8faa362007-04-27 19:54:29 +0000285 detected during an operation. This can occur if contexts are not checked
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000286 on creation and either the precision exceeds the capability of the
287 underlying concrete representation or an unknown or unsupported rounding
Guido van Rossumd8faa362007-04-27 19:54:29 +0000288 was specified. These aspects of the context need only be checked when
289 the values are required to be used. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000290 """
291
292 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000293 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000294
295class Rounded(DecimalException):
296 """Number got rounded (not necessarily changed during rounding).
297
298 This occurs and signals rounded whenever the result of an operation is
299 rounded (that is, some zero or non-zero digits were discarded from the
Guido van Rossumd8faa362007-04-27 19:54:29 +0000300 coefficient), or if an overflow or underflow condition occurs. The
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000301 result in all cases is unchanged.
302
303 The rounded signal may be tested (or trapped) to determine if a given
304 operation (or sequence of operations) caused a loss of precision.
305 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000306
307class Subnormal(DecimalException):
308 """Exponent < Emin before rounding.
309
310 This occurs and signals subnormal whenever the result of a conversion or
311 operation is subnormal (that is, its adjusted exponent is less than
Guido van Rossumd8faa362007-04-27 19:54:29 +0000312 Emin, before any rounding). The result in all cases is unchanged.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000313
314 The subnormal signal may be tested (or trapped) to determine if a given
315 or operation (or sequence of operations) yielded a subnormal result.
316 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000317
318class Overflow(Inexact, Rounded):
319 """Numerical overflow.
320
321 This occurs and signals overflow if the adjusted exponent of a result
322 (from a conversion or from an operation that is not an attempt to divide
323 by zero), after rounding, would be greater than the largest value that
324 can be handled by the implementation (the value Emax).
325
326 The result depends on the rounding mode:
327
328 For round-half-up and round-half-even (and for round-half-down and
329 round-up, if implemented), the result of the operation is [sign,inf],
Guido van Rossumd8faa362007-04-27 19:54:29 +0000330 where sign is the sign of the intermediate result. For round-down, the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000331 result is the largest finite number that can be represented in the
Guido van Rossumd8faa362007-04-27 19:54:29 +0000332 current precision, with the sign of the intermediate result. For
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000333 round-ceiling, the result is the same as for round-down if the sign of
Guido van Rossumd8faa362007-04-27 19:54:29 +0000334 the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000335 the result is the same as for round-down if the sign of the intermediate
Guido van Rossumd8faa362007-04-27 19:54:29 +0000336 result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000337 will also be raised.
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000338 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000339
340 def handle(self, context, sign, *args):
341 if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000342 ROUND_HALF_DOWN, ROUND_UP):
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000343 return _SignedInfinity[sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000344 if sign == 0:
345 if context.rounding == ROUND_CEILING:
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000346 return _SignedInfinity[sign]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000347 return _dec_from_triple(sign, '9'*context.prec,
348 context.Emax-context.prec+1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000349 if sign == 1:
350 if context.rounding == ROUND_FLOOR:
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000351 return _SignedInfinity[sign]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000352 return _dec_from_triple(sign, '9'*context.prec,
353 context.Emax-context.prec+1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000354
355
356class Underflow(Inexact, Rounded, Subnormal):
357 """Numerical underflow with result rounded to 0.
358
359 This occurs and signals underflow if a result is inexact and the
360 adjusted exponent of the result would be smaller (more negative) than
361 the smallest value that can be handled by the implementation (the value
Guido van Rossumd8faa362007-04-27 19:54:29 +0000362 Emin). That is, the result is both inexact and subnormal.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000363
364 The result after an underflow will be a subnormal number rounded, if
Guido van Rossumd8faa362007-04-27 19:54:29 +0000365 necessary, so that its exponent is not less than Etiny. This may result
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000366 in 0 with the sign of the intermediate result and an exponent of Etiny.
367
368 In all cases, Inexact, Rounded, and Subnormal will also be raised.
369 """
370
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000371# List of public traps and flags
Raymond Hettingerfed52962004-07-14 15:41:57 +0000372_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000373 Underflow, InvalidOperation, Subnormal]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000374
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000375# Map conditions (per the spec) to signals
376_condition_map = {ConversionSyntax:InvalidOperation,
377 DivisionImpossible:InvalidOperation,
378 DivisionUndefined:InvalidOperation,
379 InvalidContext:InvalidOperation}
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000380
Guido van Rossumd8faa362007-04-27 19:54:29 +0000381##### Context Functions ##################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000382
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000383# The getcontext() and setcontext() function manage access to a thread-local
384# current context. Py2.4 offers direct support for thread locals. If that
Georg Brandlf9926402008-06-13 06:32:25 +0000385# is not available, use threading.current_thread() which is slower but will
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000386# work for older Pythons. If threads are not part of the build, create a
387# mock threading object with threading.local() returning the module namespace.
388
389try:
390 import threading
391except ImportError:
392 # Python was compiled without threads; create a mock object instead
393 import sys
Guido van Rossumd8faa362007-04-27 19:54:29 +0000394 class MockThreading(object):
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000395 def local(self, sys=sys):
396 return sys.modules[__name__]
397 threading = MockThreading()
398 del sys, MockThreading
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000399
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000400try:
401 threading.local
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000402
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000403except AttributeError:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000404
Guido van Rossumd8faa362007-04-27 19:54:29 +0000405 # To fix reloading, force it to create a new context
406 # Old contexts have different exceptions in their dicts, making problems.
Georg Brandlf9926402008-06-13 06:32:25 +0000407 if hasattr(threading.current_thread(), '__decimal_context__'):
408 del threading.current_thread().__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000409
410 def setcontext(context):
411 """Set this thread's context to context."""
412 if context in (DefaultContext, BasicContext, ExtendedContext):
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000413 context = context.copy()
Raymond Hettinger61992ef2004-08-06 23:42:16 +0000414 context.clear_flags()
Georg Brandlf9926402008-06-13 06:32:25 +0000415 threading.current_thread().__decimal_context__ = context
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000416
417 def getcontext():
418 """Returns this thread's context.
419
420 If this thread does not yet have a context, returns
421 a new context and sets this thread's context.
422 New contexts are copies of DefaultContext.
423 """
424 try:
Georg Brandlf9926402008-06-13 06:32:25 +0000425 return threading.current_thread().__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000426 except AttributeError:
427 context = Context()
Georg Brandlf9926402008-06-13 06:32:25 +0000428 threading.current_thread().__decimal_context__ = context
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000429 return context
430
431else:
432
433 local = threading.local()
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000434 if hasattr(local, '__decimal_context__'):
435 del local.__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000436
437 def getcontext(_local=local):
438 """Returns this thread's context.
439
440 If this thread does not yet have a context, returns
441 a new context and sets this thread's context.
442 New contexts are copies of DefaultContext.
443 """
444 try:
445 return _local.__decimal_context__
446 except AttributeError:
447 context = Context()
448 _local.__decimal_context__ = context
449 return context
450
451 def setcontext(context, _local=local):
452 """Set this thread's context to context."""
453 if context in (DefaultContext, BasicContext, ExtendedContext):
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000454 context = context.copy()
Raymond Hettinger61992ef2004-08-06 23:42:16 +0000455 context.clear_flags()
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000456 _local.__decimal_context__ = context
457
458 del threading, local # Don't contaminate the namespace
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000459
Thomas Wouters89f507f2006-12-13 04:49:30 +0000460def localcontext(ctx=None):
461 """Return a context manager for a copy of the supplied context
462
463 Uses a copy of the current context if no context is specified
464 The returned context manager creates a local decimal context
465 in a with statement:
466 def sin(x):
467 with localcontext() as ctx:
468 ctx.prec += 2
469 # Rest of sin calculation algorithm
470 # uses a precision 2 greater than normal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000471 return +s # Convert result to normal precision
Thomas Wouters89f507f2006-12-13 04:49:30 +0000472
473 def sin(x):
474 with localcontext(ExtendedContext):
475 # Rest of sin calculation algorithm
476 # uses the Extended Context from the
477 # General Decimal Arithmetic Specification
Guido van Rossumd8faa362007-04-27 19:54:29 +0000478 return +s # Convert result to normal context
Thomas Wouters89f507f2006-12-13 04:49:30 +0000479
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000480 >>> setcontext(DefaultContext)
Guido van Rossum7131f842007-02-09 20:13:25 +0000481 >>> print(getcontext().prec)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000482 28
483 >>> with localcontext():
484 ... ctx = getcontext()
Thomas Wouterscf297e42007-02-23 15:07:44 +0000485 ... ctx.prec += 2
Guido van Rossum7131f842007-02-09 20:13:25 +0000486 ... print(ctx.prec)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000487 ...
Thomas Wouters89f507f2006-12-13 04:49:30 +0000488 30
489 >>> with localcontext(ExtendedContext):
Guido van Rossum7131f842007-02-09 20:13:25 +0000490 ... print(getcontext().prec)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000491 ...
Thomas Wouters89f507f2006-12-13 04:49:30 +0000492 9
Guido van Rossum7131f842007-02-09 20:13:25 +0000493 >>> print(getcontext().prec)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000494 28
495 """
496 if ctx is None: ctx = getcontext()
497 return _ContextManager(ctx)
498
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000499
Guido van Rossumd8faa362007-04-27 19:54:29 +0000500##### Decimal class #######################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000501
Raymond Hettingera0fd8882009-01-20 07:24:44 +0000502# Do not subclass Decimal from numbers.Real and do not register it as such
503# (because Decimals are not interoperable with floats). See the notes in
504# numbers.py for more detail.
505
506class Decimal(object):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000507 """Floating point class for decimal arithmetic."""
508
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000509 __slots__ = ('_exp','_int','_sign', '_is_special')
510 # Generally, the value of the Decimal instance is given by
511 # (-1)**_sign * _int * 10**_exp
512 # Special values are signified by _is_special == True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000513
Raymond Hettingerdab988d2004-10-09 07:10:44 +0000514 # We're immutable, so use __new__ not __init__
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000515 def __new__(cls, value="0", context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000516 """Create a decimal point instance.
517
518 >>> Decimal('3.14') # string input
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000519 Decimal('3.14')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000520 >>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent)
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000521 Decimal('3.14')
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000522 >>> Decimal(314) # int
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000523 Decimal('314')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000524 >>> Decimal(Decimal(314)) # another decimal instance
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000525 Decimal('314')
Christian Heimesa62da1d2008-01-12 19:39:10 +0000526 >>> Decimal(' 3.14 \\n') # leading and trailing whitespace okay
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000527 Decimal('3.14')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000528 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000529
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000530 # Note that the coefficient, self._int, is actually stored as
531 # a string rather than as a tuple of digits. This speeds up
532 # the "digits to integer" and "integer to digits" conversions
533 # that are used in almost every arithmetic operation on
534 # Decimals. This is an internal detail: the as_tuple function
535 # and the Decimal constructor still deal with tuples of
536 # digits.
537
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000538 self = object.__new__(cls)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000539
Christian Heimesd59c64c2007-11-30 19:27:20 +0000540 # From a string
541 # REs insist on real strings, so we can too.
542 if isinstance(value, str):
Christian Heimesa62da1d2008-01-12 19:39:10 +0000543 m = _parser(value.strip())
Christian Heimesd59c64c2007-11-30 19:27:20 +0000544 if m is None:
545 if context is None:
546 context = getcontext()
547 return context._raise_error(ConversionSyntax,
548 "Invalid literal for Decimal: %r" % value)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000549
Christian Heimesd59c64c2007-11-30 19:27:20 +0000550 if m.group('sign') == "-":
551 self._sign = 1
552 else:
553 self._sign = 0
554 intpart = m.group('int')
555 if intpart is not None:
556 # finite number
Mark Dickinson8d238292009-08-02 10:16:33 +0000557 fracpart = m.group('frac') or ''
Christian Heimesd59c64c2007-11-30 19:27:20 +0000558 exp = int(m.group('exp') or '0')
Mark Dickinson8d238292009-08-02 10:16:33 +0000559 self._int = str(int(intpart+fracpart))
560 self._exp = exp - len(fracpart)
Christian Heimesd59c64c2007-11-30 19:27:20 +0000561 self._is_special = False
562 else:
563 diag = m.group('diag')
564 if diag is not None:
565 # NaN
Mark Dickinson8d238292009-08-02 10:16:33 +0000566 self._int = str(int(diag or '0')).lstrip('0')
Christian Heimesd59c64c2007-11-30 19:27:20 +0000567 if m.group('signal'):
568 self._exp = 'N'
569 else:
570 self._exp = 'n'
571 else:
572 # infinity
573 self._int = '0'
574 self._exp = 'F'
575 self._is_special = True
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000576 return self
577
578 # From an integer
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000579 if isinstance(value, int):
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000580 if value >= 0:
581 self._sign = 0
582 else:
583 self._sign = 1
584 self._exp = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000585 self._int = str(abs(value))
Christian Heimesd59c64c2007-11-30 19:27:20 +0000586 self._is_special = False
587 return self
588
589 # From another decimal
590 if isinstance(value, Decimal):
591 self._exp = value._exp
592 self._sign = value._sign
593 self._int = value._int
594 self._is_special = value._is_special
595 return self
596
597 # From an internal working value
598 if isinstance(value, _WorkRep):
599 self._sign = value.sign
600 self._int = str(value.int)
601 self._exp = int(value.exp)
602 self._is_special = False
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000603 return self
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000604
605 # tuple/list conversion (possibly from as_tuple())
606 if isinstance(value, (list,tuple)):
607 if len(value) != 3:
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000608 raise ValueError('Invalid tuple size in creation of Decimal '
609 'from list or tuple. The list or tuple '
610 'should have exactly three elements.')
611 # process sign. The isinstance test rejects floats
612 if not (isinstance(value[0], int) and value[0] in (0,1)):
613 raise ValueError("Invalid sign. The first value in the tuple "
614 "should be an integer; either 0 for a "
615 "positive number or 1 for a negative number.")
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000616 self._sign = value[0]
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000617 if value[2] == 'F':
618 # infinity: value[1] is ignored
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000619 self._int = '0'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000620 self._exp = value[2]
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000621 self._is_special = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000622 else:
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000623 # process and validate the digits in value[1]
624 digits = []
625 for digit in value[1]:
626 if isinstance(digit, int) and 0 <= digit <= 9:
627 # skip leading zeros
628 if digits or digit != 0:
629 digits.append(digit)
630 else:
631 raise ValueError("The second value in the tuple must "
632 "be composed of integers in the range "
633 "0 through 9.")
634 if value[2] in ('n', 'N'):
635 # NaN: digits form the diagnostic
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000636 self._int = ''.join(map(str, digits))
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000637 self._exp = value[2]
638 self._is_special = True
639 elif isinstance(value[2], int):
640 # finite number: digits give the coefficient
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000641 self._int = ''.join(map(str, digits or [0]))
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000642 self._exp = value[2]
643 self._is_special = False
644 else:
645 raise ValueError("The third value in the tuple must "
646 "be an integer, or one of the "
647 "strings 'F', 'n', 'N'.")
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000648 return self
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000649
Raymond Hettingerbf440692004-07-10 14:14:37 +0000650 if isinstance(value, float):
Benjamin Peterson23b9ef72010-02-03 02:43:37 +0000651 raise TypeError("Cannot convert float in Decimal constructor. "
652 "Use from_float class method.")
Raymond Hettingerbf440692004-07-10 14:14:37 +0000653
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000654 raise TypeError("Cannot convert %r to Decimal" % value)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000655
Mark Dickinsonba298e42009-01-04 21:17:43 +0000656 # @classmethod, but @decorator is not valid Python 2.3 syntax, so
657 # don't use it (see notes on Py2.3 compatibility at top of file)
Raymond Hettinger771ed762009-01-03 19:20:32 +0000658 def from_float(cls, f):
659 """Converts a float to a decimal number, exactly.
660
661 Note that Decimal.from_float(0.1) is not the same as Decimal('0.1').
662 Since 0.1 is not exactly representable in binary floating point, the
663 value is stored as the nearest representable value which is
664 0x1.999999999999ap-4. The exact equivalent of the value in decimal
665 is 0.1000000000000000055511151231257827021181583404541015625.
666
667 >>> Decimal.from_float(0.1)
668 Decimal('0.1000000000000000055511151231257827021181583404541015625')
669 >>> Decimal.from_float(float('nan'))
670 Decimal('NaN')
671 >>> Decimal.from_float(float('inf'))
672 Decimal('Infinity')
673 >>> Decimal.from_float(-float('inf'))
674 Decimal('-Infinity')
675 >>> Decimal.from_float(-0.0)
676 Decimal('-0')
677
678 """
679 if isinstance(f, int): # handle integer inputs
680 return cls(f)
681 if _math.isinf(f) or _math.isnan(f): # raises TypeError if not a float
682 return cls(repr(f))
Mark Dickinsonba298e42009-01-04 21:17:43 +0000683 if _math.copysign(1.0, f) == 1.0:
684 sign = 0
685 else:
686 sign = 1
Raymond Hettinger771ed762009-01-03 19:20:32 +0000687 n, d = abs(f).as_integer_ratio()
688 k = d.bit_length() - 1
689 result = _dec_from_triple(sign, str(n*5**k), -k)
Mark Dickinsonba298e42009-01-04 21:17:43 +0000690 if cls is Decimal:
691 return result
692 else:
693 return cls(result)
694 from_float = classmethod(from_float)
Raymond Hettinger771ed762009-01-03 19:20:32 +0000695
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000696 def _isnan(self):
697 """Returns whether the number is not actually one.
698
699 0 if a number
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000700 1 if NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000701 2 if sNaN
702 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000703 if self._is_special:
704 exp = self._exp
705 if exp == 'n':
706 return 1
707 elif exp == 'N':
708 return 2
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000709 return 0
710
711 def _isinfinity(self):
712 """Returns whether the number is infinite
713
714 0 if finite or not a number
715 1 if +INF
716 -1 if -INF
717 """
718 if self._exp == 'F':
719 if self._sign:
720 return -1
721 return 1
722 return 0
723
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000724 def _check_nans(self, other=None, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000725 """Returns whether the number is not actually one.
726
727 if self, other are sNaN, signal
728 if self, other are NaN return nan
729 return 0
730
731 Done before operations.
732 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000733
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000734 self_is_nan = self._isnan()
735 if other is None:
736 other_is_nan = False
737 else:
738 other_is_nan = other._isnan()
739
740 if self_is_nan or other_is_nan:
741 if context is None:
742 context = getcontext()
743
744 if self_is_nan == 2:
745 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000746 self)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000747 if other_is_nan == 2:
748 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000749 other)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000750 if self_is_nan:
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000751 return self._fix_nan(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000752
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000753 return other._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000754 return 0
755
Christian Heimes77c02eb2008-02-09 02:18:51 +0000756 def _compare_check_nans(self, other, context):
757 """Version of _check_nans used for the signaling comparisons
758 compare_signal, __le__, __lt__, __ge__, __gt__.
759
760 Signal InvalidOperation if either self or other is a (quiet
761 or signaling) NaN. Signaling NaNs take precedence over quiet
762 NaNs.
763
764 Return 0 if neither operand is a NaN.
765
766 """
767 if context is None:
768 context = getcontext()
769
770 if self._is_special or other._is_special:
771 if self.is_snan():
772 return context._raise_error(InvalidOperation,
773 'comparison involving sNaN',
774 self)
775 elif other.is_snan():
776 return context._raise_error(InvalidOperation,
777 'comparison involving sNaN',
778 other)
779 elif self.is_qnan():
780 return context._raise_error(InvalidOperation,
781 'comparison involving NaN',
782 self)
783 elif other.is_qnan():
784 return context._raise_error(InvalidOperation,
785 'comparison involving NaN',
786 other)
787 return 0
788
Jack Diederich4dafcc42006-11-28 19:15:13 +0000789 def __bool__(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000790 """Return True if self is nonzero; otherwise return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000791
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000792 NaNs and infinities are considered nonzero.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000793 """
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000794 return self._is_special or self._int != '0'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000795
Christian Heimes77c02eb2008-02-09 02:18:51 +0000796 def _cmp(self, other):
797 """Compare the two non-NaN decimal instances self and other.
798
799 Returns -1 if self < other, 0 if self == other and 1
800 if self > other. This routine is for internal use only."""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000801
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000802 if self._is_special or other._is_special:
Mark Dickinsone6aad752009-01-25 10:48:51 +0000803 self_inf = self._isinfinity()
804 other_inf = other._isinfinity()
805 if self_inf == other_inf:
806 return 0
807 elif self_inf < other_inf:
808 return -1
809 else:
810 return 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000811
Mark Dickinsone6aad752009-01-25 10:48:51 +0000812 # check for zeros; Decimal('0') == Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000813 if not self:
814 if not other:
815 return 0
816 else:
817 return -((-1)**other._sign)
818 if not other:
819 return (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000820
Guido van Rossumd8faa362007-04-27 19:54:29 +0000821 # If different signs, neg one is less
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000822 if other._sign < self._sign:
823 return -1
824 if self._sign < other._sign:
825 return 1
826
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000827 self_adjusted = self.adjusted()
828 other_adjusted = other.adjusted()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000829 if self_adjusted == other_adjusted:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000830 self_padded = self._int + '0'*(self._exp - other._exp)
831 other_padded = other._int + '0'*(other._exp - self._exp)
Mark Dickinsone6aad752009-01-25 10:48:51 +0000832 if self_padded == other_padded:
833 return 0
834 elif self_padded < other_padded:
835 return -(-1)**self._sign
836 else:
837 return (-1)**self._sign
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000838 elif self_adjusted > other_adjusted:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000839 return (-1)**self._sign
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000840 else: # self_adjusted < other_adjusted
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000841 return -((-1)**self._sign)
842
Christian Heimes77c02eb2008-02-09 02:18:51 +0000843 # Note: The Decimal standard doesn't cover rich comparisons for
844 # Decimals. In particular, the specification is silent on the
845 # subject of what should happen for a comparison involving a NaN.
846 # We take the following approach:
847 #
848 # == comparisons involving a NaN always return False
849 # != comparisons involving a NaN always return True
850 # <, >, <= and >= comparisons involving a (quiet or signaling)
851 # NaN signal InvalidOperation, and return False if the
Christian Heimes3feef612008-02-11 06:19:17 +0000852 # InvalidOperation is not trapped.
Christian Heimes77c02eb2008-02-09 02:18:51 +0000853 #
854 # This behavior is designed to conform as closely as possible to
855 # that specified by IEEE 754.
856
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000857 def __eq__(self, other):
Christian Heimes77c02eb2008-02-09 02:18:51 +0000858 other = _convert_other(other)
859 if other is NotImplemented:
860 return other
861 if self.is_nan() or other.is_nan():
862 return False
863 return self._cmp(other) == 0
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000864
865 def __ne__(self, other):
Christian Heimes77c02eb2008-02-09 02:18:51 +0000866 other = _convert_other(other)
867 if other is NotImplemented:
868 return other
869 if self.is_nan() or other.is_nan():
870 return True
871 return self._cmp(other) != 0
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000872
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000873
Christian Heimes77c02eb2008-02-09 02:18:51 +0000874 def __lt__(self, other, context=None):
875 other = _convert_other(other)
876 if other is NotImplemented:
877 return other
878 ans = self._compare_check_nans(other, context)
879 if ans:
880 return False
881 return self._cmp(other) < 0
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000882
Christian Heimes77c02eb2008-02-09 02:18:51 +0000883 def __le__(self, other, context=None):
884 other = _convert_other(other)
885 if other is NotImplemented:
886 return other
887 ans = self._compare_check_nans(other, context)
888 if ans:
889 return False
890 return self._cmp(other) <= 0
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000891
Christian Heimes77c02eb2008-02-09 02:18:51 +0000892 def __gt__(self, other, context=None):
893 other = _convert_other(other)
894 if other is NotImplemented:
895 return other
896 ans = self._compare_check_nans(other, context)
897 if ans:
898 return False
899 return self._cmp(other) > 0
900
901 def __ge__(self, other, context=None):
902 other = _convert_other(other)
903 if other is NotImplemented:
904 return other
905 ans = self._compare_check_nans(other, context)
906 if ans:
907 return False
908 return self._cmp(other) >= 0
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000909
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000910 def compare(self, other, context=None):
911 """Compares one to another.
912
913 -1 => a < b
914 0 => a = b
915 1 => a > b
916 NaN => one is NaN
917 Like __cmp__, but returns Decimal instances.
918 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000919 other = _convert_other(other, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000920
Guido van Rossumd8faa362007-04-27 19:54:29 +0000921 # Compare(NaN, NaN) = NaN
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000922 if (self._is_special or other and other._is_special):
923 ans = self._check_nans(other, context)
924 if ans:
925 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000926
Christian Heimes77c02eb2008-02-09 02:18:51 +0000927 return Decimal(self._cmp(other))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000928
929 def __hash__(self):
930 """x.__hash__() <==> hash(x)"""
931 # Decimal integers must hash the same as the ints
Christian Heimes2380ac72008-01-09 00:17:24 +0000932 #
933 # The hash of a nonspecial noninteger Decimal must depend only
934 # on the value of that Decimal, and not on its representation.
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000935 # For example: hash(Decimal('100E-1')) == hash(Decimal('10')).
Raymond Hettingerbea3f6f2005-03-15 04:59:17 +0000936 if self._is_special:
937 if self._isnan():
938 raise TypeError('Cannot hash a NaN value.')
939 return hash(str(self))
Thomas Wouters8ce81f72007-09-20 18:22:40 +0000940 if not self:
941 return 0
942 if self._isinteger():
943 op = _WorkRep(self.to_integral_value())
944 # to make computation feasible for Decimals with large
945 # exponent, we use the fact that hash(n) == hash(m) for
946 # any two nonzero integers n and m such that (i) n and m
947 # have the same sign, and (ii) n is congruent to m modulo
948 # 2**64-1. So we can replace hash((-1)**s*c*10**e) with
949 # hash((-1)**s*c*pow(10, e, 2**64-1).
950 return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1))
Christian Heimes2380ac72008-01-09 00:17:24 +0000951 # The value of a nonzero nonspecial Decimal instance is
952 # faithfully represented by the triple consisting of its sign,
953 # its adjusted exponent, and its coefficient with trailing
954 # zeros removed.
955 return hash((self._sign,
956 self._exp+len(self._int),
957 self._int.rstrip('0')))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000958
959 def as_tuple(self):
960 """Represents the number as a triple tuple.
961
962 To show the internals exactly as they are.
963 """
Christian Heimes25bb7832008-01-11 16:17:00 +0000964 return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000965
966 def __repr__(self):
967 """Represents the number as an instance of Decimal."""
968 # Invariant: eval(repr(d)) == d
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000969 return "Decimal('%s')" % str(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000970
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000971 def __str__(self, eng=False, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000972 """Return string representation of the number in scientific notation.
973
974 Captures all of the information in the underlying representation.
975 """
976
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000977 sign = ['', '-'][self._sign]
Raymond Hettingere5a0a962005-06-20 09:49:42 +0000978 if self._is_special:
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000979 if self._exp == 'F':
980 return sign + 'Infinity'
981 elif self._exp == 'n':
982 return sign + 'NaN' + self._int
983 else: # self._exp == 'N'
984 return sign + 'sNaN' + self._int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000985
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000986 # number of digits of self._int to left of decimal point
987 leftdigits = self._exp + len(self._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000988
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000989 # dotplace is number of digits of self._int to the left of the
990 # decimal point in the mantissa of the output string (that is,
991 # after adjusting the exponent)
992 if self._exp <= 0 and leftdigits > -6:
993 # no exponent required
994 dotplace = leftdigits
995 elif not eng:
996 # usual scientific notation: 1 digit on left of the point
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000997 dotplace = 1
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000998 elif self._int == '0':
999 # engineering notation, zero
1000 dotplace = (leftdigits + 1) % 3 - 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001001 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001002 # engineering notation, nonzero
1003 dotplace = (leftdigits - 1) % 3 + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001004
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001005 if dotplace <= 0:
1006 intpart = '0'
1007 fracpart = '.' + '0'*(-dotplace) + self._int
1008 elif dotplace >= len(self._int):
1009 intpart = self._int+'0'*(dotplace-len(self._int))
1010 fracpart = ''
1011 else:
1012 intpart = self._int[:dotplace]
1013 fracpart = '.' + self._int[dotplace:]
1014 if leftdigits == dotplace:
1015 exp = ''
1016 else:
1017 if context is None:
1018 context = getcontext()
1019 exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
1020
1021 return sign + intpart + fracpart + exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001022
1023 def to_eng_string(self, context=None):
1024 """Convert to engineering-type string.
1025
1026 Engineering notation has an exponent which is a multiple of 3, so there
1027 are up to 3 digits left of the decimal place.
1028
1029 Same rules for when in exponential and when as a value as in __str__.
1030 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001031 return self.__str__(eng=True, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001032
1033 def __neg__(self, context=None):
1034 """Returns a copy with the sign switched.
1035
1036 Rounds, if it has reason.
1037 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001038 if self._is_special:
1039 ans = self._check_nans(context=context)
1040 if ans:
1041 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001042
Mark Dickinson37a79fb2011-03-12 11:12:52 +00001043 if context is None:
1044 context = getcontext()
1045
1046 if not self and context.rounding != ROUND_FLOOR:
1047 # -Decimal('0') is Decimal('0'), not Decimal('-0'), except
1048 # in ROUND_FLOOR rounding mode.
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001049 ans = self.copy_abs()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001050 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001051 ans = self.copy_negate()
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001052
Christian Heimes2c181612007-12-17 20:04:13 +00001053 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001054
1055 def __pos__(self, context=None):
1056 """Returns a copy, unless it is a sNaN.
1057
1058 Rounds the number (if more then precision digits)
1059 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001060 if self._is_special:
1061 ans = self._check_nans(context=context)
1062 if ans:
1063 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001064
Mark Dickinson37a79fb2011-03-12 11:12:52 +00001065 if context is None:
1066 context = getcontext()
1067
1068 if not self and context.rounding != ROUND_FLOOR:
1069 # + (-0) = 0, except in ROUND_FLOOR rounding mode.
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001070 ans = self.copy_abs()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001071 else:
1072 ans = Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001073
Christian Heimes2c181612007-12-17 20:04:13 +00001074 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001075
Christian Heimes2c181612007-12-17 20:04:13 +00001076 def __abs__(self, round=True, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001077 """Returns the absolute value of self.
1078
Christian Heimes2c181612007-12-17 20:04:13 +00001079 If the keyword argument 'round' is false, do not round. The
1080 expression self.__abs__(round=False) is equivalent to
1081 self.copy_abs().
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001082 """
Christian Heimes2c181612007-12-17 20:04:13 +00001083 if not round:
1084 return self.copy_abs()
1085
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001086 if self._is_special:
1087 ans = self._check_nans(context=context)
1088 if ans:
1089 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001090
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001091 if self._sign:
1092 ans = self.__neg__(context=context)
1093 else:
1094 ans = self.__pos__(context=context)
1095
1096 return ans
1097
1098 def __add__(self, other, context=None):
1099 """Returns self + other.
1100
1101 -INF + INF (or the reverse) cause InvalidOperation errors.
1102 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001103 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001104 if other is NotImplemented:
1105 return other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001106
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001107 if context is None:
1108 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001109
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001110 if self._is_special or other._is_special:
1111 ans = self._check_nans(other, context)
1112 if ans:
1113 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001114
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001115 if self._isinfinity():
Guido van Rossumd8faa362007-04-27 19:54:29 +00001116 # If both INF, same sign => same as both, opposite => error.
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001117 if self._sign != other._sign and other._isinfinity():
1118 return context._raise_error(InvalidOperation, '-INF + INF')
1119 return Decimal(self)
1120 if other._isinfinity():
Guido van Rossumd8faa362007-04-27 19:54:29 +00001121 return Decimal(other) # Can't both be infinity here
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001122
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001123 exp = min(self._exp, other._exp)
1124 negativezero = 0
1125 if context.rounding == ROUND_FLOOR and self._sign != other._sign:
Guido van Rossumd8faa362007-04-27 19:54:29 +00001126 # If the answer is 0, the sign should be negative, in this case.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001127 negativezero = 1
1128
1129 if not self and not other:
1130 sign = min(self._sign, other._sign)
1131 if negativezero:
1132 sign = 1
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001133 ans = _dec_from_triple(sign, '0', exp)
Christian Heimes2c181612007-12-17 20:04:13 +00001134 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001135 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001136 if not self:
Facundo Batista99b55482004-10-26 23:38:46 +00001137 exp = max(exp, other._exp - context.prec-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001138 ans = other._rescale(exp, context.rounding)
Christian Heimes2c181612007-12-17 20:04:13 +00001139 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001140 return ans
1141 if not other:
Facundo Batista99b55482004-10-26 23:38:46 +00001142 exp = max(exp, self._exp - context.prec-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001143 ans = self._rescale(exp, context.rounding)
Christian Heimes2c181612007-12-17 20:04:13 +00001144 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001145 return ans
1146
1147 op1 = _WorkRep(self)
1148 op2 = _WorkRep(other)
Christian Heimes2c181612007-12-17 20:04:13 +00001149 op1, op2 = _normalize(op1, op2, context.prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001150
1151 result = _WorkRep()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001152 if op1.sign != op2.sign:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001153 # Equal and opposite
Raymond Hettinger17931de2004-10-27 06:21:46 +00001154 if op1.int == op2.int:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001155 ans = _dec_from_triple(negativezero, '0', exp)
Christian Heimes2c181612007-12-17 20:04:13 +00001156 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001157 return ans
Raymond Hettinger17931de2004-10-27 06:21:46 +00001158 if op1.int < op2.int:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001159 op1, op2 = op2, op1
Guido van Rossumd8faa362007-04-27 19:54:29 +00001160 # OK, now abs(op1) > abs(op2)
Raymond Hettinger17931de2004-10-27 06:21:46 +00001161 if op1.sign == 1:
1162 result.sign = 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001163 op1.sign, op2.sign = op2.sign, op1.sign
1164 else:
Raymond Hettinger17931de2004-10-27 06:21:46 +00001165 result.sign = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +00001166 # So we know the sign, and op1 > 0.
Raymond Hettinger17931de2004-10-27 06:21:46 +00001167 elif op1.sign == 1:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001168 result.sign = 1
Raymond Hettinger17931de2004-10-27 06:21:46 +00001169 op1.sign, op2.sign = (0, 0)
1170 else:
1171 result.sign = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +00001172 # Now, op1 > abs(op2) > 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001173
Raymond Hettinger17931de2004-10-27 06:21:46 +00001174 if op2.sign == 0:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001175 result.int = op1.int + op2.int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001176 else:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001177 result.int = op1.int - op2.int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001178
1179 result.exp = op1.exp
1180 ans = Decimal(result)
Christian Heimes2c181612007-12-17 20:04:13 +00001181 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001182 return ans
1183
1184 __radd__ = __add__
1185
1186 def __sub__(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001187 """Return self - other"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001188 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001189 if other is NotImplemented:
1190 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001191
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001192 if self._is_special or other._is_special:
1193 ans = self._check_nans(other, context=context)
1194 if ans:
1195 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001196
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001197 # self - other is computed as self + other.copy_negate()
1198 return self.__add__(other.copy_negate(), context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001199
1200 def __rsub__(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001201 """Return other - self"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001202 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001203 if other is NotImplemented:
1204 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001205
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001206 return other.__sub__(self, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001207
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001208 def __mul__(self, other, context=None):
1209 """Return self * other.
1210
1211 (+-) INF * 0 (or its reverse) raise InvalidOperation.
1212 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001213 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001214 if other is NotImplemented:
1215 return other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001216
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001217 if context is None:
1218 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001219
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +00001220 resultsign = self._sign ^ other._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001221
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001222 if self._is_special or other._is_special:
1223 ans = self._check_nans(other, context)
1224 if ans:
1225 return ans
1226
1227 if self._isinfinity():
1228 if not other:
1229 return context._raise_error(InvalidOperation, '(+-)INF * 0')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001230 return _SignedInfinity[resultsign]
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001231
1232 if other._isinfinity():
1233 if not self:
1234 return context._raise_error(InvalidOperation, '0 * (+-)INF')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001235 return _SignedInfinity[resultsign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001236
1237 resultexp = self._exp + other._exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001238
1239 # Special case for multiplying by zero
1240 if not self or not other:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001241 ans = _dec_from_triple(resultsign, '0', resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001242 # Fixing in case the exponent is out of bounds
1243 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001244 return ans
1245
1246 # Special case for multiplying by power of 10
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001247 if self._int == '1':
1248 ans = _dec_from_triple(resultsign, other._int, resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001249 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001250 return ans
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001251 if other._int == '1':
1252 ans = _dec_from_triple(resultsign, self._int, resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001253 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001254 return ans
1255
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001256 op1 = _WorkRep(self)
1257 op2 = _WorkRep(other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001258
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001259 ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001260 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001261
1262 return ans
1263 __rmul__ = __mul__
1264
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001265 def __truediv__(self, other, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001266 """Return self / other."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001267 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001268 if other is NotImplemented:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001269 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001270
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001271 if context is None:
1272 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001273
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +00001274 sign = self._sign ^ other._sign
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001275
1276 if self._is_special or other._is_special:
1277 ans = self._check_nans(other, context)
1278 if ans:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001279 return ans
1280
1281 if self._isinfinity() and other._isinfinity():
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001282 return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001283
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001284 if self._isinfinity():
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001285 return _SignedInfinity[sign]
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001286
1287 if other._isinfinity():
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001288 context._raise_error(Clamped, 'Division by infinity')
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001289 return _dec_from_triple(sign, '0', context.Etiny())
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001290
1291 # Special cases for zeroes
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001292 if not other:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001293 if not self:
1294 return context._raise_error(DivisionUndefined, '0 / 0')
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001295 return context._raise_error(DivisionByZero, 'x / 0', sign)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001296
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001297 if not self:
1298 exp = self._exp - other._exp
1299 coeff = 0
1300 else:
1301 # OK, so neither = 0, INF or NaN
1302 shift = len(other._int) - len(self._int) + context.prec + 1
1303 exp = self._exp - other._exp - shift
1304 op1 = _WorkRep(self)
1305 op2 = _WorkRep(other)
1306 if shift >= 0:
1307 coeff, remainder = divmod(op1.int * 10**shift, op2.int)
1308 else:
1309 coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
1310 if remainder:
1311 # result is not exact; adjust to ensure correct rounding
1312 if coeff % 5 == 0:
1313 coeff += 1
1314 else:
1315 # result is exact; get as close to ideal exponent as possible
1316 ideal_exp = self._exp - other._exp
1317 while exp < ideal_exp and coeff % 10 == 0:
1318 coeff //= 10
1319 exp += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001320
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001321 ans = _dec_from_triple(sign, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001322 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001323
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001324 def _divide(self, other, context):
1325 """Return (self // other, self % other), to context.prec precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001326
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001327 Assumes that neither self nor other is a NaN, that self is not
1328 infinite and that other is nonzero.
1329 """
1330 sign = self._sign ^ other._sign
1331 if other._isinfinity():
1332 ideal_exp = self._exp
1333 else:
1334 ideal_exp = min(self._exp, other._exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001335
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001336 expdiff = self.adjusted() - other.adjusted()
1337 if not self or other._isinfinity() or expdiff <= -2:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001338 return (_dec_from_triple(sign, '0', 0),
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001339 self._rescale(ideal_exp, context.rounding))
1340 if expdiff <= context.prec:
1341 op1 = _WorkRep(self)
1342 op2 = _WorkRep(other)
1343 if op1.exp >= op2.exp:
1344 op1.int *= 10**(op1.exp - op2.exp)
1345 else:
1346 op2.int *= 10**(op2.exp - op1.exp)
1347 q, r = divmod(op1.int, op2.int)
1348 if q < 10**context.prec:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001349 return (_dec_from_triple(sign, str(q), 0),
1350 _dec_from_triple(self._sign, str(r), ideal_exp))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001351
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001352 # Here the quotient is too large to be representable
1353 ans = context._raise_error(DivisionImpossible,
1354 'quotient too large in //, % or divmod')
1355 return ans, ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001356
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001357 def __rtruediv__(self, other, context=None):
1358 """Swaps self/other and returns __truediv__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001359 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001360 if other is NotImplemented:
1361 return other
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001362 return other.__truediv__(self, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001363
1364 def __divmod__(self, other, context=None):
1365 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001366 Return (self // other, self % other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001367 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001368 other = _convert_other(other)
1369 if other is NotImplemented:
1370 return other
1371
1372 if context is None:
1373 context = getcontext()
1374
1375 ans = self._check_nans(other, context)
1376 if ans:
1377 return (ans, ans)
1378
1379 sign = self._sign ^ other._sign
1380 if self._isinfinity():
1381 if other._isinfinity():
1382 ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
1383 return ans, ans
1384 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001385 return (_SignedInfinity[sign],
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001386 context._raise_error(InvalidOperation, 'INF % x'))
1387
1388 if not other:
1389 if not self:
1390 ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
1391 return ans, ans
1392 else:
1393 return (context._raise_error(DivisionByZero, 'x // 0', sign),
1394 context._raise_error(InvalidOperation, 'x % 0'))
1395
1396 quotient, remainder = self._divide(other, context)
Christian Heimes2c181612007-12-17 20:04:13 +00001397 remainder = remainder._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001398 return quotient, remainder
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001399
1400 def __rdivmod__(self, other, context=None):
1401 """Swaps self/other and returns __divmod__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001402 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001403 if other is NotImplemented:
1404 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001405 return other.__divmod__(self, context=context)
1406
1407 def __mod__(self, other, context=None):
1408 """
1409 self % other
1410 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001411 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001412 if other is NotImplemented:
1413 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001414
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001415 if context is None:
1416 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001417
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001418 ans = self._check_nans(other, context)
1419 if ans:
1420 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001421
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001422 if self._isinfinity():
1423 return context._raise_error(InvalidOperation, 'INF % x')
1424 elif not other:
1425 if self:
1426 return context._raise_error(InvalidOperation, 'x % 0')
1427 else:
1428 return context._raise_error(DivisionUndefined, '0 % 0')
1429
1430 remainder = self._divide(other, context)[1]
Christian Heimes2c181612007-12-17 20:04:13 +00001431 remainder = remainder._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001432 return remainder
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001433
1434 def __rmod__(self, other, context=None):
1435 """Swaps self/other and returns __mod__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001436 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001437 if other is NotImplemented:
1438 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001439 return other.__mod__(self, context=context)
1440
1441 def remainder_near(self, other, context=None):
1442 """
1443 Remainder nearest to 0- abs(remainder-near) <= other/2
1444 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001445 if context is None:
1446 context = getcontext()
1447
1448 other = _convert_other(other, raiseit=True)
1449
1450 ans = self._check_nans(other, context)
1451 if ans:
1452 return ans
1453
1454 # self == +/-infinity -> InvalidOperation
1455 if self._isinfinity():
1456 return context._raise_error(InvalidOperation,
1457 'remainder_near(infinity, x)')
1458
1459 # other == 0 -> either InvalidOperation or DivisionUndefined
1460 if not other:
1461 if self:
1462 return context._raise_error(InvalidOperation,
1463 'remainder_near(x, 0)')
1464 else:
1465 return context._raise_error(DivisionUndefined,
1466 'remainder_near(0, 0)')
1467
1468 # other = +/-infinity -> remainder = self
1469 if other._isinfinity():
1470 ans = Decimal(self)
1471 return ans._fix(context)
1472
1473 # self = 0 -> remainder = self, with ideal exponent
1474 ideal_exponent = min(self._exp, other._exp)
1475 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001476 ans = _dec_from_triple(self._sign, '0', ideal_exponent)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001477 return ans._fix(context)
1478
1479 # catch most cases of large or small quotient
1480 expdiff = self.adjusted() - other.adjusted()
1481 if expdiff >= context.prec + 1:
1482 # expdiff >= prec+1 => abs(self/other) > 10**prec
1483 return context._raise_error(DivisionImpossible)
1484 if expdiff <= -2:
1485 # expdiff <= -2 => abs(self/other) < 0.1
1486 ans = self._rescale(ideal_exponent, context.rounding)
1487 return ans._fix(context)
1488
1489 # adjust both arguments to have the same exponent, then divide
1490 op1 = _WorkRep(self)
1491 op2 = _WorkRep(other)
1492 if op1.exp >= op2.exp:
1493 op1.int *= 10**(op1.exp - op2.exp)
1494 else:
1495 op2.int *= 10**(op2.exp - op1.exp)
1496 q, r = divmod(op1.int, op2.int)
1497 # remainder is r*10**ideal_exponent; other is +/-op2.int *
1498 # 10**ideal_exponent. Apply correction to ensure that
1499 # abs(remainder) <= abs(other)/2
1500 if 2*r + (q&1) > op2.int:
1501 r -= op2.int
1502 q += 1
1503
1504 if q >= 10**context.prec:
1505 return context._raise_error(DivisionImpossible)
1506
1507 # result has same sign as self unless r is negative
1508 sign = self._sign
1509 if r < 0:
1510 sign = 1-sign
1511 r = -r
1512
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001513 ans = _dec_from_triple(sign, str(r), ideal_exponent)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001514 return ans._fix(context)
1515
1516 def __floordiv__(self, other, context=None):
1517 """self // other"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001518 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001519 if other is NotImplemented:
1520 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001521
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001522 if context is None:
1523 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001524
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001525 ans = self._check_nans(other, context)
1526 if ans:
1527 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001528
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001529 if self._isinfinity():
1530 if other._isinfinity():
1531 return context._raise_error(InvalidOperation, 'INF // INF')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001532 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001533 return _SignedInfinity[self._sign ^ other._sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001534
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001535 if not other:
1536 if self:
1537 return context._raise_error(DivisionByZero, 'x // 0',
1538 self._sign ^ other._sign)
1539 else:
1540 return context._raise_error(DivisionUndefined, '0 // 0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001541
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001542 return self._divide(other, context)[0]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001543
1544 def __rfloordiv__(self, other, context=None):
1545 """Swaps self/other and returns __floordiv__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001546 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001547 if other is NotImplemented:
1548 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001549 return other.__floordiv__(self, context=context)
1550
1551 def __float__(self):
1552 """Float representation."""
1553 return float(str(self))
1554
1555 def __int__(self):
Brett Cannon46b08022005-03-01 03:12:26 +00001556 """Converts self to an int, truncating if necessary."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001557 if self._is_special:
1558 if self._isnan():
Mark Dickinson8fde3da2009-09-08 19:23:44 +00001559 raise ValueError("Cannot convert NaN to integer")
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001560 elif self._isinfinity():
Mark Dickinson8fde3da2009-09-08 19:23:44 +00001561 raise OverflowError("Cannot convert infinity to integer")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001562 s = (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001563 if self._exp >= 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001564 return s*int(self._int)*10**self._exp
Raymond Hettinger605ed022004-11-24 07:28:48 +00001565 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001566 return s*int(self._int[:self._exp] or '0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001567
Christian Heimes969fe572008-01-25 11:23:10 +00001568 __trunc__ = __int__
1569
Christian Heimes0bd4e112008-02-12 22:59:25 +00001570 def real(self):
1571 return self
Mark Dickinson315a20a2009-01-04 21:34:18 +00001572 real = property(real)
Christian Heimes0bd4e112008-02-12 22:59:25 +00001573
Christian Heimes0bd4e112008-02-12 22:59:25 +00001574 def imag(self):
1575 return Decimal(0)
Mark Dickinson315a20a2009-01-04 21:34:18 +00001576 imag = property(imag)
Christian Heimes0bd4e112008-02-12 22:59:25 +00001577
1578 def conjugate(self):
1579 return self
1580
1581 def __complex__(self):
1582 return complex(float(self))
1583
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001584 def _fix_nan(self, context):
1585 """Decapitate the payload of a NaN to fit the context"""
1586 payload = self._int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001587
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001588 # maximum length of payload is precision if _clamp=0,
1589 # precision-1 if _clamp=1.
1590 max_payload_len = context.prec - context._clamp
1591 if len(payload) > max_payload_len:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001592 payload = payload[len(payload)-max_payload_len:].lstrip('0')
1593 return _dec_from_triple(self._sign, payload, self._exp, True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001594 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001595
Raymond Hettingerdab988d2004-10-09 07:10:44 +00001596 def _fix(self, context):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001597 """Round if it is necessary to keep self within prec precision.
1598
1599 Rounds and fixes the exponent. Does not raise on a sNaN.
1600
1601 Arguments:
1602 self - Decimal instance
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001603 context - context used.
1604 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001605
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001606 if self._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001607 if self._isnan():
1608 # decapitate payload if necessary
1609 return self._fix_nan(context)
1610 else:
1611 # self is +/-Infinity; return unaltered
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001612 return Decimal(self)
1613
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001614 # if self is zero then exponent should be between Etiny and
1615 # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.
1616 Etiny = context.Etiny()
1617 Etop = context.Etop()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001618 if not self:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001619 exp_max = [context.Emax, Etop][context._clamp]
1620 new_exp = min(max(self._exp, Etiny), exp_max)
1621 if new_exp != self._exp:
1622 context._raise_error(Clamped)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001623 return _dec_from_triple(self._sign, '0', new_exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001624 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001625 return Decimal(self)
1626
1627 # exp_min is the smallest allowable exponent of the result,
1628 # equal to max(self.adjusted()-context.prec+1, Etiny)
1629 exp_min = len(self._int) + self._exp - context.prec
1630 if exp_min > Etop:
1631 # overflow: exp_min > Etop iff self.adjusted() > Emax
Mark Dickinsonece06972010-05-04 14:37:14 +00001632 ans = context._raise_error(Overflow, 'above Emax', self._sign)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001633 context._raise_error(Inexact)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001634 context._raise_error(Rounded)
Mark Dickinsonece06972010-05-04 14:37:14 +00001635 return ans
1636
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001637 self_is_subnormal = exp_min < Etiny
1638 if self_is_subnormal:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001639 exp_min = Etiny
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001640
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001641 # round if self has too many digits
1642 if self._exp < exp_min:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001643 digits = len(self._int) + self._exp - exp_min
1644 if digits < 0:
1645 self = _dec_from_triple(self._sign, '1', exp_min-1)
1646 digits = 0
Mark Dickinsonece06972010-05-04 14:37:14 +00001647 rounding_method = self._pick_rounding_function[context.rounding]
1648 changed = getattr(self, rounding_method)(digits)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001649 coeff = self._int[:digits] or '0'
Mark Dickinsonece06972010-05-04 14:37:14 +00001650 if changed > 0:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001651 coeff = str(int(coeff)+1)
Mark Dickinsonece06972010-05-04 14:37:14 +00001652 if len(coeff) > context.prec:
1653 coeff = coeff[:-1]
1654 exp_min += 1
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001655
Mark Dickinsonece06972010-05-04 14:37:14 +00001656 # check whether the rounding pushed the exponent out of range
1657 if exp_min > Etop:
1658 ans = context._raise_error(Overflow, 'above Emax', self._sign)
1659 else:
1660 ans = _dec_from_triple(self._sign, coeff, exp_min)
1661
1662 # raise the appropriate signals, taking care to respect
1663 # the precedence described in the specification
1664 if changed and self_is_subnormal:
1665 context._raise_error(Underflow)
1666 if self_is_subnormal:
1667 context._raise_error(Subnormal)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001668 if changed:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001669 context._raise_error(Inexact)
Mark Dickinsonece06972010-05-04 14:37:14 +00001670 context._raise_error(Rounded)
1671 if not ans:
1672 # raise Clamped on underflow to 0
1673 context._raise_error(Clamped)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001674 return ans
1675
Mark Dickinsonece06972010-05-04 14:37:14 +00001676 if self_is_subnormal:
1677 context._raise_error(Subnormal)
1678
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001679 # fold down if _clamp == 1 and self has too few digits
1680 if context._clamp == 1 and self._exp > Etop:
1681 context._raise_error(Clamped)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001682 self_padded = self._int + '0'*(self._exp - Etop)
1683 return _dec_from_triple(self._sign, self_padded, Etop)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001684
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001685 # here self was representable to begin with; return unchanged
1686 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001687
1688 _pick_rounding_function = {}
1689
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001690 # for each of the rounding functions below:
1691 # self is a finite, nonzero Decimal
1692 # prec is an integer satisfying 0 <= prec < len(self._int)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001693 #
1694 # each function returns either -1, 0, or 1, as follows:
1695 # 1 indicates that self should be rounded up (away from zero)
1696 # 0 indicates that self should be truncated, and that all the
1697 # digits to be truncated are zeros (so the value is unchanged)
1698 # -1 indicates that there are nonzero digits to be truncated
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001699
1700 def _round_down(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001701 """Also known as round-towards-0, truncate."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001702 if _all_zeros(self._int, prec):
1703 return 0
1704 else:
1705 return -1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001706
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001707 def _round_up(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001708 """Rounds away from 0."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001709 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001710
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001711 def _round_half_up(self, prec):
1712 """Rounds 5 up (away from 0)"""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001713 if self._int[prec] in '56789':
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001714 return 1
1715 elif _all_zeros(self._int, prec):
1716 return 0
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001717 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001718 return -1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001719
1720 def _round_half_down(self, prec):
1721 """Round 5 down"""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001722 if _exact_half(self._int, prec):
1723 return -1
1724 else:
1725 return self._round_half_up(prec)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001726
1727 def _round_half_even(self, prec):
1728 """Round 5 to even, rest to nearest."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001729 if _exact_half(self._int, prec) and \
1730 (prec == 0 or self._int[prec-1] in '02468'):
1731 return -1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001732 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001733 return self._round_half_up(prec)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001734
1735 def _round_ceiling(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001736 """Rounds up (not away from 0 if negative.)"""
1737 if self._sign:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001738 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001739 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001740 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001741
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001742 def _round_floor(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001743 """Rounds down (not towards 0 if negative)"""
1744 if not self._sign:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001745 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001746 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001747 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001748
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001749 def _round_05up(self, prec):
1750 """Round down unless digit prec-1 is 0 or 5."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001751 if prec and self._int[prec-1] not in '05':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001752 return self._round_down(prec)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001753 else:
1754 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001755
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001756 def __round__(self, n=None):
1757 """Round self to the nearest integer, or to a given precision.
1758
1759 If only one argument is supplied, round a finite Decimal
1760 instance self to the nearest integer. If self is infinite or
1761 a NaN then a Python exception is raised. If self is finite
1762 and lies exactly halfway between two integers then it is
1763 rounded to the integer with even last digit.
1764
1765 >>> round(Decimal('123.456'))
1766 123
1767 >>> round(Decimal('-456.789'))
1768 -457
1769 >>> round(Decimal('-3.0'))
1770 -3
1771 >>> round(Decimal('2.5'))
1772 2
1773 >>> round(Decimal('3.5'))
1774 4
1775 >>> round(Decimal('Inf'))
1776 Traceback (most recent call last):
1777 ...
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001778 OverflowError: cannot round an infinity
1779 >>> round(Decimal('NaN'))
1780 Traceback (most recent call last):
1781 ...
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001782 ValueError: cannot round a NaN
1783
1784 If a second argument n is supplied, self is rounded to n
1785 decimal places using the rounding mode for the current
1786 context.
1787
1788 For an integer n, round(self, -n) is exactly equivalent to
1789 self.quantize(Decimal('1En')).
1790
1791 >>> round(Decimal('123.456'), 0)
1792 Decimal('123')
1793 >>> round(Decimal('123.456'), 2)
1794 Decimal('123.46')
1795 >>> round(Decimal('123.456'), -2)
1796 Decimal('1E+2')
1797 >>> round(Decimal('-Infinity'), 37)
1798 Decimal('NaN')
1799 >>> round(Decimal('sNaN123'), 0)
1800 Decimal('NaN123')
1801
1802 """
1803 if n is not None:
1804 # two-argument form: use the equivalent quantize call
1805 if not isinstance(n, int):
1806 raise TypeError('Second argument to round should be integral')
1807 exp = _dec_from_triple(0, '1', -n)
1808 return self.quantize(exp)
1809
1810 # one-argument form
1811 if self._is_special:
1812 if self.is_nan():
1813 raise ValueError("cannot round a NaN")
1814 else:
1815 raise OverflowError("cannot round an infinity")
1816 return int(self._rescale(0, ROUND_HALF_EVEN))
1817
1818 def __floor__(self):
1819 """Return the floor of self, as an integer.
1820
1821 For a finite Decimal instance self, return the greatest
1822 integer n such that n <= self. If self is infinite or a NaN
1823 then a Python exception is raised.
1824
1825 """
1826 if self._is_special:
1827 if self.is_nan():
1828 raise ValueError("cannot round a NaN")
1829 else:
1830 raise OverflowError("cannot round an infinity")
1831 return int(self._rescale(0, ROUND_FLOOR))
1832
1833 def __ceil__(self):
1834 """Return the ceiling of self, as an integer.
1835
1836 For a finite Decimal instance self, return the least integer n
1837 such that n >= self. If self is infinite or a NaN then a
1838 Python exception is raised.
1839
1840 """
1841 if self._is_special:
1842 if self.is_nan():
1843 raise ValueError("cannot round a NaN")
1844 else:
1845 raise OverflowError("cannot round an infinity")
1846 return int(self._rescale(0, ROUND_CEILING))
1847
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001848 def fma(self, other, third, context=None):
1849 """Fused multiply-add.
1850
1851 Returns self*other+third with no rounding of the intermediate
1852 product self*other.
1853
1854 self and other are multiplied together, with no rounding of
1855 the result. The third operand is then added to the result,
1856 and a single final rounding is performed.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001857 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001858
1859 other = _convert_other(other, raiseit=True)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001860
1861 # compute product; raise InvalidOperation if either operand is
1862 # a signaling NaN or if the product is zero times infinity.
1863 if self._is_special or other._is_special:
1864 if context is None:
1865 context = getcontext()
1866 if self._exp == 'N':
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001867 return context._raise_error(InvalidOperation, 'sNaN', self)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001868 if other._exp == 'N':
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001869 return context._raise_error(InvalidOperation, 'sNaN', other)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001870 if self._exp == 'n':
1871 product = self
1872 elif other._exp == 'n':
1873 product = other
1874 elif self._exp == 'F':
1875 if not other:
1876 return context._raise_error(InvalidOperation,
1877 'INF * 0 in fma')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001878 product = _SignedInfinity[self._sign ^ other._sign]
Christian Heimes8b0facf2007-12-04 19:30:01 +00001879 elif other._exp == 'F':
1880 if not self:
1881 return context._raise_error(InvalidOperation,
1882 '0 * INF in fma')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001883 product = _SignedInfinity[self._sign ^ other._sign]
Christian Heimes8b0facf2007-12-04 19:30:01 +00001884 else:
1885 product = _dec_from_triple(self._sign ^ other._sign,
1886 str(int(self._int) * int(other._int)),
1887 self._exp + other._exp)
1888
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001889 third = _convert_other(third, raiseit=True)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001890 return product.__add__(third, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001891
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001892 def _power_modulo(self, other, modulo, context=None):
1893 """Three argument version of __pow__"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001894
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001895 # if can't convert other and modulo to Decimal, raise
1896 # TypeError; there's no point returning NotImplemented (no
1897 # equivalent of __rpow__ for three argument pow)
1898 other = _convert_other(other, raiseit=True)
1899 modulo = _convert_other(modulo, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001900
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001901 if context is None:
1902 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001903
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001904 # deal with NaNs: if there are any sNaNs then first one wins,
1905 # (i.e. behaviour for NaNs is identical to that of fma)
1906 self_is_nan = self._isnan()
1907 other_is_nan = other._isnan()
1908 modulo_is_nan = modulo._isnan()
1909 if self_is_nan or other_is_nan or modulo_is_nan:
1910 if self_is_nan == 2:
1911 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001912 self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001913 if other_is_nan == 2:
1914 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001915 other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001916 if modulo_is_nan == 2:
1917 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001918 modulo)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001919 if self_is_nan:
1920 return self._fix_nan(context)
1921 if other_is_nan:
1922 return other._fix_nan(context)
1923 return modulo._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001924
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001925 # check inputs: we apply same restrictions as Python's pow()
1926 if not (self._isinteger() and
1927 other._isinteger() and
1928 modulo._isinteger()):
1929 return context._raise_error(InvalidOperation,
1930 'pow() 3rd argument not allowed '
1931 'unless all arguments are integers')
1932 if other < 0:
1933 return context._raise_error(InvalidOperation,
1934 'pow() 2nd argument cannot be '
1935 'negative when 3rd argument specified')
1936 if not modulo:
1937 return context._raise_error(InvalidOperation,
1938 'pow() 3rd argument cannot be 0')
1939
1940 # additional restriction for decimal: the modulus must be less
1941 # than 10**prec in absolute value
1942 if modulo.adjusted() >= context.prec:
1943 return context._raise_error(InvalidOperation,
1944 'insufficient precision: pow() 3rd '
1945 'argument must not have more than '
1946 'precision digits')
1947
1948 # define 0**0 == NaN, for consistency with two-argument pow
1949 # (even though it hurts!)
1950 if not other and not self:
1951 return context._raise_error(InvalidOperation,
1952 'at least one of pow() 1st argument '
1953 'and 2nd argument must be nonzero ;'
1954 '0**0 is not defined')
1955
1956 # compute sign of result
1957 if other._iseven():
1958 sign = 0
1959 else:
1960 sign = self._sign
1961
1962 # convert modulo to a Python integer, and self and other to
1963 # Decimal integers (i.e. force their exponents to be >= 0)
1964 modulo = abs(int(modulo))
1965 base = _WorkRep(self.to_integral_value())
1966 exponent = _WorkRep(other.to_integral_value())
1967
1968 # compute result using integer pow()
1969 base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
1970 for i in range(exponent.exp):
1971 base = pow(base, 10, modulo)
1972 base = pow(base, exponent.int, modulo)
1973
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001974 return _dec_from_triple(sign, str(base), 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001975
1976 def _power_exact(self, other, p):
1977 """Attempt to compute self**other exactly.
1978
1979 Given Decimals self and other and an integer p, attempt to
1980 compute an exact result for the power self**other, with p
1981 digits of precision. Return None if self**other is not
1982 exactly representable in p digits.
1983
1984 Assumes that elimination of special cases has already been
1985 performed: self and other must both be nonspecial; self must
1986 be positive and not numerically equal to 1; other must be
1987 nonzero. For efficiency, other._exp should not be too large,
1988 so that 10**abs(other._exp) is a feasible calculation."""
1989
1990 # In the comments below, we write x for the value of self and
1991 # y for the value of other. Write x = xc*10**xe and y =
1992 # yc*10**ye.
1993
1994 # The main purpose of this method is to identify the *failure*
1995 # of x**y to be exactly representable with as little effort as
1996 # possible. So we look for cheap and easy tests that
1997 # eliminate the possibility of x**y being exact. Only if all
1998 # these tests are passed do we go on to actually compute x**y.
1999
2000 # Here's the main idea. First normalize both x and y. We
2001 # express y as a rational m/n, with m and n relatively prime
2002 # and n>0. Then for x**y to be exactly representable (at
2003 # *any* precision), xc must be the nth power of a positive
2004 # integer and xe must be divisible by n. If m is negative
2005 # then additionally xc must be a power of either 2 or 5, hence
2006 # a power of 2**n or 5**n.
2007 #
2008 # There's a limit to how small |y| can be: if y=m/n as above
2009 # then:
2010 #
2011 # (1) if xc != 1 then for the result to be representable we
2012 # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So
2013 # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
2014 # 2**(1/|y|), hence xc**|y| < 2 and the result is not
2015 # representable.
2016 #
2017 # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if
2018 # |y| < 1/|xe| then the result is not representable.
2019 #
2020 # Note that since x is not equal to 1, at least one of (1) and
2021 # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
2022 # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
2023 #
2024 # There's also a limit to how large y can be, at least if it's
2025 # positive: the normalized result will have coefficient xc**y,
2026 # so if it's representable then xc**y < 10**p, and y <
2027 # p/log10(xc). Hence if y*log10(xc) >= p then the result is
2028 # not exactly representable.
2029
2030 # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
2031 # so |y| < 1/xe and the result is not representable.
2032 # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
2033 # < 1/nbits(xc).
2034
2035 x = _WorkRep(self)
2036 xc, xe = x.int, x.exp
2037 while xc % 10 == 0:
2038 xc //= 10
2039 xe += 1
2040
2041 y = _WorkRep(other)
2042 yc, ye = y.int, y.exp
2043 while yc % 10 == 0:
2044 yc //= 10
2045 ye += 1
2046
2047 # case where xc == 1: result is 10**(xe*y), with xe*y
2048 # required to be an integer
2049 if xc == 1:
Mark Dickinson0390f502010-07-08 19:21:59 +00002050 xe *= yc
2051 # result is now 10**(xe * 10**ye); xe * 10**ye must be integral
2052 while xe % 10 == 0:
2053 xe //= 10
2054 ye += 1
2055 if ye < 0:
2056 return None
2057 exponent = xe * 10**ye
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002058 if y.sign == 1:
2059 exponent = -exponent
2060 # if other is a nonnegative integer, use ideal exponent
2061 if other._isinteger() and other._sign == 0:
2062 ideal_exponent = self._exp*int(other)
2063 zeros = min(exponent-ideal_exponent, p-1)
2064 else:
2065 zeros = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002066 return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002067
2068 # case where y is negative: xc must be either a power
2069 # of 2 or a power of 5.
2070 if y.sign == 1:
2071 last_digit = xc % 10
2072 if last_digit in (2,4,6,8):
2073 # quick test for power of 2
2074 if xc & -xc != xc:
2075 return None
2076 # now xc is a power of 2; e is its exponent
2077 e = _nbits(xc)-1
2078 # find e*y and xe*y; both must be integers
2079 if ye >= 0:
2080 y_as_int = yc*10**ye
2081 e = e*y_as_int
2082 xe = xe*y_as_int
2083 else:
2084 ten_pow = 10**-ye
2085 e, remainder = divmod(e*yc, ten_pow)
2086 if remainder:
2087 return None
2088 xe, remainder = divmod(xe*yc, ten_pow)
2089 if remainder:
2090 return None
2091
2092 if e*65 >= p*93: # 93/65 > log(10)/log(5)
2093 return None
2094 xc = 5**e
2095
2096 elif last_digit == 5:
2097 # e >= log_5(xc) if xc is a power of 5; we have
2098 # equality all the way up to xc=5**2658
2099 e = _nbits(xc)*28//65
2100 xc, remainder = divmod(5**e, xc)
2101 if remainder:
2102 return None
2103 while xc % 5 == 0:
2104 xc //= 5
2105 e -= 1
2106 if ye >= 0:
2107 y_as_integer = yc*10**ye
2108 e = e*y_as_integer
2109 xe = xe*y_as_integer
2110 else:
2111 ten_pow = 10**-ye
2112 e, remainder = divmod(e*yc, ten_pow)
2113 if remainder:
2114 return None
2115 xe, remainder = divmod(xe*yc, ten_pow)
2116 if remainder:
2117 return None
2118 if e*3 >= p*10: # 10/3 > log(10)/log(2)
2119 return None
2120 xc = 2**e
2121 else:
2122 return None
2123
2124 if xc >= 10**p:
2125 return None
2126 xe = -e-xe
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002127 return _dec_from_triple(0, str(xc), xe)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002128
2129 # now y is positive; find m and n such that y = m/n
2130 if ye >= 0:
2131 m, n = yc*10**ye, 1
2132 else:
2133 if xe != 0 and len(str(abs(yc*xe))) <= -ye:
2134 return None
2135 xc_bits = _nbits(xc)
2136 if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
2137 return None
2138 m, n = yc, 10**(-ye)
2139 while m % 2 == n % 2 == 0:
2140 m //= 2
2141 n //= 2
2142 while m % 5 == n % 5 == 0:
2143 m //= 5
2144 n //= 5
2145
2146 # compute nth root of xc*10**xe
2147 if n > 1:
2148 # if 1 < xc < 2**n then xc isn't an nth power
2149 if xc != 1 and xc_bits <= n:
2150 return None
2151
2152 xe, rem = divmod(xe, n)
2153 if rem != 0:
2154 return None
2155
2156 # compute nth root of xc using Newton's method
2157 a = 1 << -(-_nbits(xc)//n) # initial estimate
2158 while True:
2159 q, r = divmod(xc, a**(n-1))
2160 if a <= q:
2161 break
2162 else:
2163 a = (a*(n-1) + q)//n
2164 if not (a == q and r == 0):
2165 return None
2166 xc = a
2167
2168 # now xc*10**xe is the nth root of the original xc*10**xe
2169 # compute mth power of xc*10**xe
2170
2171 # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
2172 # 10**p and the result is not representable.
2173 if xc > 1 and m > p*100//_log10_lb(xc):
2174 return None
2175 xc = xc**m
2176 xe *= m
2177 if xc > 10**p:
2178 return None
2179
2180 # by this point the result *is* exactly representable
2181 # adjust the exponent to get as close as possible to the ideal
2182 # exponent, if necessary
2183 str_xc = str(xc)
2184 if other._isinteger() and other._sign == 0:
2185 ideal_exponent = self._exp*int(other)
2186 zeros = min(xe-ideal_exponent, p-len(str_xc))
2187 else:
2188 zeros = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002189 return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002190
2191 def __pow__(self, other, modulo=None, context=None):
2192 """Return self ** other [ % modulo].
2193
2194 With two arguments, compute self**other.
2195
2196 With three arguments, compute (self**other) % modulo. For the
2197 three argument form, the following restrictions on the
2198 arguments hold:
2199
2200 - all three arguments must be integral
2201 - other must be nonnegative
2202 - either self or other (or both) must be nonzero
2203 - modulo must be nonzero and must have at most p digits,
2204 where p is the context precision.
2205
2206 If any of these restrictions is violated the InvalidOperation
2207 flag is raised.
2208
2209 The result of pow(self, other, modulo) is identical to the
2210 result that would be obtained by computing (self**other) %
2211 modulo with unbounded precision, but is computed more
2212 efficiently. It is always exact.
2213 """
2214
2215 if modulo is not None:
2216 return self._power_modulo(other, modulo, context)
2217
2218 other = _convert_other(other)
2219 if other is NotImplemented:
2220 return other
2221
2222 if context is None:
2223 context = getcontext()
2224
2225 # either argument is a NaN => result is NaN
2226 ans = self._check_nans(other, context)
2227 if ans:
2228 return ans
2229
2230 # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
2231 if not other:
2232 if not self:
2233 return context._raise_error(InvalidOperation, '0 ** 0')
2234 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002235 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002236
2237 # result has sign 1 iff self._sign is 1 and other is an odd integer
2238 result_sign = 0
2239 if self._sign == 1:
2240 if other._isinteger():
2241 if not other._iseven():
2242 result_sign = 1
2243 else:
2244 # -ve**noninteger = NaN
2245 # (-0)**noninteger = 0**noninteger
2246 if self:
2247 return context._raise_error(InvalidOperation,
2248 'x ** y with x negative and y not an integer')
2249 # negate self, without doing any unwanted rounding
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002250 self = self.copy_negate()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002251
2252 # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
2253 if not self:
2254 if other._sign == 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002255 return _dec_from_triple(result_sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002256 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002257 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002258
2259 # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002260 if self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002261 if other._sign == 0:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002262 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002263 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002264 return _dec_from_triple(result_sign, '0', 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002265
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002266 # 1**other = 1, but the choice of exponent and the flags
2267 # depend on the exponent of self, and on whether other is a
2268 # positive integer, a negative integer, or neither
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002269 if self == _One:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002270 if other._isinteger():
2271 # exp = max(self._exp*max(int(other), 0),
2272 # 1-context.prec) but evaluating int(other) directly
2273 # is dangerous until we know other is small (other
2274 # could be 1e999999999)
2275 if other._sign == 1:
2276 multiplier = 0
2277 elif other > context.prec:
2278 multiplier = context.prec
2279 else:
2280 multiplier = int(other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002281
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002282 exp = self._exp * multiplier
2283 if exp < 1-context.prec:
2284 exp = 1-context.prec
2285 context._raise_error(Rounded)
2286 else:
2287 context._raise_error(Inexact)
2288 context._raise_error(Rounded)
2289 exp = 1-context.prec
2290
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002291 return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002292
2293 # compute adjusted exponent of self
2294 self_adj = self.adjusted()
2295
2296 # self ** infinity is infinity if self > 1, 0 if self < 1
2297 # self ** -infinity is infinity if self < 1, 0 if self > 1
2298 if other._isinfinity():
2299 if (other._sign == 0) == (self_adj < 0):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002300 return _dec_from_triple(result_sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002301 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002302 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002303
2304 # from here on, the result always goes through the call
2305 # to _fix at the end of this function.
2306 ans = None
Mark Dickinsonece06972010-05-04 14:37:14 +00002307 exact = False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002308
2309 # crude test to catch cases of extreme overflow/underflow. If
2310 # log10(self)*other >= 10**bound and bound >= len(str(Emax))
2311 # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
2312 # self**other >= 10**(Emax+1), so overflow occurs. The test
2313 # for underflow is similar.
2314 bound = self._log10_exp_bound() + other.adjusted()
2315 if (self_adj >= 0) == (other._sign == 0):
2316 # self > 1 and other +ve, or self < 1 and other -ve
2317 # possibility of overflow
2318 if bound >= len(str(context.Emax)):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002319 ans = _dec_from_triple(result_sign, '1', context.Emax+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002320 else:
2321 # self > 1 and other -ve, or self < 1 and other +ve
2322 # possibility of underflow to 0
2323 Etiny = context.Etiny()
2324 if bound >= len(str(-Etiny)):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002325 ans = _dec_from_triple(result_sign, '1', Etiny-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002326
2327 # try for an exact result with precision +1
2328 if ans is None:
2329 ans = self._power_exact(other, context.prec + 1)
Mark Dickinson0390f502010-07-08 19:21:59 +00002330 if ans is not None:
2331 if result_sign == 1:
2332 ans = _dec_from_triple(1, ans._int, ans._exp)
2333 exact = True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002334
2335 # usual case: inexact result, x**y computed directly as exp(y*log(x))
2336 if ans is None:
2337 p = context.prec
2338 x = _WorkRep(self)
2339 xc, xe = x.int, x.exp
2340 y = _WorkRep(other)
2341 yc, ye = y.int, y.exp
2342 if y.sign == 1:
2343 yc = -yc
2344
2345 # compute correctly rounded result: start with precision +3,
2346 # then increase precision until result is unambiguously roundable
2347 extra = 3
2348 while True:
2349 coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
2350 if coeff % (5*10**(len(str(coeff))-p-1)):
2351 break
2352 extra += 3
2353
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002354 ans = _dec_from_triple(result_sign, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002355
Mark Dickinsonece06972010-05-04 14:37:14 +00002356 # unlike exp, ln and log10, the power function respects the
2357 # rounding mode; no need to switch to ROUND_HALF_EVEN here
2358
2359 # There's a difficulty here when 'other' is not an integer and
2360 # the result is exact. In this case, the specification
2361 # requires that the Inexact flag be raised (in spite of
2362 # exactness), but since the result is exact _fix won't do this
2363 # for us. (Correspondingly, the Underflow signal should also
2364 # be raised for subnormal results.) We can't directly raise
2365 # these signals either before or after calling _fix, since
2366 # that would violate the precedence for signals. So we wrap
2367 # the ._fix call in a temporary context, and reraise
2368 # afterwards.
2369 if exact and not other._isinteger():
2370 # pad with zeros up to length context.prec+1 if necessary; this
2371 # ensures that the Rounded signal will be raised.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002372 if len(ans._int) <= context.prec:
Mark Dickinsonece06972010-05-04 14:37:14 +00002373 expdiff = context.prec + 1 - len(ans._int)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002374 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
2375 ans._exp-expdiff)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002376
Mark Dickinsonece06972010-05-04 14:37:14 +00002377 # create a copy of the current context, with cleared flags/traps
2378 newcontext = context.copy()
2379 newcontext.clear_flags()
2380 for exception in _signals:
2381 newcontext.traps[exception] = 0
2382
2383 # round in the new context
2384 ans = ans._fix(newcontext)
2385
2386 # raise Inexact, and if necessary, Underflow
2387 newcontext._raise_error(Inexact)
2388 if newcontext.flags[Subnormal]:
2389 newcontext._raise_error(Underflow)
2390
2391 # propagate signals to the original context; _fix could
2392 # have raised any of Overflow, Underflow, Subnormal,
2393 # Inexact, Rounded, Clamped. Overflow needs the correct
2394 # arguments. Note that the order of the exceptions is
2395 # important here.
2396 if newcontext.flags[Overflow]:
2397 context._raise_error(Overflow, 'above Emax', ans._sign)
2398 for exception in Underflow, Subnormal, Inexact, Rounded, Clamped:
2399 if newcontext.flags[exception]:
2400 context._raise_error(exception)
2401
2402 else:
2403 ans = ans._fix(context)
2404
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002405 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002406
2407 def __rpow__(self, other, context=None):
2408 """Swaps self/other and returns __pow__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002409 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00002410 if other is NotImplemented:
2411 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002412 return other.__pow__(self, context=context)
2413
2414 def normalize(self, context=None):
2415 """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002416
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002417 if context is None:
2418 context = getcontext()
2419
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002420 if self._is_special:
2421 ans = self._check_nans(context=context)
2422 if ans:
2423 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002424
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002425 dup = self._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002426 if dup._isinfinity():
2427 return dup
2428
2429 if not dup:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002430 return _dec_from_triple(dup._sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002431 exp_max = [context.Emax, context.Etop()][context._clamp]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002432 end = len(dup._int)
2433 exp = dup._exp
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002434 while dup._int[end-1] == '0' and exp < exp_max:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002435 exp += 1
2436 end -= 1
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002437 return _dec_from_triple(dup._sign, dup._int[:end], exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002438
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002439 def quantize(self, exp, rounding=None, context=None, watchexp=True):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002440 """Quantize self so its exponent is the same as that of exp.
2441
2442 Similar to self._rescale(exp._exp) but with error checking.
2443 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002444 exp = _convert_other(exp, raiseit=True)
2445
2446 if context is None:
2447 context = getcontext()
2448 if rounding is None:
2449 rounding = context.rounding
2450
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002451 if self._is_special or exp._is_special:
2452 ans = self._check_nans(exp, context)
2453 if ans:
2454 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002455
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002456 if exp._isinfinity() or self._isinfinity():
2457 if exp._isinfinity() and self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002458 return Decimal(self) # if both are inf, it is OK
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002459 return context._raise_error(InvalidOperation,
2460 'quantize with one INF')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002461
2462 # if we're not watching exponents, do a simple rescale
2463 if not watchexp:
2464 ans = self._rescale(exp._exp, rounding)
2465 # raise Inexact and Rounded where appropriate
2466 if ans._exp > self._exp:
2467 context._raise_error(Rounded)
2468 if ans != self:
2469 context._raise_error(Inexact)
2470 return ans
2471
2472 # exp._exp should be between Etiny and Emax
2473 if not (context.Etiny() <= exp._exp <= context.Emax):
2474 return context._raise_error(InvalidOperation,
2475 'target exponent out of bounds in quantize')
2476
2477 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002478 ans = _dec_from_triple(self._sign, '0', exp._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002479 return ans._fix(context)
2480
2481 self_adjusted = self.adjusted()
2482 if self_adjusted > context.Emax:
2483 return context._raise_error(InvalidOperation,
2484 'exponent of quantize result too large for current context')
2485 if self_adjusted - exp._exp + 1 > context.prec:
2486 return context._raise_error(InvalidOperation,
2487 'quantize result has too many digits for current context')
2488
2489 ans = self._rescale(exp._exp, rounding)
2490 if ans.adjusted() > context.Emax:
2491 return context._raise_error(InvalidOperation,
2492 'exponent of quantize result too large for current context')
2493 if len(ans._int) > context.prec:
2494 return context._raise_error(InvalidOperation,
2495 'quantize result has too many digits for current context')
2496
2497 # raise appropriate flags
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002498 if ans and ans.adjusted() < context.Emin:
2499 context._raise_error(Subnormal)
Mark Dickinsonece06972010-05-04 14:37:14 +00002500 if ans._exp > self._exp:
2501 if ans != self:
2502 context._raise_error(Inexact)
2503 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002504
Mark Dickinsonece06972010-05-04 14:37:14 +00002505 # call to fix takes care of any necessary folddown, and
2506 # signals Clamped if necessary
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002507 ans = ans._fix(context)
2508 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002509
2510 def same_quantum(self, other):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002511 """Return True if self and other have the same exponent; otherwise
2512 return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002513
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002514 If either operand is a special value, the following rules are used:
2515 * return True if both operands are infinities
2516 * return True if both operands are NaNs
2517 * otherwise, return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002518 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002519 other = _convert_other(other, raiseit=True)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002520 if self._is_special or other._is_special:
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002521 return (self.is_nan() and other.is_nan() or
2522 self.is_infinite() and other.is_infinite())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002523 return self._exp == other._exp
2524
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002525 def _rescale(self, exp, rounding):
2526 """Rescale self so that the exponent is exp, either by padding with zeros
2527 or by truncating digits, using the given rounding mode.
2528
2529 Specials are returned without change. This operation is
2530 quiet: it raises no flags, and uses no information from the
2531 context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002532
2533 exp = exp to scale to (an integer)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002534 rounding = rounding mode
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002535 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002536 if self._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002537 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002538 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002539 return _dec_from_triple(self._sign, '0', exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002540
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002541 if self._exp >= exp:
2542 # pad answer with zeros if necessary
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002543 return _dec_from_triple(self._sign,
2544 self._int + '0'*(self._exp - exp), exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002545
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002546 # too many digits; round and lose data. If self.adjusted() <
2547 # exp-1, replace self by 10**(exp-1) before rounding
2548 digits = len(self._int) + self._exp - exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002549 if digits < 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002550 self = _dec_from_triple(self._sign, '1', exp-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002551 digits = 0
2552 this_function = getattr(self, self._pick_rounding_function[rounding])
Christian Heimescbf3b5c2007-12-03 21:02:03 +00002553 changed = this_function(digits)
2554 coeff = self._int[:digits] or '0'
2555 if changed == 1:
2556 coeff = str(int(coeff)+1)
2557 return _dec_from_triple(self._sign, coeff, exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002558
Christian Heimesf16baeb2008-02-29 14:57:44 +00002559 def _round(self, places, rounding):
2560 """Round a nonzero, nonspecial Decimal to a fixed number of
2561 significant figures, using the given rounding mode.
2562
2563 Infinities, NaNs and zeros are returned unaltered.
2564
2565 This operation is quiet: it raises no flags, and uses no
2566 information from the context.
2567
2568 """
2569 if places <= 0:
2570 raise ValueError("argument should be at least 1 in _round")
2571 if self._is_special or not self:
2572 return Decimal(self)
2573 ans = self._rescale(self.adjusted()+1-places, rounding)
2574 # it can happen that the rescale alters the adjusted exponent;
2575 # for example when rounding 99.97 to 3 significant figures.
2576 # When this happens we end up with an extra 0 at the end of
2577 # the number; a second rescale fixes this.
2578 if ans.adjusted() != self.adjusted():
2579 ans = ans._rescale(ans.adjusted()+1-places, rounding)
2580 return ans
2581
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002582 def to_integral_exact(self, rounding=None, context=None):
2583 """Rounds to a nearby integer.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002584
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002585 If no rounding mode is specified, take the rounding mode from
2586 the context. This method raises the Rounded and Inexact flags
2587 when appropriate.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002588
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002589 See also: to_integral_value, which does exactly the same as
2590 this method except that it doesn't raise Inexact or Rounded.
2591 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002592 if self._is_special:
2593 ans = self._check_nans(context=context)
2594 if ans:
2595 return ans
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002596 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002597 if self._exp >= 0:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002598 return Decimal(self)
2599 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002600 return _dec_from_triple(self._sign, '0', 0)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002601 if context is None:
2602 context = getcontext()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002603 if rounding is None:
2604 rounding = context.rounding
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002605 ans = self._rescale(0, rounding)
2606 if ans != self:
2607 context._raise_error(Inexact)
Mark Dickinsonece06972010-05-04 14:37:14 +00002608 context._raise_error(Rounded)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002609 return ans
2610
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002611 def to_integral_value(self, rounding=None, context=None):
2612 """Rounds to the nearest integer, without raising inexact, rounded."""
2613 if context is None:
2614 context = getcontext()
2615 if rounding is None:
2616 rounding = context.rounding
2617 if self._is_special:
2618 ans = self._check_nans(context=context)
2619 if ans:
2620 return ans
2621 return Decimal(self)
2622 if self._exp >= 0:
2623 return Decimal(self)
2624 else:
2625 return self._rescale(0, rounding)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002626
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002627 # the method name changed, but we provide also the old one, for compatibility
2628 to_integral = to_integral_value
2629
2630 def sqrt(self, context=None):
2631 """Return the square root of self."""
Christian Heimes0348fb62008-03-26 12:55:56 +00002632 if context is None:
2633 context = getcontext()
2634
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002635 if self._is_special:
2636 ans = self._check_nans(context=context)
2637 if ans:
2638 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002639
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002640 if self._isinfinity() and self._sign == 0:
2641 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002642
2643 if not self:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002644 # exponent = self._exp // 2. sqrt(-0) = -0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002645 ans = _dec_from_triple(self._sign, '0', self._exp // 2)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002646 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002647
2648 if self._sign == 1:
2649 return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
2650
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002651 # At this point self represents a positive number. Let p be
2652 # the desired precision and express self in the form c*100**e
2653 # with c a positive real number and e an integer, c and e
2654 # being chosen so that 100**(p-1) <= c < 100**p. Then the
2655 # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
2656 # <= sqrt(c) < 10**p, so the closest representable Decimal at
2657 # precision p is n*10**e where n = round_half_even(sqrt(c)),
2658 # the closest integer to sqrt(c) with the even integer chosen
2659 # in the case of a tie.
2660 #
2661 # To ensure correct rounding in all cases, we use the
2662 # following trick: we compute the square root to an extra
2663 # place (precision p+1 instead of precision p), rounding down.
2664 # Then, if the result is inexact and its last digit is 0 or 5,
2665 # we increase the last digit to 1 or 6 respectively; if it's
2666 # exact we leave the last digit alone. Now the final round to
2667 # p places (or fewer in the case of underflow) will round
2668 # correctly and raise the appropriate flags.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002669
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002670 # use an extra digit of precision
2671 prec = context.prec+1
2672
2673 # write argument in the form c*100**e where e = self._exp//2
2674 # is the 'ideal' exponent, to be used if the square root is
2675 # exactly representable. l is the number of 'digits' of c in
2676 # base 100, so that 100**(l-1) <= c < 100**l.
2677 op = _WorkRep(self)
2678 e = op.exp >> 1
2679 if op.exp & 1:
2680 c = op.int * 10
2681 l = (len(self._int) >> 1) + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002682 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002683 c = op.int
2684 l = len(self._int)+1 >> 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002685
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002686 # rescale so that c has exactly prec base 100 'digits'
2687 shift = prec-l
2688 if shift >= 0:
2689 c *= 100**shift
2690 exact = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002691 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002692 c, remainder = divmod(c, 100**-shift)
2693 exact = not remainder
2694 e -= shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002695
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002696 # find n = floor(sqrt(c)) using Newton's method
2697 n = 10**prec
2698 while True:
2699 q = c//n
2700 if n <= q:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002701 break
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002702 else:
2703 n = n + q >> 1
2704 exact = exact and n*n == c
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002705
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002706 if exact:
2707 # result is exact; rescale to use ideal exponent e
2708 if shift >= 0:
2709 # assert n % 10**shift == 0
2710 n //= 10**shift
2711 else:
2712 n *= 10**-shift
2713 e += shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002714 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002715 # result is not exact; fix last digit as described above
2716 if n % 5 == 0:
2717 n += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002718
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002719 ans = _dec_from_triple(0, str(n), e)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002720
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002721 # round, and fit to current context
2722 context = context._shallow_copy()
2723 rounding = context._set_rounding(ROUND_HALF_EVEN)
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002724 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002725 context.rounding = rounding
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002726
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002727 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002728
2729 def max(self, other, context=None):
2730 """Returns the larger value.
2731
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002732 Like max(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002733 NaN (and signals if one is sNaN). Also rounds.
2734 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002735 other = _convert_other(other, raiseit=True)
2736
2737 if context is None:
2738 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002739
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002740 if self._is_special or other._is_special:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002741 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002742 # number is always returned
2743 sn = self._isnan()
2744 on = other._isnan()
2745 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00002746 if on == 1 and sn == 0:
2747 return self._fix(context)
2748 if sn == 1 and on == 0:
2749 return other._fix(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002750 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002751
Christian Heimes77c02eb2008-02-09 02:18:51 +00002752 c = self._cmp(other)
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002753 if c == 0:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002754 # If both operands are finite and equal in numerical value
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002755 # then an ordering is applied:
2756 #
Guido van Rossumd8faa362007-04-27 19:54:29 +00002757 # If the signs differ then max returns the operand with the
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002758 # positive sign and min returns the operand with the negative sign
2759 #
Guido van Rossumd8faa362007-04-27 19:54:29 +00002760 # If the signs are the same then the exponent is used to select
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002761 # the result. This is exactly the ordering used in compare_total.
2762 c = self.compare_total(other)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002763
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002764 if c == -1:
2765 ans = other
2766 else:
2767 ans = self
2768
Christian Heimes2c181612007-12-17 20:04:13 +00002769 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002770
2771 def min(self, other, context=None):
2772 """Returns the smaller value.
2773
Guido van Rossumd8faa362007-04-27 19:54:29 +00002774 Like min(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002775 NaN (and signals if one is sNaN). Also rounds.
2776 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002777 other = _convert_other(other, raiseit=True)
2778
2779 if context is None:
2780 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002781
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002782 if self._is_special or other._is_special:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002783 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002784 # number is always returned
2785 sn = self._isnan()
2786 on = other._isnan()
2787 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00002788 if on == 1 and sn == 0:
2789 return self._fix(context)
2790 if sn == 1 and on == 0:
2791 return other._fix(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002792 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002793
Christian Heimes77c02eb2008-02-09 02:18:51 +00002794 c = self._cmp(other)
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002795 if c == 0:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002796 c = self.compare_total(other)
2797
2798 if c == -1:
2799 ans = self
2800 else:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002801 ans = other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002802
Christian Heimes2c181612007-12-17 20:04:13 +00002803 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002804
2805 def _isinteger(self):
2806 """Returns whether self is an integer"""
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002807 if self._is_special:
2808 return False
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002809 if self._exp >= 0:
2810 return True
2811 rest = self._int[self._exp:]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002812 return rest == '0'*len(rest)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002813
2814 def _iseven(self):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002815 """Returns True if self is even. Assumes self is an integer."""
2816 if not self or self._exp > 0:
2817 return True
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002818 return self._int[-1+self._exp] in '02468'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002819
2820 def adjusted(self):
2821 """Return the adjusted exponent of self"""
2822 try:
2823 return self._exp + len(self._int) - 1
Guido van Rossumd8faa362007-04-27 19:54:29 +00002824 # If NaN or Infinity, self._exp is string
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002825 except TypeError:
2826 return 0
2827
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002828 def canonical(self, context=None):
2829 """Returns the same Decimal object.
2830
2831 As we do not have different encodings for the same number, the
2832 received object already is in its canonical form.
2833 """
2834 return self
2835
2836 def compare_signal(self, other, context=None):
2837 """Compares self to the other operand numerically.
2838
2839 It's pretty much like compare(), but all NaNs signal, with signaling
2840 NaNs taking precedence over quiet NaNs.
2841 """
Christian Heimes77c02eb2008-02-09 02:18:51 +00002842 other = _convert_other(other, raiseit = True)
2843 ans = self._compare_check_nans(other, context)
2844 if ans:
2845 return ans
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002846 return self.compare(other, context=context)
2847
2848 def compare_total(self, other):
2849 """Compares self to other using the abstract representations.
2850
2851 This is not like the standard compare, which use their numerical
2852 value. Note that a total ordering is defined for all possible abstract
2853 representations.
2854 """
Mark Dickinson9050bb22009-10-29 12:25:07 +00002855 other = _convert_other(other, raiseit=True)
2856
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002857 # if one is negative and the other is positive, it's easy
2858 if self._sign and not other._sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002859 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002860 if not self._sign and other._sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002861 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002862 sign = self._sign
2863
2864 # let's handle both NaN types
2865 self_nan = self._isnan()
2866 other_nan = other._isnan()
2867 if self_nan or other_nan:
2868 if self_nan == other_nan:
Mark Dickinson7a6bcce2009-08-28 13:44:35 +00002869 # compare payloads as though they're integers
2870 self_key = len(self._int), self._int
2871 other_key = len(other._int), other._int
2872 if self_key < other_key:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002873 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002874 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002875 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002876 return _NegativeOne
Mark Dickinson7a6bcce2009-08-28 13:44:35 +00002877 if self_key > other_key:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002878 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002879 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002880 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002881 return _One
2882 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002883
2884 if sign:
2885 if self_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002886 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002887 if other_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002888 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002889 if self_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002890 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002891 if other_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002892 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002893 else:
2894 if self_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002895 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002896 if other_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002897 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002898 if self_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002899 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002900 if other_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002901 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002902
2903 if self < other:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002904 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002905 if self > other:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002906 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002907
2908 if self._exp < other._exp:
2909 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002910 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002911 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002912 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002913 if self._exp > other._exp:
2914 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002915 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002916 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002917 return _One
2918 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002919
2920
2921 def compare_total_mag(self, other):
2922 """Compares self to other using abstract repr., ignoring sign.
2923
2924 Like compare_total, but with operand's sign ignored and assumed to be 0.
2925 """
Mark Dickinson9050bb22009-10-29 12:25:07 +00002926 other = _convert_other(other, raiseit=True)
2927
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002928 s = self.copy_abs()
2929 o = other.copy_abs()
2930 return s.compare_total(o)
2931
2932 def copy_abs(self):
2933 """Returns a copy with the sign set to 0. """
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002934 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002935
2936 def copy_negate(self):
2937 """Returns a copy with the sign inverted."""
2938 if self._sign:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002939 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002940 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002941 return _dec_from_triple(1, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002942
2943 def copy_sign(self, other):
2944 """Returns self with the sign of other."""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002945 return _dec_from_triple(other._sign, self._int,
2946 self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002947
2948 def exp(self, context=None):
2949 """Returns e ** self."""
2950
2951 if context is None:
2952 context = getcontext()
2953
2954 # exp(NaN) = NaN
2955 ans = self._check_nans(context=context)
2956 if ans:
2957 return ans
2958
2959 # exp(-Infinity) = 0
2960 if self._isinfinity() == -1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002961 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002962
2963 # exp(0) = 1
2964 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002965 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002966
2967 # exp(Infinity) = Infinity
2968 if self._isinfinity() == 1:
2969 return Decimal(self)
2970
2971 # the result is now guaranteed to be inexact (the true
2972 # mathematical result is transcendental). There's no need to
2973 # raise Rounded and Inexact here---they'll always be raised as
2974 # a result of the call to _fix.
2975 p = context.prec
2976 adj = self.adjusted()
2977
2978 # we only need to do any computation for quite a small range
2979 # of adjusted exponents---for example, -29 <= adj <= 10 for
2980 # the default context. For smaller exponent the result is
2981 # indistinguishable from 1 at the given precision, while for
2982 # larger exponent the result either overflows or underflows.
2983 if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
2984 # overflow
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002985 ans = _dec_from_triple(0, '1', context.Emax+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002986 elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
2987 # underflow to 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002988 ans = _dec_from_triple(0, '1', context.Etiny()-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002989 elif self._sign == 0 and adj < -p:
2990 # p+1 digits; final round will raise correct flags
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002991 ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002992 elif self._sign == 1 and adj < -p-1:
2993 # p+1 digits; final round will raise correct flags
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002994 ans = _dec_from_triple(0, '9'*(p+1), -p-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002995 # general case
2996 else:
2997 op = _WorkRep(self)
2998 c, e = op.int, op.exp
2999 if op.sign == 1:
3000 c = -c
3001
3002 # compute correctly rounded result: increase precision by
3003 # 3 digits at a time until we get an unambiguously
3004 # roundable result
3005 extra = 3
3006 while True:
3007 coeff, exp = _dexp(c, e, p+extra)
3008 if coeff % (5*10**(len(str(coeff))-p-1)):
3009 break
3010 extra += 3
3011
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003012 ans = _dec_from_triple(0, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003013
3014 # at this stage, ans should round correctly with *any*
3015 # rounding mode, not just with ROUND_HALF_EVEN
3016 context = context._shallow_copy()
3017 rounding = context._set_rounding(ROUND_HALF_EVEN)
3018 ans = ans._fix(context)
3019 context.rounding = rounding
3020
3021 return ans
3022
3023 def is_canonical(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003024 """Return True if self is canonical; otherwise return False.
3025
3026 Currently, the encoding of a Decimal instance is always
3027 canonical, so this method returns True for any Decimal.
3028 """
3029 return True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003030
3031 def is_finite(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003032 """Return True if self is finite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003033
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003034 A Decimal instance is considered finite if it is neither
3035 infinite nor a NaN.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003036 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003037 return not self._is_special
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003038
3039 def is_infinite(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003040 """Return True if self is infinite; otherwise return False."""
3041 return self._exp == 'F'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003042
3043 def is_nan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003044 """Return True if self is a qNaN or sNaN; otherwise return False."""
3045 return self._exp in ('n', 'N')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003046
3047 def is_normal(self, context=None):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003048 """Return True if self is a normal number; otherwise return False."""
3049 if self._is_special or not self:
3050 return False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003051 if context is None:
3052 context = getcontext()
Mark Dickinson2d4fce22009-10-20 13:40:25 +00003053 return context.Emin <= self.adjusted()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003054
3055 def is_qnan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003056 """Return True if self is a quiet NaN; otherwise return False."""
3057 return self._exp == 'n'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003058
3059 def is_signed(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003060 """Return True if self is negative; otherwise return False."""
3061 return self._sign == 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003062
3063 def is_snan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003064 """Return True if self is a signaling NaN; otherwise return False."""
3065 return self._exp == 'N'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003066
3067 def is_subnormal(self, context=None):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003068 """Return True if self is subnormal; otherwise return False."""
3069 if self._is_special or not self:
3070 return False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003071 if context is None:
3072 context = getcontext()
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003073 return self.adjusted() < context.Emin
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003074
3075 def is_zero(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003076 """Return True if self is a zero; otherwise return False."""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003077 return not self._is_special and self._int == '0'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003078
3079 def _ln_exp_bound(self):
3080 """Compute a lower bound for the adjusted exponent of self.ln().
3081 In other words, compute r such that self.ln() >= 10**r. Assumes
3082 that self is finite and positive and that self != 1.
3083 """
3084
3085 # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
3086 adj = self._exp + len(self._int) - 1
3087 if adj >= 1:
3088 # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
3089 return len(str(adj*23//10)) - 1
3090 if adj <= -2:
3091 # argument <= 0.1
3092 return len(str((-1-adj)*23//10)) - 1
3093 op = _WorkRep(self)
3094 c, e = op.int, op.exp
3095 if adj == 0:
3096 # 1 < self < 10
3097 num = str(c-10**-e)
3098 den = str(c)
3099 return len(num) - len(den) - (num < den)
3100 # adj == -1, 0.1 <= self < 1
3101 return e + len(str(10**-e - c)) - 1
3102
3103
3104 def ln(self, context=None):
3105 """Returns the natural (base e) logarithm of self."""
3106
3107 if context is None:
3108 context = getcontext()
3109
3110 # ln(NaN) = NaN
3111 ans = self._check_nans(context=context)
3112 if ans:
3113 return ans
3114
3115 # ln(0.0) == -Infinity
3116 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003117 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003118
3119 # ln(Infinity) = Infinity
3120 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003121 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003122
3123 # ln(1.0) == 0.0
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003124 if self == _One:
3125 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003126
3127 # ln(negative) raises InvalidOperation
3128 if self._sign == 1:
3129 return context._raise_error(InvalidOperation,
3130 'ln of a negative value')
3131
3132 # result is irrational, so necessarily inexact
3133 op = _WorkRep(self)
3134 c, e = op.int, op.exp
3135 p = context.prec
3136
3137 # correctly rounded result: repeatedly increase precision by 3
3138 # until we get an unambiguously roundable result
3139 places = p - self._ln_exp_bound() + 2 # at least p+3 places
3140 while True:
3141 coeff = _dlog(c, e, places)
3142 # assert len(str(abs(coeff)))-p >= 1
3143 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3144 break
3145 places += 3
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003146 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003147
3148 context = context._shallow_copy()
3149 rounding = context._set_rounding(ROUND_HALF_EVEN)
3150 ans = ans._fix(context)
3151 context.rounding = rounding
3152 return ans
3153
3154 def _log10_exp_bound(self):
3155 """Compute a lower bound for the adjusted exponent of self.log10().
3156 In other words, find r such that self.log10() >= 10**r.
3157 Assumes that self is finite and positive and that self != 1.
3158 """
3159
3160 # For x >= 10 or x < 0.1 we only need a bound on the integer
3161 # part of log10(self), and this comes directly from the
3162 # exponent of x. For 0.1 <= x <= 10 we use the inequalities
3163 # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
3164 # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0
3165
3166 adj = self._exp + len(self._int) - 1
3167 if adj >= 1:
3168 # self >= 10
3169 return len(str(adj))-1
3170 if adj <= -2:
3171 # self < 0.1
3172 return len(str(-1-adj))-1
3173 op = _WorkRep(self)
3174 c, e = op.int, op.exp
3175 if adj == 0:
3176 # 1 < self < 10
3177 num = str(c-10**-e)
3178 den = str(231*c)
3179 return len(num) - len(den) - (num < den) + 2
3180 # adj == -1, 0.1 <= self < 1
3181 num = str(10**-e-c)
3182 return len(num) + e - (num < "231") - 1
3183
3184 def log10(self, context=None):
3185 """Returns the base 10 logarithm of self."""
3186
3187 if context is None:
3188 context = getcontext()
3189
3190 # log10(NaN) = NaN
3191 ans = self._check_nans(context=context)
3192 if ans:
3193 return ans
3194
3195 # log10(0.0) == -Infinity
3196 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003197 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003198
3199 # log10(Infinity) = Infinity
3200 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003201 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003202
3203 # log10(negative or -Infinity) raises InvalidOperation
3204 if self._sign == 1:
3205 return context._raise_error(InvalidOperation,
3206 'log10 of a negative value')
3207
3208 # log10(10**n) = n
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003209 if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003210 # answer may need rounding
3211 ans = Decimal(self._exp + len(self._int) - 1)
3212 else:
3213 # result is irrational, so necessarily inexact
3214 op = _WorkRep(self)
3215 c, e = op.int, op.exp
3216 p = context.prec
3217
3218 # correctly rounded result: repeatedly increase precision
3219 # until result is unambiguously roundable
3220 places = p-self._log10_exp_bound()+2
3221 while True:
3222 coeff = _dlog10(c, e, places)
3223 # assert len(str(abs(coeff)))-p >= 1
3224 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3225 break
3226 places += 3
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003227 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003228
3229 context = context._shallow_copy()
3230 rounding = context._set_rounding(ROUND_HALF_EVEN)
3231 ans = ans._fix(context)
3232 context.rounding = rounding
3233 return ans
3234
3235 def logb(self, context=None):
3236 """ Returns the exponent of the magnitude of self's MSD.
3237
3238 The result is the integer which is the exponent of the magnitude
3239 of the most significant digit of self (as though it were truncated
3240 to a single digit while maintaining the value of that digit and
3241 without limiting the resulting exponent).
3242 """
3243 # logb(NaN) = NaN
3244 ans = self._check_nans(context=context)
3245 if ans:
3246 return ans
3247
3248 if context is None:
3249 context = getcontext()
3250
3251 # logb(+/-Inf) = +Inf
3252 if self._isinfinity():
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003253 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003254
3255 # logb(0) = -Inf, DivisionByZero
3256 if not self:
3257 return context._raise_error(DivisionByZero, 'logb(0)', 1)
3258
3259 # otherwise, simply return the adjusted exponent of self, as a
3260 # Decimal. Note that no attempt is made to fit the result
3261 # into the current context.
Mark Dickinsonb0907612009-10-07 19:24:43 +00003262 ans = Decimal(self.adjusted())
3263 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003264
3265 def _islogical(self):
3266 """Return True if self is a logical operand.
3267
Christian Heimes679db4a2008-01-18 09:56:22 +00003268 For being logical, it must be a finite number with a sign of 0,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003269 an exponent of 0, and a coefficient whose digits must all be
3270 either 0 or 1.
3271 """
3272 if self._sign != 0 or self._exp != 0:
3273 return False
3274 for dig in self._int:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003275 if dig not in '01':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003276 return False
3277 return True
3278
3279 def _fill_logical(self, context, opa, opb):
3280 dif = context.prec - len(opa)
3281 if dif > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003282 opa = '0'*dif + opa
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003283 elif dif < 0:
3284 opa = opa[-context.prec:]
3285 dif = context.prec - len(opb)
3286 if dif > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003287 opb = '0'*dif + opb
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003288 elif dif < 0:
3289 opb = opb[-context.prec:]
3290 return opa, opb
3291
3292 def logical_and(self, other, context=None):
3293 """Applies an 'and' operation between self and other's digits."""
3294 if context is None:
3295 context = getcontext()
Mark Dickinson9050bb22009-10-29 12:25:07 +00003296
3297 other = _convert_other(other, raiseit=True)
3298
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003299 if not self._islogical() or not other._islogical():
3300 return context._raise_error(InvalidOperation)
3301
3302 # fill to context.prec
3303 (opa, opb) = self._fill_logical(context, self._int, other._int)
3304
3305 # make the operation, and clean starting zeroes
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003306 result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
3307 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003308
3309 def logical_invert(self, context=None):
3310 """Invert all its digits."""
3311 if context is None:
3312 context = getcontext()
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003313 return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
3314 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003315
3316 def logical_or(self, other, context=None):
3317 """Applies an 'or' operation between self and other's digits."""
3318 if context is None:
3319 context = getcontext()
Mark Dickinson9050bb22009-10-29 12:25:07 +00003320
3321 other = _convert_other(other, raiseit=True)
3322
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003323 if not self._islogical() or not other._islogical():
3324 return context._raise_error(InvalidOperation)
3325
3326 # fill to context.prec
3327 (opa, opb) = self._fill_logical(context, self._int, other._int)
3328
3329 # make the operation, and clean starting zeroes
Mark Dickinson315a20a2009-01-04 21:34:18 +00003330 result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)])
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003331 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003332
3333 def logical_xor(self, other, context=None):
3334 """Applies an 'xor' operation between self and other's digits."""
3335 if context is None:
3336 context = getcontext()
Mark Dickinson9050bb22009-10-29 12:25:07 +00003337
3338 other = _convert_other(other, raiseit=True)
3339
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003340 if not self._islogical() or not other._islogical():
3341 return context._raise_error(InvalidOperation)
3342
3343 # fill to context.prec
3344 (opa, opb) = self._fill_logical(context, self._int, other._int)
3345
3346 # make the operation, and clean starting zeroes
Mark Dickinson315a20a2009-01-04 21:34:18 +00003347 result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)])
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003348 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003349
3350 def max_mag(self, other, context=None):
3351 """Compares the values numerically with their sign ignored."""
3352 other = _convert_other(other, raiseit=True)
3353
3354 if context is None:
3355 context = getcontext()
3356
3357 if self._is_special or other._is_special:
3358 # If one operand is a quiet NaN and the other is number, then the
3359 # number is always returned
3360 sn = self._isnan()
3361 on = other._isnan()
3362 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00003363 if on == 1 and sn == 0:
3364 return self._fix(context)
3365 if sn == 1 and on == 0:
3366 return other._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003367 return self._check_nans(other, context)
3368
Christian Heimes77c02eb2008-02-09 02:18:51 +00003369 c = self.copy_abs()._cmp(other.copy_abs())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003370 if c == 0:
3371 c = self.compare_total(other)
3372
3373 if c == -1:
3374 ans = other
3375 else:
3376 ans = self
3377
Christian Heimes2c181612007-12-17 20:04:13 +00003378 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003379
3380 def min_mag(self, other, context=None):
3381 """Compares the values numerically with their sign ignored."""
3382 other = _convert_other(other, raiseit=True)
3383
3384 if context is None:
3385 context = getcontext()
3386
3387 if self._is_special or other._is_special:
3388 # If one operand is a quiet NaN and the other is number, then the
3389 # number is always returned
3390 sn = self._isnan()
3391 on = other._isnan()
3392 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00003393 if on == 1 and sn == 0:
3394 return self._fix(context)
3395 if sn == 1 and on == 0:
3396 return other._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003397 return self._check_nans(other, context)
3398
Christian Heimes77c02eb2008-02-09 02:18:51 +00003399 c = self.copy_abs()._cmp(other.copy_abs())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003400 if c == 0:
3401 c = self.compare_total(other)
3402
3403 if c == -1:
3404 ans = self
3405 else:
3406 ans = other
3407
Christian Heimes2c181612007-12-17 20:04:13 +00003408 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003409
3410 def next_minus(self, context=None):
3411 """Returns the largest representable number smaller than itself."""
3412 if context is None:
3413 context = getcontext()
3414
3415 ans = self._check_nans(context=context)
3416 if ans:
3417 return ans
3418
3419 if self._isinfinity() == -1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003420 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003421 if self._isinfinity() == 1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003422 return _dec_from_triple(0, '9'*context.prec, context.Etop())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003423
3424 context = context.copy()
3425 context._set_rounding(ROUND_FLOOR)
3426 context._ignore_all_flags()
3427 new_self = self._fix(context)
3428 if new_self != self:
3429 return new_self
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003430 return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
3431 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003432
3433 def next_plus(self, context=None):
3434 """Returns the smallest representable number larger than itself."""
3435 if context is None:
3436 context = getcontext()
3437
3438 ans = self._check_nans(context=context)
3439 if ans:
3440 return ans
3441
3442 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003443 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003444 if self._isinfinity() == -1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003445 return _dec_from_triple(1, '9'*context.prec, context.Etop())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003446
3447 context = context.copy()
3448 context._set_rounding(ROUND_CEILING)
3449 context._ignore_all_flags()
3450 new_self = self._fix(context)
3451 if new_self != self:
3452 return new_self
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003453 return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
3454 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003455
3456 def next_toward(self, other, context=None):
3457 """Returns the number closest to self, in the direction towards other.
3458
3459 The result is the closest representable number to self
3460 (excluding self) that is in the direction towards other,
3461 unless both have the same value. If the two operands are
3462 numerically equal, then the result is a copy of self with the
3463 sign set to be the same as the sign of other.
3464 """
3465 other = _convert_other(other, raiseit=True)
3466
3467 if context is None:
3468 context = getcontext()
3469
3470 ans = self._check_nans(other, context)
3471 if ans:
3472 return ans
3473
Christian Heimes77c02eb2008-02-09 02:18:51 +00003474 comparison = self._cmp(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003475 if comparison == 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003476 return self.copy_sign(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003477
3478 if comparison == -1:
3479 ans = self.next_plus(context)
3480 else: # comparison == 1
3481 ans = self.next_minus(context)
3482
3483 # decide which flags to raise using value of ans
3484 if ans._isinfinity():
3485 context._raise_error(Overflow,
3486 'Infinite result from next_toward',
3487 ans._sign)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003488 context._raise_error(Inexact)
Mark Dickinsonece06972010-05-04 14:37:14 +00003489 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003490 elif ans.adjusted() < context.Emin:
3491 context._raise_error(Underflow)
3492 context._raise_error(Subnormal)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003493 context._raise_error(Inexact)
Mark Dickinsonece06972010-05-04 14:37:14 +00003494 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003495 # if precision == 1 then we don't raise Clamped for a
3496 # result 0E-Etiny.
3497 if not ans:
3498 context._raise_error(Clamped)
3499
3500 return ans
3501
3502 def number_class(self, context=None):
3503 """Returns an indication of the class of self.
3504
3505 The class is one of the following strings:
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003506 sNaN
3507 NaN
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003508 -Infinity
3509 -Normal
3510 -Subnormal
3511 -Zero
3512 +Zero
3513 +Subnormal
3514 +Normal
3515 +Infinity
3516 """
3517 if self.is_snan():
3518 return "sNaN"
3519 if self.is_qnan():
3520 return "NaN"
3521 inf = self._isinfinity()
3522 if inf == 1:
3523 return "+Infinity"
3524 if inf == -1:
3525 return "-Infinity"
3526 if self.is_zero():
3527 if self._sign:
3528 return "-Zero"
3529 else:
3530 return "+Zero"
3531 if context is None:
3532 context = getcontext()
3533 if self.is_subnormal(context=context):
3534 if self._sign:
3535 return "-Subnormal"
3536 else:
3537 return "+Subnormal"
3538 # just a normal, regular, boring number, :)
3539 if self._sign:
3540 return "-Normal"
3541 else:
3542 return "+Normal"
3543
3544 def radix(self):
3545 """Just returns 10, as this is Decimal, :)"""
3546 return Decimal(10)
3547
3548 def rotate(self, other, context=None):
3549 """Returns a rotated copy of self, value-of-other times."""
3550 if context is None:
3551 context = getcontext()
3552
Mark Dickinson9050bb22009-10-29 12:25:07 +00003553 other = _convert_other(other, raiseit=True)
3554
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003555 ans = self._check_nans(other, context)
3556 if ans:
3557 return ans
3558
3559 if other._exp != 0:
3560 return context._raise_error(InvalidOperation)
3561 if not (-context.prec <= int(other) <= context.prec):
3562 return context._raise_error(InvalidOperation)
3563
3564 if self._isinfinity():
3565 return Decimal(self)
3566
3567 # get values, pad if necessary
3568 torot = int(other)
3569 rotdig = self._int
3570 topad = context.prec - len(rotdig)
Mark Dickinson9050bb22009-10-29 12:25:07 +00003571 if topad > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003572 rotdig = '0'*topad + rotdig
Mark Dickinson9050bb22009-10-29 12:25:07 +00003573 elif topad < 0:
3574 rotdig = rotdig[-topad:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003575
3576 # let's rotate!
3577 rotated = rotdig[torot:] + rotdig[:torot]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003578 return _dec_from_triple(self._sign,
3579 rotated.lstrip('0') or '0', self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003580
Mark Dickinson9050bb22009-10-29 12:25:07 +00003581 def scaleb(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003582 """Returns self operand after adding the second value to its exp."""
3583 if context is None:
3584 context = getcontext()
3585
Mark Dickinson9050bb22009-10-29 12:25:07 +00003586 other = _convert_other(other, raiseit=True)
3587
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003588 ans = self._check_nans(other, context)
3589 if ans:
3590 return ans
3591
3592 if other._exp != 0:
3593 return context._raise_error(InvalidOperation)
3594 liminf = -2 * (context.Emax + context.prec)
3595 limsup = 2 * (context.Emax + context.prec)
3596 if not (liminf <= int(other) <= limsup):
3597 return context._raise_error(InvalidOperation)
3598
3599 if self._isinfinity():
3600 return Decimal(self)
3601
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003602 d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003603 d = d._fix(context)
3604 return d
3605
3606 def shift(self, other, context=None):
3607 """Returns a shifted copy of self, value-of-other times."""
3608 if context is None:
3609 context = getcontext()
3610
Mark Dickinson9050bb22009-10-29 12:25:07 +00003611 other = _convert_other(other, raiseit=True)
3612
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003613 ans = self._check_nans(other, context)
3614 if ans:
3615 return ans
3616
3617 if other._exp != 0:
3618 return context._raise_error(InvalidOperation)
3619 if not (-context.prec <= int(other) <= context.prec):
3620 return context._raise_error(InvalidOperation)
3621
3622 if self._isinfinity():
3623 return Decimal(self)
3624
3625 # get values, pad if necessary
3626 torot = int(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003627 rotdig = self._int
3628 topad = context.prec - len(rotdig)
Mark Dickinson9050bb22009-10-29 12:25:07 +00003629 if topad > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003630 rotdig = '0'*topad + rotdig
Mark Dickinson9050bb22009-10-29 12:25:07 +00003631 elif topad < 0:
3632 rotdig = rotdig[-topad:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003633
3634 # let's shift!
3635 if torot < 0:
Mark Dickinson9050bb22009-10-29 12:25:07 +00003636 shifted = rotdig[:torot]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003637 else:
Mark Dickinson9050bb22009-10-29 12:25:07 +00003638 shifted = rotdig + '0'*torot
3639 shifted = shifted[-context.prec:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003640
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003641 return _dec_from_triple(self._sign,
Mark Dickinson9050bb22009-10-29 12:25:07 +00003642 shifted.lstrip('0') or '0', self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003643
Guido van Rossumd8faa362007-04-27 19:54:29 +00003644 # Support for pickling, copy, and deepcopy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003645 def __reduce__(self):
3646 return (self.__class__, (str(self),))
3647
3648 def __copy__(self):
3649 if type(self) == Decimal:
3650 return self # I'm immutable; therefore I am my own clone
3651 return self.__class__(str(self))
3652
3653 def __deepcopy__(self, memo):
3654 if type(self) == Decimal:
3655 return self # My components are also immutable
3656 return self.__class__(str(self))
3657
Mark Dickinson79f52032009-03-17 23:12:51 +00003658 # PEP 3101 support. the _localeconv keyword argument should be
3659 # considered private: it's provided for ease of testing only.
3660 def __format__(self, specifier, context=None, _localeconv=None):
Christian Heimesf16baeb2008-02-29 14:57:44 +00003661 """Format a Decimal instance according to the given specifier.
3662
3663 The specifier should be a standard format specifier, with the
3664 form described in PEP 3101. Formatting types 'e', 'E', 'f',
Mark Dickinson79f52032009-03-17 23:12:51 +00003665 'F', 'g', 'G', 'n' and '%' are supported. If the formatting
3666 type is omitted it defaults to 'g' or 'G', depending on the
3667 value of context.capitals.
Christian Heimesf16baeb2008-02-29 14:57:44 +00003668 """
3669
3670 # Note: PEP 3101 says that if the type is not present then
3671 # there should be at least one digit after the decimal point.
3672 # We take the liberty of ignoring this requirement for
3673 # Decimal---it's presumably there to make sure that
3674 # format(float, '') behaves similarly to str(float).
3675 if context is None:
3676 context = getcontext()
3677
Mark Dickinson79f52032009-03-17 23:12:51 +00003678 spec = _parse_format_specifier(specifier, _localeconv=_localeconv)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003679
Mark Dickinson79f52032009-03-17 23:12:51 +00003680 # special values don't care about the type or precision
Christian Heimesf16baeb2008-02-29 14:57:44 +00003681 if self._is_special:
Mark Dickinson79f52032009-03-17 23:12:51 +00003682 sign = _format_sign(self._sign, spec)
3683 body = str(self.copy_abs())
3684 return _format_align(sign, body, spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003685
3686 # a type of None defaults to 'g' or 'G', depending on context
Christian Heimesf16baeb2008-02-29 14:57:44 +00003687 if spec['type'] is None:
3688 spec['type'] = ['g', 'G'][context.capitals]
Mark Dickinson79f52032009-03-17 23:12:51 +00003689
3690 # if type is '%', adjust exponent of self accordingly
3691 if spec['type'] == '%':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003692 self = _dec_from_triple(self._sign, self._int, self._exp+2)
3693
3694 # round if necessary, taking rounding mode from the context
3695 rounding = context.rounding
3696 precision = spec['precision']
3697 if precision is not None:
3698 if spec['type'] in 'eE':
3699 self = self._round(precision+1, rounding)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003700 elif spec['type'] in 'fF%':
3701 self = self._rescale(-precision, rounding)
Mark Dickinson79f52032009-03-17 23:12:51 +00003702 elif spec['type'] in 'gG' and len(self._int) > precision:
3703 self = self._round(precision, rounding)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003704 # special case: zeros with a positive exponent can't be
3705 # represented in fixed point; rescale them to 0e0.
Mark Dickinson79f52032009-03-17 23:12:51 +00003706 if not self and self._exp > 0 and spec['type'] in 'fF%':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003707 self = self._rescale(0, rounding)
3708
3709 # figure out placement of the decimal point
3710 leftdigits = self._exp + len(self._int)
Mark Dickinson79f52032009-03-17 23:12:51 +00003711 if spec['type'] in 'eE':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003712 if not self and precision is not None:
3713 dotplace = 1 - precision
3714 else:
3715 dotplace = 1
Mark Dickinson79f52032009-03-17 23:12:51 +00003716 elif spec['type'] in 'fF%':
3717 dotplace = leftdigits
Christian Heimesf16baeb2008-02-29 14:57:44 +00003718 elif spec['type'] in 'gG':
3719 if self._exp <= 0 and leftdigits > -6:
3720 dotplace = leftdigits
3721 else:
3722 dotplace = 1
3723
Mark Dickinson79f52032009-03-17 23:12:51 +00003724 # find digits before and after decimal point, and get exponent
3725 if dotplace < 0:
3726 intpart = '0'
3727 fracpart = '0'*(-dotplace) + self._int
3728 elif dotplace > len(self._int):
3729 intpart = self._int + '0'*(dotplace-len(self._int))
3730 fracpart = ''
Christian Heimesf16baeb2008-02-29 14:57:44 +00003731 else:
Mark Dickinson79f52032009-03-17 23:12:51 +00003732 intpart = self._int[:dotplace] or '0'
3733 fracpart = self._int[dotplace:]
3734 exp = leftdigits-dotplace
Christian Heimesf16baeb2008-02-29 14:57:44 +00003735
Mark Dickinson79f52032009-03-17 23:12:51 +00003736 # done with the decimal-specific stuff; hand over the rest
3737 # of the formatting to the _format_number function
3738 return _format_number(self._sign, intpart, fracpart, exp, spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003739
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003740def _dec_from_triple(sign, coefficient, exponent, special=False):
3741 """Create a decimal instance directly, without any validation,
3742 normalization (e.g. removal of leading zeros) or argument
3743 conversion.
3744
3745 This function is for *internal use only*.
3746 """
3747
3748 self = object.__new__(Decimal)
3749 self._sign = sign
3750 self._int = coefficient
3751 self._exp = exponent
3752 self._is_special = special
3753
3754 return self
3755
Raymond Hettinger82417ca2009-02-03 03:54:28 +00003756# Register Decimal as a kind of Number (an abstract base class).
3757# However, do not register it as Real (because Decimals are not
3758# interoperable with floats).
3759_numbers.Number.register(Decimal)
3760
3761
Guido van Rossumd8faa362007-04-27 19:54:29 +00003762##### Context class #######################################################
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003763
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003764
3765# get rounding method function:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003766rounding_functions = [name for name in Decimal.__dict__.keys()
3767 if name.startswith('_round_')]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003768for name in rounding_functions:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003769 # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003770 globalname = name[1:].upper()
3771 val = globals()[globalname]
3772 Decimal._pick_rounding_function[val] = name
3773
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003774del name, val, globalname, rounding_functions
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003775
Thomas Wouters89f507f2006-12-13 04:49:30 +00003776class _ContextManager(object):
3777 """Context manager class to support localcontext().
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003778
Thomas Wouters89f507f2006-12-13 04:49:30 +00003779 Sets a copy of the supplied context in __enter__() and restores
3780 the previous decimal context in __exit__()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003781 """
3782 def __init__(self, new_context):
Thomas Wouters89f507f2006-12-13 04:49:30 +00003783 self.new_context = new_context.copy()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003784 def __enter__(self):
3785 self.saved_context = getcontext()
3786 setcontext(self.new_context)
3787 return self.new_context
3788 def __exit__(self, t, v, tb):
3789 setcontext(self.saved_context)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003790
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003791class Context(object):
3792 """Contains the context for a Decimal instance.
3793
3794 Contains:
3795 prec - precision (for use in rounding, division, square roots..)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003796 rounding - rounding type (how you round)
Raymond Hettingerbf440692004-07-10 14:14:37 +00003797 traps - If traps[exception] = 1, then the exception is
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003798 raised when it is caused. Otherwise, a value is
3799 substituted in.
Raymond Hettinger86173da2008-02-01 20:38:12 +00003800 flags - When an exception is caused, flags[exception] is set.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003801 (Whether or not the trap_enabler is set)
3802 Should be reset by user of Decimal instance.
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003803 Emin - Minimum exponent
3804 Emax - Maximum exponent
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003805 capitals - If 1, 1*10^1 is printed as 1E+1.
3806 If 0, printed as 1e1
Raymond Hettingere0f15812004-07-05 05:36:39 +00003807 _clamp - If 1, change exponents if too high (Default 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003808 """
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003809
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003810 def __init__(self, prec=None, rounding=None,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003811 traps=None, flags=None,
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003812 Emin=None, Emax=None,
Raymond Hettingere0f15812004-07-05 05:36:39 +00003813 capitals=None, _clamp=0,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003814 _ignored_flags=None):
Mark Dickinson921d30d2010-07-08 21:18:21 +00003815 # Set defaults; for everything except flags and _ignored_flags,
3816 # inherit from DefaultContext.
3817 try:
3818 dc = DefaultContext
3819 except NameError:
3820 pass
3821
3822 self.prec = prec if prec is not None else dc.prec
3823 self.rounding = rounding if rounding is not None else dc.rounding
3824 self.Emin = Emin if Emin is not None else dc.Emin
3825 self.Emax = Emax if Emax is not None else dc.Emax
3826 self.capitals = capitals if capitals is not None else dc.capitals
3827 self._clamp = _clamp if _clamp is not None else dc._clamp
3828
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003829 if _ignored_flags is None:
Mark Dickinson921d30d2010-07-08 21:18:21 +00003830 self._ignored_flags = []
3831 else:
3832 self._ignored_flags = _ignored_flags
3833
3834 if traps is None:
3835 self.traps = dc.traps.copy()
3836 elif not isinstance(traps, dict):
3837 self.traps = dict((s, int(s in traps)) for s in _signals)
3838 else:
3839 self.traps = traps
3840
3841 if flags is None:
3842 self.flags = dict.fromkeys(_signals, 0)
3843 elif not isinstance(flags, dict):
3844 self.flags = dict((s, int(s in flags)) for s in _signals)
3845 else:
3846 self.flags = flags
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003847
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003848 def __repr__(self):
Raymond Hettingerbf440692004-07-10 14:14:37 +00003849 """Show the current context."""
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003850 s = []
Guido van Rossumd8faa362007-04-27 19:54:29 +00003851 s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
3852 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
3853 % vars(self))
3854 names = [f.__name__ for f, v in self.flags.items() if v]
3855 s.append('flags=[' + ', '.join(names) + ']')
3856 names = [t.__name__ for t, v in self.traps.items() if v]
3857 s.append('traps=[' + ', '.join(names) + ']')
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003858 return ', '.join(s) + ')'
3859
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003860 def clear_flags(self):
3861 """Reset all flags to zero"""
3862 for flag in self.flags:
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003863 self.flags[flag] = 0
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003864
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003865 def _shallow_copy(self):
3866 """Returns a shallow copy from self."""
Christian Heimes2c181612007-12-17 20:04:13 +00003867 nc = Context(self.prec, self.rounding, self.traps,
3868 self.flags, self.Emin, self.Emax,
3869 self.capitals, self._clamp, self._ignored_flags)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003870 return nc
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003871
3872 def copy(self):
3873 """Returns a deep copy from self."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00003874 nc = Context(self.prec, self.rounding, self.traps.copy(),
Christian Heimes2c181612007-12-17 20:04:13 +00003875 self.flags.copy(), self.Emin, self.Emax,
3876 self.capitals, self._clamp, self._ignored_flags)
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003877 return nc
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003878 __copy__ = copy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003879
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003880 def _raise_error(self, condition, explanation = None, *args):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003881 """Handles an error
3882
3883 If the flag is in _ignored_flags, returns the default response.
Raymond Hettinger86173da2008-02-01 20:38:12 +00003884 Otherwise, it sets the flag, then, if the corresponding
Stefan Krah395653e2010-05-19 15:54:54 +00003885 trap_enabler is set, it reraises the exception. Otherwise, it returns
Raymond Hettinger86173da2008-02-01 20:38:12 +00003886 the default value after setting the flag.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003887 """
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003888 error = _condition_map.get(condition, condition)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003889 if error in self._ignored_flags:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003890 # Don't touch the flag
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003891 return error().handle(self, *args)
3892
Raymond Hettinger86173da2008-02-01 20:38:12 +00003893 self.flags[error] = 1
Raymond Hettingerbf440692004-07-10 14:14:37 +00003894 if not self.traps[error]:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003895 # The errors define how to handle themselves.
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003896 return condition().handle(self, *args)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003897
3898 # Errors should only be risked on copies of the context
Guido van Rossumd8faa362007-04-27 19:54:29 +00003899 # self._ignored_flags = []
Collin Winterce36ad82007-08-30 01:19:48 +00003900 raise error(explanation)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003901
3902 def _ignore_all_flags(self):
3903 """Ignore all flags, if they are raised"""
Raymond Hettingerfed52962004-07-14 15:41:57 +00003904 return self._ignore_flags(*_signals)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003905
3906 def _ignore_flags(self, *flags):
3907 """Ignore the flags, if they are raised"""
3908 # Do not mutate-- This way, copies of a context leave the original
3909 # alone.
3910 self._ignored_flags = (self._ignored_flags + list(flags))
3911 return list(flags)
3912
3913 def _regard_flags(self, *flags):
3914 """Stop ignoring the flags, if they are raised"""
3915 if flags and isinstance(flags[0], (tuple,list)):
3916 flags = flags[0]
3917 for flag in flags:
3918 self._ignored_flags.remove(flag)
3919
Nick Coghland1abd252008-07-15 15:46:38 +00003920 # We inherit object.__hash__, so we must deny this explicitly
3921 __hash__ = None
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003922
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003923 def Etiny(self):
3924 """Returns Etiny (= Emin - prec + 1)"""
3925 return int(self.Emin - self.prec + 1)
3926
3927 def Etop(self):
Raymond Hettingere0f15812004-07-05 05:36:39 +00003928 """Returns maximum exponent (= Emax - prec + 1)"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003929 return int(self.Emax - self.prec + 1)
3930
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003931 def _set_rounding(self, type):
3932 """Sets the rounding type.
3933
3934 Sets the rounding type, and returns the current (previous)
3935 rounding type. Often used like:
3936
3937 context = context.copy()
3938 # so you don't change the calling context
3939 # if an error occurs in the middle.
3940 rounding = context._set_rounding(ROUND_UP)
3941 val = self.__sub__(other, context=context)
3942 context._set_rounding(rounding)
3943
3944 This will make it round up for that operation.
3945 """
3946 rounding = self.rounding
3947 self.rounding= type
3948 return rounding
3949
Raymond Hettingerfed52962004-07-14 15:41:57 +00003950 def create_decimal(self, num='0'):
Christian Heimesa62da1d2008-01-12 19:39:10 +00003951 """Creates a new Decimal instance but using self as context.
3952
3953 This method implements the to-number operation of the
3954 IBM Decimal specification."""
3955
3956 if isinstance(num, str) and num != num.strip():
3957 return self._raise_error(ConversionSyntax,
3958 "no trailing or leading whitespace is "
3959 "permitted.")
3960
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003961 d = Decimal(num, context=self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003962 if d._isnan() and len(d._int) > self.prec - self._clamp:
3963 return self._raise_error(ConversionSyntax,
3964 "diagnostic info too long in NaN")
Raymond Hettingerdab988d2004-10-09 07:10:44 +00003965 return d._fix(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003966
Raymond Hettinger771ed762009-01-03 19:20:32 +00003967 def create_decimal_from_float(self, f):
3968 """Creates a new Decimal instance from a float but rounding using self
3969 as the context.
3970
3971 >>> context = Context(prec=5, rounding=ROUND_DOWN)
3972 >>> context.create_decimal_from_float(3.1415926535897932)
3973 Decimal('3.1415')
3974 >>> context = Context(prec=5, traps=[Inexact])
3975 >>> context.create_decimal_from_float(3.1415926535897932)
3976 Traceback (most recent call last):
3977 ...
3978 decimal.Inexact: None
3979
3980 """
3981 d = Decimal.from_float(f) # An exact conversion
3982 return d._fix(self) # Apply the context rounding
3983
Guido van Rossumd8faa362007-04-27 19:54:29 +00003984 # Methods
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003985 def abs(self, a):
3986 """Returns the absolute value of the operand.
3987
3988 If the operand is negative, the result is the same as using the minus
Guido van Rossumd8faa362007-04-27 19:54:29 +00003989 operation on the operand. Otherwise, the result is the same as using
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003990 the plus operation on the operand.
3991
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003992 >>> ExtendedContext.abs(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00003993 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003994 >>> ExtendedContext.abs(Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00003995 Decimal('100')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003996 >>> ExtendedContext.abs(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00003997 Decimal('101.5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003998 >>> ExtendedContext.abs(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00003999 Decimal('101.5')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004000 """
4001 return a.__abs__(context=self)
4002
4003 def add(self, a, b):
4004 """Return the sum of the two operands.
4005
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004006 >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004007 Decimal('19.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004008 >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004009 Decimal('1.02E+4')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004010 """
4011 return a.__add__(b, context=self)
4012
4013 def _apply(self, a):
Raymond Hettingerdab988d2004-10-09 07:10:44 +00004014 return str(a._fix(self))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004015
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004016 def canonical(self, a):
4017 """Returns the same Decimal object.
4018
4019 As we do not have different encodings for the same number, the
4020 received object already is in its canonical form.
4021
4022 >>> ExtendedContext.canonical(Decimal('2.50'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004023 Decimal('2.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004024 """
4025 return a.canonical(context=self)
4026
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004027 def compare(self, a, b):
4028 """Compares values numerically.
4029
4030 If the signs of the operands differ, a value representing each operand
4031 ('-1' if the operand is less than zero, '0' if the operand is zero or
4032 negative zero, or '1' if the operand is greater than zero) is used in
4033 place of that operand for the comparison instead of the actual
4034 operand.
4035
4036 The comparison is then effected by subtracting the second operand from
4037 the first and then returning a value according to the result of the
4038 subtraction: '-1' if the result is less than zero, '0' if the result is
4039 zero or negative zero, or '1' if the result is greater than zero.
4040
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004041 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004042 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004043 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004044 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004045 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004046 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004047 >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004048 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004049 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004050 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004051 >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004052 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004053 """
4054 return a.compare(b, context=self)
4055
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004056 def compare_signal(self, a, b):
4057 """Compares the values of the two operands numerically.
4058
4059 It's pretty much like compare(), but all NaNs signal, with signaling
4060 NaNs taking precedence over quiet NaNs.
4061
4062 >>> c = ExtendedContext
4063 >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004064 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004065 >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004066 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004067 >>> c.flags[InvalidOperation] = 0
4068 >>> print(c.flags[InvalidOperation])
4069 0
4070 >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004071 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004072 >>> print(c.flags[InvalidOperation])
4073 1
4074 >>> c.flags[InvalidOperation] = 0
4075 >>> print(c.flags[InvalidOperation])
4076 0
4077 >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004078 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004079 >>> print(c.flags[InvalidOperation])
4080 1
4081 """
4082 return a.compare_signal(b, context=self)
4083
4084 def compare_total(self, a, b):
4085 """Compares two operands using their abstract representation.
4086
4087 This is not like the standard compare, which use their numerical
4088 value. Note that a total ordering is defined for all possible abstract
4089 representations.
4090
4091 >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004092 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004093 >>> ExtendedContext.compare_total(Decimal('-127'), Decimal('12'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004094 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004095 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004096 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004097 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004098 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004099 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('12.300'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004100 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004101 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004102 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004103 """
4104 return a.compare_total(b)
4105
4106 def compare_total_mag(self, a, b):
4107 """Compares two operands using their abstract representation ignoring sign.
4108
4109 Like compare_total, but with operand's sign ignored and assumed to be 0.
4110 """
4111 return a.compare_total_mag(b)
4112
4113 def copy_abs(self, a):
4114 """Returns a copy of the operand with the sign set to 0.
4115
4116 >>> ExtendedContext.copy_abs(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004117 Decimal('2.1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004118 >>> ExtendedContext.copy_abs(Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004119 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004120 """
4121 return a.copy_abs()
4122
4123 def copy_decimal(self, a):
4124 """Returns a copy of the decimal objet.
4125
4126 >>> ExtendedContext.copy_decimal(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004127 Decimal('2.1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004128 >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004129 Decimal('-1.00')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004130 """
4131 return Decimal(a)
4132
4133 def copy_negate(self, a):
4134 """Returns a copy of the operand with the sign inverted.
4135
4136 >>> ExtendedContext.copy_negate(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004137 Decimal('-101.5')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004138 >>> ExtendedContext.copy_negate(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004139 Decimal('101.5')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004140 """
4141 return a.copy_negate()
4142
4143 def copy_sign(self, a, b):
4144 """Copies the second operand's sign to the first one.
4145
4146 In detail, it returns a copy of the first operand with the sign
4147 equal to the sign of the second operand.
4148
4149 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004150 Decimal('1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004151 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004152 Decimal('1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004153 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004154 Decimal('-1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004155 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004156 Decimal('-1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004157 """
4158 return a.copy_sign(b)
4159
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004160 def divide(self, a, b):
4161 """Decimal division in a specified context.
4162
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004163 >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004164 Decimal('0.333333333')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004165 >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004166 Decimal('0.666666667')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004167 >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004168 Decimal('2.5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004169 >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004170 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004171 >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004172 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004173 >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004174 Decimal('4.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004175 >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004176 Decimal('1.20')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004177 >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004178 Decimal('10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004179 >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004180 Decimal('1000')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004181 >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004182 Decimal('1.20E+6')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004183 """
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004184 return a.__truediv__(b, context=self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004185
4186 def divide_int(self, a, b):
4187 """Divides two numbers and returns the integer part of the result.
4188
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004189 >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004190 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004191 >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004192 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004193 >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004194 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004195 """
4196 return a.__floordiv__(b, context=self)
4197
4198 def divmod(self, a, b):
Mark Dickinson875e1e72010-01-06 16:23:13 +00004199 """Return (a // b, a % b)
4200
4201 >>> ExtendedContext.divmod(Decimal(8), Decimal(3))
4202 (Decimal('2'), Decimal('2'))
4203 >>> ExtendedContext.divmod(Decimal(8), Decimal(4))
4204 (Decimal('2'), Decimal('0'))
4205 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004206 return a.__divmod__(b, context=self)
4207
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004208 def exp(self, a):
4209 """Returns e ** a.
4210
4211 >>> c = ExtendedContext.copy()
4212 >>> c.Emin = -999
4213 >>> c.Emax = 999
4214 >>> c.exp(Decimal('-Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004215 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004216 >>> c.exp(Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004217 Decimal('0.367879441')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004218 >>> c.exp(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004219 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004220 >>> c.exp(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004221 Decimal('2.71828183')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004222 >>> c.exp(Decimal('0.693147181'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004223 Decimal('2.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004224 >>> c.exp(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004225 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004226 """
4227 return a.exp(context=self)
4228
4229 def fma(self, a, b, c):
4230 """Returns a multiplied by b, plus c.
4231
4232 The first two operands are multiplied together, using multiply,
4233 the third operand is then added to the result of that
4234 multiplication, using add, all with only one final rounding.
4235
4236 >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004237 Decimal('22')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004238 >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004239 Decimal('-8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004240 >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004241 Decimal('1.38435736E+12')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004242 """
4243 return a.fma(b, c, context=self)
4244
4245 def is_canonical(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004246 """Return True if the operand is canonical; otherwise return False.
4247
4248 Currently, the encoding of a Decimal instance is always
4249 canonical, so this method returns True for any Decimal.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004250
4251 >>> ExtendedContext.is_canonical(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004252 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004253 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004254 return a.is_canonical()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004255
4256 def is_finite(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004257 """Return True if the operand is finite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004258
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004259 A Decimal instance is considered finite if it is neither
4260 infinite nor a NaN.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004261
4262 >>> ExtendedContext.is_finite(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004263 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004264 >>> ExtendedContext.is_finite(Decimal('-0.3'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004265 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004266 >>> ExtendedContext.is_finite(Decimal('0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004267 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004268 >>> ExtendedContext.is_finite(Decimal('Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004269 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004270 >>> ExtendedContext.is_finite(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004271 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004272 """
4273 return a.is_finite()
4274
4275 def is_infinite(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004276 """Return True if the operand is infinite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004277
4278 >>> ExtendedContext.is_infinite(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004279 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004280 >>> ExtendedContext.is_infinite(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004281 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004282 >>> ExtendedContext.is_infinite(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004283 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004284 """
4285 return a.is_infinite()
4286
4287 def is_nan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004288 """Return True if the operand is a qNaN or sNaN;
4289 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004290
4291 >>> ExtendedContext.is_nan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004292 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004293 >>> ExtendedContext.is_nan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004294 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004295 >>> ExtendedContext.is_nan(Decimal('-sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004296 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004297 """
4298 return a.is_nan()
4299
4300 def is_normal(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004301 """Return True if the operand is a normal number;
4302 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004303
4304 >>> c = ExtendedContext.copy()
4305 >>> c.Emin = -999
4306 >>> c.Emax = 999
4307 >>> c.is_normal(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004308 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004309 >>> c.is_normal(Decimal('0.1E-999'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004310 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004311 >>> c.is_normal(Decimal('0.00'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004312 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004313 >>> c.is_normal(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004314 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004315 >>> c.is_normal(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004316 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004317 """
4318 return a.is_normal(context=self)
4319
4320 def is_qnan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004321 """Return True if the operand is a quiet NaN; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004322
4323 >>> ExtendedContext.is_qnan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004324 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004325 >>> ExtendedContext.is_qnan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004326 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004327 >>> ExtendedContext.is_qnan(Decimal('sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004328 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004329 """
4330 return a.is_qnan()
4331
4332 def is_signed(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004333 """Return True if the operand is negative; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004334
4335 >>> ExtendedContext.is_signed(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004336 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004337 >>> ExtendedContext.is_signed(Decimal('-12'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004338 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004339 >>> ExtendedContext.is_signed(Decimal('-0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004340 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004341 """
4342 return a.is_signed()
4343
4344 def is_snan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004345 """Return True if the operand is a signaling NaN;
4346 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004347
4348 >>> ExtendedContext.is_snan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004349 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004350 >>> ExtendedContext.is_snan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004351 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004352 >>> ExtendedContext.is_snan(Decimal('sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004353 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004354 """
4355 return a.is_snan()
4356
4357 def is_subnormal(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004358 """Return True if the operand is subnormal; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004359
4360 >>> c = ExtendedContext.copy()
4361 >>> c.Emin = -999
4362 >>> c.Emax = 999
4363 >>> c.is_subnormal(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004364 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004365 >>> c.is_subnormal(Decimal('0.1E-999'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004366 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004367 >>> c.is_subnormal(Decimal('0.00'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004368 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004369 >>> c.is_subnormal(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004370 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004371 >>> c.is_subnormal(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004372 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004373 """
4374 return a.is_subnormal(context=self)
4375
4376 def is_zero(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004377 """Return True if the operand is a zero; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004378
4379 >>> ExtendedContext.is_zero(Decimal('0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004380 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004381 >>> ExtendedContext.is_zero(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004382 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004383 >>> ExtendedContext.is_zero(Decimal('-0E+2'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004384 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004385 """
4386 return a.is_zero()
4387
4388 def ln(self, a):
4389 """Returns the natural (base e) logarithm of the operand.
4390
4391 >>> c = ExtendedContext.copy()
4392 >>> c.Emin = -999
4393 >>> c.Emax = 999
4394 >>> c.ln(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004395 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004396 >>> c.ln(Decimal('1.000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004397 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004398 >>> c.ln(Decimal('2.71828183'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004399 Decimal('1.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004400 >>> c.ln(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004401 Decimal('2.30258509')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004402 >>> c.ln(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004403 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004404 """
4405 return a.ln(context=self)
4406
4407 def log10(self, a):
4408 """Returns the base 10 logarithm of the operand.
4409
4410 >>> c = ExtendedContext.copy()
4411 >>> c.Emin = -999
4412 >>> c.Emax = 999
4413 >>> c.log10(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004414 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004415 >>> c.log10(Decimal('0.001'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004416 Decimal('-3')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004417 >>> c.log10(Decimal('1.000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004418 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004419 >>> c.log10(Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004420 Decimal('0.301029996')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004421 >>> c.log10(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004422 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004423 >>> c.log10(Decimal('70'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004424 Decimal('1.84509804')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004425 >>> c.log10(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004426 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004427 """
4428 return a.log10(context=self)
4429
4430 def logb(self, a):
4431 """ Returns the exponent of the magnitude of the operand's MSD.
4432
4433 The result is the integer which is the exponent of the magnitude
4434 of the most significant digit of the operand (as though the
4435 operand were truncated to a single digit while maintaining the
4436 value of that digit and without limiting the resulting exponent).
4437
4438 >>> ExtendedContext.logb(Decimal('250'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004439 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004440 >>> ExtendedContext.logb(Decimal('2.50'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004441 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004442 >>> ExtendedContext.logb(Decimal('0.03'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004443 Decimal('-2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004444 >>> ExtendedContext.logb(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004445 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004446 """
4447 return a.logb(context=self)
4448
4449 def logical_and(self, a, b):
4450 """Applies the logical operation 'and' between each operand's digits.
4451
4452 The operands must be both logical numbers.
4453
4454 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004455 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004456 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004457 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004458 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004459 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004460 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004461 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004462 >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004463 Decimal('1000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004464 >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004465 Decimal('10')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004466 """
4467 return a.logical_and(b, context=self)
4468
4469 def logical_invert(self, a):
4470 """Invert all the digits in the operand.
4471
4472 The operand must be a logical number.
4473
4474 >>> ExtendedContext.logical_invert(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004475 Decimal('111111111')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004476 >>> ExtendedContext.logical_invert(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004477 Decimal('111111110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004478 >>> ExtendedContext.logical_invert(Decimal('111111111'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004479 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004480 >>> ExtendedContext.logical_invert(Decimal('101010101'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004481 Decimal('10101010')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004482 """
4483 return a.logical_invert(context=self)
4484
4485 def logical_or(self, a, b):
4486 """Applies the logical operation 'or' between each operand's digits.
4487
4488 The operands must be both logical numbers.
4489
4490 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004491 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004492 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004493 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004494 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004495 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004496 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004497 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004498 >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004499 Decimal('1110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004500 >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004501 Decimal('1110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004502 """
4503 return a.logical_or(b, context=self)
4504
4505 def logical_xor(self, a, b):
4506 """Applies the logical operation 'xor' between each operand's digits.
4507
4508 The operands must be both logical numbers.
4509
4510 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004511 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004512 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004513 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004514 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004515 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004516 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004517 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004518 >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004519 Decimal('110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004520 >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004521 Decimal('1101')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004522 """
4523 return a.logical_xor(b, context=self)
4524
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004525 def max(self, a,b):
4526 """max compares two values numerically and returns the maximum.
4527
4528 If either operand is a NaN then the general rules apply.
Christian Heimes679db4a2008-01-18 09:56:22 +00004529 Otherwise, the operands are compared as though by the compare
Guido van Rossumd8faa362007-04-27 19:54:29 +00004530 operation. If they are numerically equal then the left-hand operand
4531 is chosen as the result. Otherwise the maximum (closer to positive
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004532 infinity) of the two operands is chosen as the result.
4533
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004534 >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004535 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004536 >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004537 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004538 >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004539 Decimal('1')
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004540 >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004541 Decimal('7')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004542 """
4543 return a.max(b, context=self)
4544
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004545 def max_mag(self, a, b):
4546 """Compares the values numerically with their sign ignored."""
4547 return a.max_mag(b, context=self)
4548
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004549 def min(self, a,b):
4550 """min compares two values numerically and returns the minimum.
4551
4552 If either operand is a NaN then the general rules apply.
Christian Heimes679db4a2008-01-18 09:56:22 +00004553 Otherwise, the operands are compared as though by the compare
Guido van Rossumd8faa362007-04-27 19:54:29 +00004554 operation. If they are numerically equal then the left-hand operand
4555 is chosen as the result. Otherwise the minimum (closer to negative
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004556 infinity) of the two operands is chosen as the result.
4557
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004558 >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004559 Decimal('2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004560 >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004561 Decimal('-10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004562 >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004563 Decimal('1.0')
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004564 >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004565 Decimal('7')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004566 """
4567 return a.min(b, context=self)
4568
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004569 def min_mag(self, a, b):
4570 """Compares the values numerically with their sign ignored."""
4571 return a.min_mag(b, context=self)
4572
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004573 def minus(self, a):
4574 """Minus corresponds to unary prefix minus in Python.
4575
4576 The operation is evaluated using the same rules as subtract; the
4577 operation minus(a) is calculated as subtract('0', a) where the '0'
4578 has the same exponent as the operand.
4579
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004580 >>> ExtendedContext.minus(Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004581 Decimal('-1.3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004582 >>> ExtendedContext.minus(Decimal('-1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004583 Decimal('1.3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004584 """
4585 return a.__neg__(context=self)
4586
4587 def multiply(self, a, b):
4588 """multiply multiplies two operands.
4589
4590 If either operand is a special value then the general rules apply.
4591 Otherwise, the operands are multiplied together ('long multiplication'),
4592 resulting in a number which may be as long as the sum of the lengths
4593 of the two operands.
4594
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004595 >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004596 Decimal('3.60')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004597 >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004598 Decimal('21')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004599 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004600 Decimal('0.72')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004601 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004602 Decimal('-0.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004603 >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004604 Decimal('4.28135971E+11')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004605 """
4606 return a.__mul__(b, context=self)
4607
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004608 def next_minus(self, a):
4609 """Returns the largest representable number smaller than a.
4610
4611 >>> c = ExtendedContext.copy()
4612 >>> c.Emin = -999
4613 >>> c.Emax = 999
4614 >>> ExtendedContext.next_minus(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004615 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004616 >>> c.next_minus(Decimal('1E-1007'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004617 Decimal('0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004618 >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004619 Decimal('-1.00000004')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004620 >>> c.next_minus(Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004621 Decimal('9.99999999E+999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004622 """
4623 return a.next_minus(context=self)
4624
4625 def next_plus(self, a):
4626 """Returns the smallest representable number larger than a.
4627
4628 >>> c = ExtendedContext.copy()
4629 >>> c.Emin = -999
4630 >>> c.Emax = 999
4631 >>> ExtendedContext.next_plus(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004632 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004633 >>> c.next_plus(Decimal('-1E-1007'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004634 Decimal('-0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004635 >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004636 Decimal('-1.00000002')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004637 >>> c.next_plus(Decimal('-Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004638 Decimal('-9.99999999E+999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004639 """
4640 return a.next_plus(context=self)
4641
4642 def next_toward(self, a, b):
4643 """Returns the number closest to a, in direction towards b.
4644
4645 The result is the closest representable number from the first
4646 operand (but not the first operand) that is in the direction
4647 towards the second operand, unless the operands have the same
4648 value.
4649
4650 >>> c = ExtendedContext.copy()
4651 >>> c.Emin = -999
4652 >>> c.Emax = 999
4653 >>> c.next_toward(Decimal('1'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004654 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004655 >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004656 Decimal('-0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004657 >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004658 Decimal('-1.00000002')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004659 >>> c.next_toward(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004660 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004661 >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004662 Decimal('0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004663 >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004664 Decimal('-1.00000004')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004665 >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004666 Decimal('-0.00')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004667 """
4668 return a.next_toward(b, context=self)
4669
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004670 def normalize(self, a):
Raymond Hettingere0f15812004-07-05 05:36:39 +00004671 """normalize reduces an operand to its simplest form.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004672
4673 Essentially a plus operation with all trailing zeros removed from the
4674 result.
4675
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004676 >>> ExtendedContext.normalize(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004677 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004678 >>> ExtendedContext.normalize(Decimal('-2.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004679 Decimal('-2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004680 >>> ExtendedContext.normalize(Decimal('1.200'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004681 Decimal('1.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004682 >>> ExtendedContext.normalize(Decimal('-120'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004683 Decimal('-1.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004684 >>> ExtendedContext.normalize(Decimal('120.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004685 Decimal('1.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004686 >>> ExtendedContext.normalize(Decimal('0.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004687 Decimal('0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004688 """
4689 return a.normalize(context=self)
4690
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004691 def number_class(self, a):
4692 """Returns an indication of the class of the operand.
4693
4694 The class is one of the following strings:
4695 -sNaN
4696 -NaN
4697 -Infinity
4698 -Normal
4699 -Subnormal
4700 -Zero
4701 +Zero
4702 +Subnormal
4703 +Normal
4704 +Infinity
4705
4706 >>> c = Context(ExtendedContext)
4707 >>> c.Emin = -999
4708 >>> c.Emax = 999
4709 >>> c.number_class(Decimal('Infinity'))
4710 '+Infinity'
4711 >>> c.number_class(Decimal('1E-10'))
4712 '+Normal'
4713 >>> c.number_class(Decimal('2.50'))
4714 '+Normal'
4715 >>> c.number_class(Decimal('0.1E-999'))
4716 '+Subnormal'
4717 >>> c.number_class(Decimal('0'))
4718 '+Zero'
4719 >>> c.number_class(Decimal('-0'))
4720 '-Zero'
4721 >>> c.number_class(Decimal('-0.1E-999'))
4722 '-Subnormal'
4723 >>> c.number_class(Decimal('-1E-10'))
4724 '-Normal'
4725 >>> c.number_class(Decimal('-2.50'))
4726 '-Normal'
4727 >>> c.number_class(Decimal('-Infinity'))
4728 '-Infinity'
4729 >>> c.number_class(Decimal('NaN'))
4730 'NaN'
4731 >>> c.number_class(Decimal('-NaN'))
4732 'NaN'
4733 >>> c.number_class(Decimal('sNaN'))
4734 'sNaN'
4735 """
4736 return a.number_class(context=self)
4737
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004738 def plus(self, a):
4739 """Plus corresponds to unary prefix plus in Python.
4740
4741 The operation is evaluated using the same rules as add; the
4742 operation plus(a) is calculated as add('0', a) where the '0'
4743 has the same exponent as the operand.
4744
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004745 >>> ExtendedContext.plus(Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004746 Decimal('1.3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004747 >>> ExtendedContext.plus(Decimal('-1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004748 Decimal('-1.3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004749 """
4750 return a.__pos__(context=self)
4751
4752 def power(self, a, b, modulo=None):
4753 """Raises a to the power of b, to modulo if given.
4754
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004755 With two arguments, compute a**b. If a is negative then b
4756 must be integral. The result will be inexact unless b is
4757 integral and the result is finite and can be expressed exactly
4758 in 'precision' digits.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004759
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004760 With three arguments, compute (a**b) % modulo. For the
4761 three argument form, the following restrictions on the
4762 arguments hold:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004763
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004764 - all three arguments must be integral
4765 - b must be nonnegative
4766 - at least one of a or b must be nonzero
4767 - modulo must be nonzero and have at most 'precision' digits
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004768
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004769 The result of pow(a, b, modulo) is identical to the result
4770 that would be obtained by computing (a**b) % modulo with
4771 unbounded precision, but is computed more efficiently. It is
4772 always exact.
4773
4774 >>> c = ExtendedContext.copy()
4775 >>> c.Emin = -999
4776 >>> c.Emax = 999
4777 >>> c.power(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004778 Decimal('8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004779 >>> c.power(Decimal('-2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004780 Decimal('-8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004781 >>> c.power(Decimal('2'), Decimal('-3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004782 Decimal('0.125')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004783 >>> c.power(Decimal('1.7'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004784 Decimal('69.7575744')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004785 >>> c.power(Decimal('10'), Decimal('0.301029996'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004786 Decimal('2.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004787 >>> c.power(Decimal('Infinity'), Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004788 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004789 >>> c.power(Decimal('Infinity'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004790 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004791 >>> c.power(Decimal('Infinity'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004792 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004793 >>> c.power(Decimal('-Infinity'), Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004794 Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004795 >>> c.power(Decimal('-Infinity'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004796 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004797 >>> c.power(Decimal('-Infinity'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004798 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004799 >>> c.power(Decimal('-Infinity'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004800 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004801 >>> c.power(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004802 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004803
4804 >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004805 Decimal('11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004806 >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004807 Decimal('-11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004808 >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004809 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004810 >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004811 Decimal('11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004812 >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004813 Decimal('11729830')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004814 >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004815 Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004816 >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004817 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004818 """
4819 return a.__pow__(b, modulo, context=self)
4820
4821 def quantize(self, a, b):
Guido van Rossumd8faa362007-04-27 19:54:29 +00004822 """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004823
4824 The coefficient of the result is derived from that of the left-hand
Guido van Rossumd8faa362007-04-27 19:54:29 +00004825 operand. It may be rounded using the current rounding setting (if the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004826 exponent is being increased), multiplied by a positive power of ten (if
4827 the exponent is being decreased), or is unchanged (if the exponent is
4828 already equal to that of the right-hand operand).
4829
4830 Unlike other operations, if the length of the coefficient after the
4831 quantize operation would be greater than precision then an Invalid
Guido van Rossumd8faa362007-04-27 19:54:29 +00004832 operation condition is raised. This guarantees that, unless there is
4833 an error condition, the exponent of the result of a quantize is always
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004834 equal to that of the right-hand operand.
4835
4836 Also unlike other operations, quantize will never raise Underflow, even
4837 if the result is subnormal and inexact.
4838
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004839 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004840 Decimal('2.170')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004841 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004842 Decimal('2.17')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004843 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004844 Decimal('2.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004845 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004846 Decimal('2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004847 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004848 Decimal('0E+1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004849 >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004850 Decimal('-Infinity')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004851 >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004852 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004853 >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004854 Decimal('-0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004855 >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004856 Decimal('-0E+5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004857 >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004858 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004859 >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004860 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004861 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004862 Decimal('217.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004863 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004864 Decimal('217')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004865 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004866 Decimal('2.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004867 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004868 Decimal('2E+2')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004869 """
4870 return a.quantize(b, context=self)
4871
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004872 def radix(self):
4873 """Just returns 10, as this is Decimal, :)
4874
4875 >>> ExtendedContext.radix()
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004876 Decimal('10')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004877 """
4878 return Decimal(10)
4879
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004880 def remainder(self, a, b):
4881 """Returns the remainder from integer division.
4882
4883 The result is the residue of the dividend after the operation of
Guido van Rossumd8faa362007-04-27 19:54:29 +00004884 calculating integer division as described for divide-integer, rounded
4885 to precision digits if necessary. The sign of the result, if
4886 non-zero, is the same as that of the original dividend.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004887
4888 This operation will fail under the same conditions as integer division
4889 (that is, if integer division on the same two operands would fail, the
4890 remainder cannot be calculated).
4891
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004892 >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004893 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004894 >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004895 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004896 >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004897 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004898 >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004899 Decimal('0.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004900 >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004901 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004902 >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004903 Decimal('1.0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004904 """
4905 return a.__mod__(b, context=self)
4906
4907 def remainder_near(self, a, b):
4908 """Returns to be "a - b * n", where n is the integer nearest the exact
4909 value of "x / b" (if two integers are equally near then the even one
Guido van Rossumd8faa362007-04-27 19:54:29 +00004910 is chosen). If the result is equal to 0 then its sign will be the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004911 sign of a.
4912
4913 This operation will fail under the same conditions as integer division
4914 (that is, if integer division on the same two operands would fail, the
4915 remainder cannot be calculated).
4916
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004917 >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004918 Decimal('-0.9')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004919 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004920 Decimal('-2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004921 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004922 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004923 >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004924 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004925 >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004926 Decimal('0.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004927 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004928 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004929 >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004930 Decimal('-0.3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004931 """
4932 return a.remainder_near(b, context=self)
4933
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004934 def rotate(self, a, b):
4935 """Returns a rotated copy of a, b times.
4936
4937 The coefficient of the result is a rotated copy of the digits in
4938 the coefficient of the first operand. The number of places of
4939 rotation is taken from the absolute value of the second operand,
4940 with the rotation being to the left if the second operand is
4941 positive or to the right otherwise.
4942
4943 >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004944 Decimal('400000003')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004945 >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004946 Decimal('12')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004947 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004948 Decimal('891234567')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004949 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004950 Decimal('123456789')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004951 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004952 Decimal('345678912')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004953 """
4954 return a.rotate(b, context=self)
4955
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004956 def same_quantum(self, a, b):
4957 """Returns True if the two operands have the same exponent.
4958
4959 The result is never affected by either the sign or the coefficient of
4960 either operand.
4961
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004962 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004963 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004964 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004965 True
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004966 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004967 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004968 >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004969 True
4970 """
4971 return a.same_quantum(b)
4972
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004973 def scaleb (self, a, b):
4974 """Returns the first operand after adding the second value its exp.
4975
4976 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004977 Decimal('0.0750')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004978 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004979 Decimal('7.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004980 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004981 Decimal('7.50E+3')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004982 """
4983 return a.scaleb (b, context=self)
4984
4985 def shift(self, a, b):
4986 """Returns a shifted copy of a, b times.
4987
4988 The coefficient of the result is a shifted copy of the digits
4989 in the coefficient of the first operand. The number of places
4990 to shift is taken from the absolute value of the second operand,
4991 with the shift being to the left if the second operand is
4992 positive or to the right otherwise. Digits shifted into the
4993 coefficient are zeros.
4994
4995 >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004996 Decimal('400000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004997 >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004998 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004999 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005000 Decimal('1234567')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005001 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005002 Decimal('123456789')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005003 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005004 Decimal('345678900')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005005 """
5006 return a.shift(b, context=self)
5007
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005008 def sqrt(self, a):
Guido van Rossumd8faa362007-04-27 19:54:29 +00005009 """Square root of a non-negative number to context precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005010
5011 If the result must be inexact, it is rounded using the round-half-even
5012 algorithm.
5013
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005014 >>> ExtendedContext.sqrt(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005015 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005016 >>> ExtendedContext.sqrt(Decimal('-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005017 Decimal('-0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005018 >>> ExtendedContext.sqrt(Decimal('0.39'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005019 Decimal('0.624499800')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005020 >>> ExtendedContext.sqrt(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005021 Decimal('10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005022 >>> ExtendedContext.sqrt(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005023 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005024 >>> ExtendedContext.sqrt(Decimal('1.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005025 Decimal('1.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005026 >>> ExtendedContext.sqrt(Decimal('1.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005027 Decimal('1.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005028 >>> ExtendedContext.sqrt(Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005029 Decimal('2.64575131')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005030 >>> ExtendedContext.sqrt(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005031 Decimal('3.16227766')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005032 >>> ExtendedContext.prec
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005033 9
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005034 """
5035 return a.sqrt(context=self)
5036
5037 def subtract(self, a, b):
Georg Brandlf33d01d2005-08-22 19:35:18 +00005038 """Return the difference between the two operands.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005039
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005040 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005041 Decimal('0.23')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005042 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005043 Decimal('0.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005044 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005045 Decimal('-0.77')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005046 """
5047 return a.__sub__(b, context=self)
5048
5049 def to_eng_string(self, a):
5050 """Converts a number to a string, using scientific notation.
5051
5052 The operation is not affected by the context.
5053 """
5054 return a.to_eng_string(context=self)
5055
5056 def to_sci_string(self, a):
5057 """Converts a number to a string, using scientific notation.
5058
5059 The operation is not affected by the context.
5060 """
5061 return a.__str__(context=self)
5062
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005063 def to_integral_exact(self, a):
5064 """Rounds to an integer.
5065
5066 When the operand has a negative exponent, the result is the same
5067 as using the quantize() operation using the given operand as the
5068 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
5069 of the operand as the precision setting; Inexact and Rounded flags
5070 are allowed in this operation. The rounding mode is taken from the
5071 context.
5072
5073 >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005074 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005075 >>> ExtendedContext.to_integral_exact(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005076 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005077 >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005078 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005079 >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005080 Decimal('102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005081 >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005082 Decimal('-102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005083 >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005084 Decimal('1.0E+6')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005085 >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005086 Decimal('7.89E+77')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005087 >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005088 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005089 """
5090 return a.to_integral_exact(context=self)
5091
5092 def to_integral_value(self, a):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005093 """Rounds to an integer.
5094
5095 When the operand has a negative exponent, the result is the same
5096 as using the quantize() operation using the given operand as the
5097 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
5098 of the operand as the precision setting, except that no flags will
Guido van Rossumd8faa362007-04-27 19:54:29 +00005099 be set. The rounding mode is taken from the context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005100
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005101 >>> ExtendedContext.to_integral_value(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005102 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005103 >>> ExtendedContext.to_integral_value(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005104 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005105 >>> ExtendedContext.to_integral_value(Decimal('100.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005106 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005107 >>> ExtendedContext.to_integral_value(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005108 Decimal('102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005109 >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005110 Decimal('-102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005111 >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005112 Decimal('1.0E+6')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005113 >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005114 Decimal('7.89E+77')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005115 >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005116 Decimal('-Infinity')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005117 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005118 return a.to_integral_value(context=self)
5119
5120 # the method name changed, but we provide also the old one, for compatibility
5121 to_integral = to_integral_value
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005122
5123class _WorkRep(object):
5124 __slots__ = ('sign','int','exp')
Raymond Hettinger17931de2004-10-27 06:21:46 +00005125 # sign: 0 or 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005126 # int: int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005127 # exp: None, int, or string
5128
5129 def __init__(self, value=None):
5130 if value is None:
5131 self.sign = None
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005132 self.int = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005133 self.exp = None
Raymond Hettinger17931de2004-10-27 06:21:46 +00005134 elif isinstance(value, Decimal):
5135 self.sign = value._sign
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005136 self.int = int(value._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005137 self.exp = value._exp
Raymond Hettinger17931de2004-10-27 06:21:46 +00005138 else:
5139 # assert isinstance(value, tuple)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005140 self.sign = value[0]
5141 self.int = value[1]
5142 self.exp = value[2]
5143
5144 def __repr__(self):
5145 return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
5146
5147 __str__ = __repr__
5148
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005149
5150
Christian Heimes2c181612007-12-17 20:04:13 +00005151def _normalize(op1, op2, prec = 0):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005152 """Normalizes op1, op2 to have the same exp and length of coefficient.
5153
5154 Done during addition.
5155 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005156 if op1.exp < op2.exp:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005157 tmp = op2
5158 other = op1
5159 else:
5160 tmp = op1
5161 other = op2
5162
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005163 # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
5164 # Then adding 10**exp to tmp has the same effect (after rounding)
5165 # as adding any positive quantity smaller than 10**exp; similarly
5166 # for subtraction. So if other is smaller than 10**exp we replace
5167 # it with 10**exp. This avoids tmp.exp - other.exp getting too large.
Christian Heimes2c181612007-12-17 20:04:13 +00005168 tmp_len = len(str(tmp.int))
5169 other_len = len(str(other.int))
5170 exp = tmp.exp + min(-1, tmp_len - prec - 2)
5171 if other_len + other.exp - 1 < exp:
5172 other.int = 1
5173 other.exp = exp
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005174
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005175 tmp.int *= 10 ** (tmp.exp - other.exp)
5176 tmp.exp = other.exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005177 return op1, op2
5178
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005179##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005180
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005181# This function from Tim Peters was taken from here:
5182# http://mail.python.org/pipermail/python-list/1999-July/007758.html
5183# The correction being in the function definition is for speed, and
5184# the whole function is not resolved with math.log because of avoiding
5185# the use of floats.
5186def _nbits(n, correction = {
5187 '0': 4, '1': 3, '2': 2, '3': 2,
5188 '4': 1, '5': 1, '6': 1, '7': 1,
5189 '8': 0, '9': 0, 'a': 0, 'b': 0,
5190 'c': 0, 'd': 0, 'e': 0, 'f': 0}):
5191 """Number of bits in binary representation of the positive integer n,
5192 or 0 if n == 0.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005193 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005194 if n < 0:
5195 raise ValueError("The argument to _nbits should be nonnegative.")
5196 hex_n = "%x" % n
5197 return 4*len(hex_n) - correction[hex_n[0]]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005198
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005199def _sqrt_nearest(n, a):
5200 """Closest integer to the square root of the positive integer n. a is
5201 an initial approximation to the square root. Any positive integer
5202 will do for a, but the closer a is to the square root of n the
5203 faster convergence will be.
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005204
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005205 """
5206 if n <= 0 or a <= 0:
5207 raise ValueError("Both arguments to _sqrt_nearest should be positive.")
5208
5209 b=0
5210 while a != b:
5211 b, a = a, a--n//a>>1
5212 return a
5213
5214def _rshift_nearest(x, shift):
5215 """Given an integer x and a nonnegative integer shift, return closest
5216 integer to x / 2**shift; use round-to-even in case of a tie.
5217
5218 """
5219 b, q = 1 << shift, x >> shift
5220 return q + (2*(x & (b-1)) + (q&1) > b)
5221
5222def _div_nearest(a, b):
5223 """Closest integer to a/b, a and b positive integers; rounds to even
5224 in the case of a tie.
5225
5226 """
5227 q, r = divmod(a, b)
5228 return q + (2*r + (q&1) > b)
5229
5230def _ilog(x, M, L = 8):
5231 """Integer approximation to M*log(x/M), with absolute error boundable
5232 in terms only of x/M.
5233
5234 Given positive integers x and M, return an integer approximation to
5235 M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference
5236 between the approximation and the exact result is at most 22. For
5237 L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In
5238 both cases these are upper bounds on the error; it will usually be
5239 much smaller."""
5240
5241 # The basic algorithm is the following: let log1p be the function
5242 # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use
5243 # the reduction
5244 #
5245 # log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
5246 #
5247 # repeatedly until the argument to log1p is small (< 2**-L in
5248 # absolute value). For small y we can use the Taylor series
5249 # expansion
5250 #
5251 # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
5252 #
5253 # truncating at T such that y**T is small enough. The whole
5254 # computation is carried out in a form of fixed-point arithmetic,
5255 # with a real number z being represented by an integer
5256 # approximation to z*M. To avoid loss of precision, the y below
5257 # is actually an integer approximation to 2**R*y*M, where R is the
5258 # number of reductions performed so far.
5259
5260 y = x-M
5261 # argument reduction; R = number of reductions performed
5262 R = 0
5263 while (R <= L and abs(y) << L-R >= M or
5264 R > L and abs(y) >> R-L >= M):
5265 y = _div_nearest((M*y) << 1,
5266 M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
5267 R += 1
5268
5269 # Taylor series with T terms
5270 T = -int(-10*len(str(M))//(3*L))
5271 yshift = _rshift_nearest(y, R)
5272 w = _div_nearest(M, T)
5273 for k in range(T-1, 0, -1):
5274 w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
5275
5276 return _div_nearest(w*y, M)
5277
5278def _dlog10(c, e, p):
5279 """Given integers c, e and p with c > 0, p >= 0, compute an integer
5280 approximation to 10**p * log10(c*10**e), with an absolute error of
5281 at most 1. Assumes that c*10**e is not exactly 1."""
5282
5283 # increase precision by 2; compensate for this by dividing
5284 # final result by 100
5285 p += 2
5286
5287 # write c*10**e as d*10**f with either:
5288 # f >= 0 and 1 <= d <= 10, or
5289 # f <= 0 and 0.1 <= d <= 1.
5290 # Thus for c*10**e close to 1, f = 0
5291 l = len(str(c))
5292 f = e+l - (e+l >= 1)
5293
5294 if p > 0:
5295 M = 10**p
5296 k = e+p-f
5297 if k >= 0:
5298 c *= 10**k
5299 else:
5300 c = _div_nearest(c, 10**-k)
5301
5302 log_d = _ilog(c, M) # error < 5 + 22 = 27
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005303 log_10 = _log10_digits(p) # error < 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005304 log_d = _div_nearest(log_d*M, log_10)
5305 log_tenpower = f*M # exact
5306 else:
5307 log_d = 0 # error < 2.31
Neal Norwitz2f99b242008-08-24 05:48:10 +00005308 log_tenpower = _div_nearest(f, 10**-p) # error < 0.5
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005309
5310 return _div_nearest(log_tenpower+log_d, 100)
5311
5312def _dlog(c, e, p):
5313 """Given integers c, e and p with c > 0, compute an integer
5314 approximation to 10**p * log(c*10**e), with an absolute error of
5315 at most 1. Assumes that c*10**e is not exactly 1."""
5316
5317 # Increase precision by 2. The precision increase is compensated
5318 # for at the end with a division by 100.
5319 p += 2
5320
5321 # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
5322 # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e)
5323 # as 10**p * log(d) + 10**p*f * log(10).
5324 l = len(str(c))
5325 f = e+l - (e+l >= 1)
5326
5327 # compute approximation to 10**p*log(d), with error < 27
5328 if p > 0:
5329 k = e+p-f
5330 if k >= 0:
5331 c *= 10**k
5332 else:
5333 c = _div_nearest(c, 10**-k) # error of <= 0.5 in c
5334
5335 # _ilog magnifies existing error in c by a factor of at most 10
5336 log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
5337 else:
5338 # p <= 0: just approximate the whole thing by 0; error < 2.31
5339 log_d = 0
5340
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005341 # compute approximation to f*10**p*log(10), with error < 11.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005342 if f:
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005343 extra = len(str(abs(f)))-1
5344 if p + extra >= 0:
5345 # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
5346 # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
5347 f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005348 else:
5349 f_log_ten = 0
5350 else:
5351 f_log_ten = 0
5352
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005353 # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005354 return _div_nearest(f_log_ten + log_d, 100)
5355
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005356class _Log10Memoize(object):
5357 """Class to compute, store, and allow retrieval of, digits of the
5358 constant log(10) = 2.302585.... This constant is needed by
5359 Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
5360 def __init__(self):
5361 self.digits = "23025850929940456840179914546843642076011014886"
5362
5363 def getdigits(self, p):
5364 """Given an integer p >= 0, return floor(10**p)*log(10).
5365
5366 For example, self.getdigits(3) returns 2302.
5367 """
5368 # digits are stored as a string, for quick conversion to
5369 # integer in the case that we've already computed enough
5370 # digits; the stored digits should always be correct
5371 # (truncated, not rounded to nearest).
5372 if p < 0:
5373 raise ValueError("p should be nonnegative")
5374
5375 if p >= len(self.digits):
5376 # compute p+3, p+6, p+9, ... digits; continue until at
5377 # least one of the extra digits is nonzero
5378 extra = 3
5379 while True:
5380 # compute p+extra digits, correct to within 1ulp
5381 M = 10**(p+extra+2)
5382 digits = str(_div_nearest(_ilog(10*M, M), 100))
5383 if digits[-extra:] != '0'*extra:
5384 break
5385 extra += 3
5386 # keep all reliable digits so far; remove trailing zeros
5387 # and next nonzero digit
5388 self.digits = digits.rstrip('0')[:-1]
5389 return int(self.digits[:p+1])
5390
5391_log10_digits = _Log10Memoize().getdigits
5392
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005393def _iexp(x, M, L=8):
5394 """Given integers x and M, M > 0, such that x/M is small in absolute
5395 value, compute an integer approximation to M*exp(x/M). For 0 <=
5396 x/M <= 2.4, the absolute error in the result is bounded by 60 (and
5397 is usually much smaller)."""
5398
5399 # Algorithm: to compute exp(z) for a real number z, first divide z
5400 # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then
5401 # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
5402 # series
5403 #
5404 # expm1(x) = x + x**2/2! + x**3/3! + ...
5405 #
5406 # Now use the identity
5407 #
5408 # expm1(2x) = expm1(x)*(expm1(x)+2)
5409 #
5410 # R times to compute the sequence expm1(z/2**R),
5411 # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
5412
5413 # Find R such that x/2**R/M <= 2**-L
5414 R = _nbits((x<<L)//M)
5415
5416 # Taylor series. (2**L)**T > M
5417 T = -int(-10*len(str(M))//(3*L))
5418 y = _div_nearest(x, T)
5419 Mshift = M<<R
5420 for i in range(T-1, 0, -1):
5421 y = _div_nearest(x*(Mshift + y), Mshift * i)
5422
5423 # Expansion
5424 for k in range(R-1, -1, -1):
5425 Mshift = M<<(k+2)
5426 y = _div_nearest(y*(y+Mshift), Mshift)
5427
5428 return M+y
5429
5430def _dexp(c, e, p):
5431 """Compute an approximation to exp(c*10**e), with p decimal places of
5432 precision.
5433
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005434 Returns integers d, f such that:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005435
5436 10**(p-1) <= d <= 10**p, and
5437 (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
5438
5439 In other words, d*10**f is an approximation to exp(c*10**e) with p
5440 digits of precision, and with an error in d of at most 1. This is
5441 almost, but not quite, the same as the error being < 1ulp: when d
5442 = 10**(p-1) the error could be up to 10 ulp."""
5443
5444 # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
5445 p += 2
5446
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005447 # compute log(10) with extra precision = adjusted exponent of c*10**e
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005448 extra = max(0, e + len(str(c)) - 1)
5449 q = p + extra
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005450
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005451 # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005452 # rounding down
5453 shift = e+q
5454 if shift >= 0:
5455 cshift = c*10**shift
5456 else:
5457 cshift = c//10**-shift
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005458 quot, rem = divmod(cshift, _log10_digits(q))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005459
5460 # reduce remainder back to original precision
5461 rem = _div_nearest(rem, 10**extra)
5462
5463 # error in result of _iexp < 120; error after division < 0.62
5464 return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
5465
5466def _dpower(xc, xe, yc, ye, p):
5467 """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
5468 y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that:
5469
5470 10**(p-1) <= c <= 10**p, and
5471 (c-1)*10**e < x**y < (c+1)*10**e
5472
5473 in other words, c*10**e is an approximation to x**y with p digits
5474 of precision, and with an error in c of at most 1. (This is
5475 almost, but not quite, the same as the error being < 1ulp: when c
5476 == 10**(p-1) we can only guarantee error < 10ulp.)
5477
5478 We assume that: x is positive and not equal to 1, and y is nonzero.
5479 """
5480
5481 # Find b such that 10**(b-1) <= |y| <= 10**b
5482 b = len(str(abs(yc))) + ye
5483
5484 # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
5485 lxc = _dlog(xc, xe, p+b+1)
5486
5487 # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
5488 shift = ye-b
5489 if shift >= 0:
5490 pc = lxc*yc*10**shift
5491 else:
5492 pc = _div_nearest(lxc*yc, 10**-shift)
5493
5494 if pc == 0:
5495 # we prefer a result that isn't exactly 1; this makes it
5496 # easier to compute a correctly rounded result in __pow__
5497 if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
5498 coeff, exp = 10**(p-1)+1, 1-p
5499 else:
5500 coeff, exp = 10**p-1, -p
5501 else:
5502 coeff, exp = _dexp(pc, -(p+1), p+1)
5503 coeff = _div_nearest(coeff, 10)
5504 exp += 1
5505
5506 return coeff, exp
5507
5508def _log10_lb(c, correction = {
5509 '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
5510 '6': 23, '7': 16, '8': 10, '9': 5}):
5511 """Compute a lower bound for 100*log10(c) for a positive integer c."""
5512 if c <= 0:
5513 raise ValueError("The argument to _log10_lb should be nonnegative.")
5514 str_c = str(c)
5515 return 100*len(str_c) - correction[str_c[0]]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005516
Guido van Rossumd8faa362007-04-27 19:54:29 +00005517##### Helper Functions ####################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005518
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005519def _convert_other(other, raiseit=False):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005520 """Convert other to Decimal.
5521
5522 Verifies that it's ok to use in an implicit construction.
5523 """
5524 if isinstance(other, Decimal):
5525 return other
Walter Dörwaldaa97f042007-05-03 21:05:51 +00005526 if isinstance(other, int):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005527 return Decimal(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005528 if raiseit:
5529 raise TypeError("Unable to convert %s to Decimal" % other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00005530 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005531
Guido van Rossumd8faa362007-04-27 19:54:29 +00005532##### Setup Specific Contexts ############################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005533
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005534# The default context prototype used by Context()
Raymond Hettingerfed52962004-07-14 15:41:57 +00005535# Is mutable, so that new contexts can have different default values
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005536
5537DefaultContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005538 prec=28, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005539 traps=[DivisionByZero, Overflow, InvalidOperation],
5540 flags=[],
Raymond Hettinger99148e72004-07-14 19:56:56 +00005541 Emax=999999999,
5542 Emin=-999999999,
Raymond Hettingere0f15812004-07-05 05:36:39 +00005543 capitals=1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005544)
5545
5546# Pre-made alternate contexts offered by the specification
5547# Don't change these; the user should be able to select these
5548# contexts and be able to reproduce results from other implementations
5549# of the spec.
5550
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005551BasicContext = Context(
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005552 prec=9, rounding=ROUND_HALF_UP,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005553 traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
5554 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005555)
5556
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005557ExtendedContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005558 prec=9, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005559 traps=[],
5560 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005561)
5562
5563
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005564##### crud for parsing strings #############################################
Christian Heimes23daade02008-02-25 12:39:23 +00005565#
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005566# Regular expression used for parsing numeric strings. Additional
5567# comments:
5568#
5569# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
5570# whitespace. But note that the specification disallows whitespace in
5571# a numeric string.
5572#
5573# 2. For finite numbers (not infinities and NaNs) the body of the
5574# number between the optional sign and the optional exponent must have
5575# at least one decimal digit, possibly after the decimal point. The
Mark Dickinson8d238292009-08-02 10:16:33 +00005576# lookahead expression '(?=\d|\.\d)' checks this.
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005577
5578import re
Benjamin Peterson41181742008-07-02 20:22:54 +00005579_parser = re.compile(r""" # A numeric string consists of:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005580# \s*
Benjamin Peterson41181742008-07-02 20:22:54 +00005581 (?P<sign>[-+])? # an optional sign, followed by either...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005582 (
Mark Dickinson8d238292009-08-02 10:16:33 +00005583 (?=\d|\.\d) # ...a number (with at least one digit)
5584 (?P<int>\d*) # having a (possibly empty) integer part
5585 (\.(?P<frac>\d*))? # followed by an optional fractional part
5586 (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005587 |
Benjamin Peterson41181742008-07-02 20:22:54 +00005588 Inf(inity)? # ...an infinity, or...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005589 |
Benjamin Peterson41181742008-07-02 20:22:54 +00005590 (?P<signal>s)? # ...an (optionally signaling)
5591 NaN # NaN
Mark Dickinson8d238292009-08-02 10:16:33 +00005592 (?P<diag>\d*) # with (possibly empty) diagnostic info.
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005593 )
5594# \s*
Christian Heimesa62da1d2008-01-12 19:39:10 +00005595 \Z
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005596""", re.VERBOSE | re.IGNORECASE).match
5597
Christian Heimescbf3b5c2007-12-03 21:02:03 +00005598_all_zeros = re.compile('0*$').match
5599_exact_half = re.compile('50*$').match
Christian Heimesf16baeb2008-02-29 14:57:44 +00005600
5601##### PEP3101 support functions ##############################################
Mark Dickinson79f52032009-03-17 23:12:51 +00005602# The functions in this section have little to do with the Decimal
5603# class, and could potentially be reused or adapted for other pure
Christian Heimesf16baeb2008-02-29 14:57:44 +00005604# Python numeric classes that want to implement __format__
5605#
5606# A format specifier for Decimal looks like:
5607#
Mark Dickinson79f52032009-03-17 23:12:51 +00005608# [[fill]align][sign][0][minimumwidth][,][.precision][type]
Christian Heimesf16baeb2008-02-29 14:57:44 +00005609
5610_parse_format_specifier_regex = re.compile(r"""\A
5611(?:
5612 (?P<fill>.)?
5613 (?P<align>[<>=^])
5614)?
5615(?P<sign>[-+ ])?
5616(?P<zeropad>0)?
5617(?P<minimumwidth>(?!0)\d+)?
Mark Dickinson79f52032009-03-17 23:12:51 +00005618(?P<thousands_sep>,)?
Christian Heimesf16baeb2008-02-29 14:57:44 +00005619(?:\.(?P<precision>0|(?!0)\d+))?
Mark Dickinson79f52032009-03-17 23:12:51 +00005620(?P<type>[eEfFgGn%])?
Christian Heimesf16baeb2008-02-29 14:57:44 +00005621\Z
5622""", re.VERBOSE)
5623
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005624del re
5625
Mark Dickinson79f52032009-03-17 23:12:51 +00005626# The locale module is only needed for the 'n' format specifier. The
5627# rest of the PEP 3101 code functions quite happily without it, so we
5628# don't care too much if locale isn't present.
5629try:
5630 import locale as _locale
5631except ImportError:
5632 pass
5633
5634def _parse_format_specifier(format_spec, _localeconv=None):
Christian Heimesf16baeb2008-02-29 14:57:44 +00005635 """Parse and validate a format specifier.
5636
5637 Turns a standard numeric format specifier into a dict, with the
5638 following entries:
5639
5640 fill: fill character to pad field to minimum width
5641 align: alignment type, either '<', '>', '=' or '^'
5642 sign: either '+', '-' or ' '
5643 minimumwidth: nonnegative integer giving minimum width
Mark Dickinson79f52032009-03-17 23:12:51 +00005644 zeropad: boolean, indicating whether to pad with zeros
5645 thousands_sep: string to use as thousands separator, or ''
5646 grouping: grouping for thousands separators, in format
5647 used by localeconv
5648 decimal_point: string to use for decimal point
Christian Heimesf16baeb2008-02-29 14:57:44 +00005649 precision: nonnegative integer giving precision, or None
5650 type: one of the characters 'eEfFgG%', or None
Christian Heimesf16baeb2008-02-29 14:57:44 +00005651
5652 """
5653 m = _parse_format_specifier_regex.match(format_spec)
5654 if m is None:
5655 raise ValueError("Invalid format specifier: " + format_spec)
5656
5657 # get the dictionary
5658 format_dict = m.groupdict()
5659
Mark Dickinson79f52032009-03-17 23:12:51 +00005660 # zeropad; defaults for fill and alignment. If zero padding
5661 # is requested, the fill and align fields should be absent.
Christian Heimesf16baeb2008-02-29 14:57:44 +00005662 fill = format_dict['fill']
5663 align = format_dict['align']
Mark Dickinson79f52032009-03-17 23:12:51 +00005664 format_dict['zeropad'] = (format_dict['zeropad'] is not None)
5665 if format_dict['zeropad']:
5666 if fill is not None:
Christian Heimesf16baeb2008-02-29 14:57:44 +00005667 raise ValueError("Fill character conflicts with '0'"
5668 " in format specifier: " + format_spec)
Mark Dickinson79f52032009-03-17 23:12:51 +00005669 if align is not None:
Christian Heimesf16baeb2008-02-29 14:57:44 +00005670 raise ValueError("Alignment conflicts with '0' in "
5671 "format specifier: " + format_spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00005672 format_dict['fill'] = fill or ' '
5673 format_dict['align'] = align or '<'
5674
Mark Dickinson79f52032009-03-17 23:12:51 +00005675 # default sign handling: '-' for negative, '' for positive
Christian Heimesf16baeb2008-02-29 14:57:44 +00005676 if format_dict['sign'] is None:
5677 format_dict['sign'] = '-'
5678
Christian Heimesf16baeb2008-02-29 14:57:44 +00005679 # minimumwidth defaults to 0; precision remains None if not given
5680 format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
5681 if format_dict['precision'] is not None:
5682 format_dict['precision'] = int(format_dict['precision'])
5683
5684 # if format type is 'g' or 'G' then a precision of 0 makes little
5685 # sense; convert it to 1. Same if format type is unspecified.
5686 if format_dict['precision'] == 0:
Mark Dickinsond496d302009-09-07 16:23:26 +00005687 if format_dict['type'] is None or format_dict['type'] in 'gG':
Christian Heimesf16baeb2008-02-29 14:57:44 +00005688 format_dict['precision'] = 1
5689
Mark Dickinson79f52032009-03-17 23:12:51 +00005690 # determine thousands separator, grouping, and decimal separator, and
5691 # add appropriate entries to format_dict
5692 if format_dict['type'] == 'n':
5693 # apart from separators, 'n' behaves just like 'g'
5694 format_dict['type'] = 'g'
5695 if _localeconv is None:
5696 _localeconv = _locale.localeconv()
5697 if format_dict['thousands_sep'] is not None:
5698 raise ValueError("Explicit thousands separator conflicts with "
5699 "'n' type in format specifier: " + format_spec)
5700 format_dict['thousands_sep'] = _localeconv['thousands_sep']
5701 format_dict['grouping'] = _localeconv['grouping']
5702 format_dict['decimal_point'] = _localeconv['decimal_point']
5703 else:
5704 if format_dict['thousands_sep'] is None:
5705 format_dict['thousands_sep'] = ''
5706 format_dict['grouping'] = [3, 0]
5707 format_dict['decimal_point'] = '.'
Christian Heimesf16baeb2008-02-29 14:57:44 +00005708
5709 return format_dict
5710
Mark Dickinson79f52032009-03-17 23:12:51 +00005711def _format_align(sign, body, spec):
5712 """Given an unpadded, non-aligned numeric string 'body' and sign
5713 string 'sign', add padding and aligment conforming to the given
5714 format specifier dictionary 'spec' (as produced by
5715 parse_format_specifier).
Christian Heimesf16baeb2008-02-29 14:57:44 +00005716
5717 """
Christian Heimesf16baeb2008-02-29 14:57:44 +00005718 # how much extra space do we have to play with?
Mark Dickinson79f52032009-03-17 23:12:51 +00005719 minimumwidth = spec['minimumwidth']
5720 fill = spec['fill']
5721 padding = fill*(minimumwidth - len(sign) - len(body))
Christian Heimesf16baeb2008-02-29 14:57:44 +00005722
Mark Dickinson79f52032009-03-17 23:12:51 +00005723 align = spec['align']
Christian Heimesf16baeb2008-02-29 14:57:44 +00005724 if align == '<':
Christian Heimesf16baeb2008-02-29 14:57:44 +00005725 result = sign + body + padding
Mark Dickinsonad416342009-03-17 18:10:15 +00005726 elif align == '>':
5727 result = padding + sign + body
Christian Heimesf16baeb2008-02-29 14:57:44 +00005728 elif align == '=':
5729 result = sign + padding + body
Mark Dickinson79f52032009-03-17 23:12:51 +00005730 elif align == '^':
Christian Heimesf16baeb2008-02-29 14:57:44 +00005731 half = len(padding)//2
5732 result = padding[:half] + sign + body + padding[half:]
Mark Dickinson79f52032009-03-17 23:12:51 +00005733 else:
5734 raise ValueError('Unrecognised alignment field')
Christian Heimesf16baeb2008-02-29 14:57:44 +00005735
Christian Heimesf16baeb2008-02-29 14:57:44 +00005736 return result
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005737
Mark Dickinson79f52032009-03-17 23:12:51 +00005738def _group_lengths(grouping):
5739 """Convert a localeconv-style grouping into a (possibly infinite)
5740 iterable of integers representing group lengths.
5741
5742 """
5743 # The result from localeconv()['grouping'], and the input to this
5744 # function, should be a list of integers in one of the
5745 # following three forms:
5746 #
5747 # (1) an empty list, or
5748 # (2) nonempty list of positive integers + [0]
5749 # (3) list of positive integers + [locale.CHAR_MAX], or
5750
5751 from itertools import chain, repeat
5752 if not grouping:
5753 return []
5754 elif grouping[-1] == 0 and len(grouping) >= 2:
5755 return chain(grouping[:-1], repeat(grouping[-2]))
5756 elif grouping[-1] == _locale.CHAR_MAX:
5757 return grouping[:-1]
5758 else:
5759 raise ValueError('unrecognised format for grouping')
5760
5761def _insert_thousands_sep(digits, spec, min_width=1):
5762 """Insert thousands separators into a digit string.
5763
5764 spec is a dictionary whose keys should include 'thousands_sep' and
5765 'grouping'; typically it's the result of parsing the format
5766 specifier using _parse_format_specifier.
5767
5768 The min_width keyword argument gives the minimum length of the
5769 result, which will be padded on the left with zeros if necessary.
5770
5771 If necessary, the zero padding adds an extra '0' on the left to
5772 avoid a leading thousands separator. For example, inserting
5773 commas every three digits in '123456', with min_width=8, gives
5774 '0,123,456', even though that has length 9.
5775
5776 """
5777
5778 sep = spec['thousands_sep']
5779 grouping = spec['grouping']
5780
5781 groups = []
5782 for l in _group_lengths(grouping):
Mark Dickinson79f52032009-03-17 23:12:51 +00005783 if l <= 0:
5784 raise ValueError("group length should be positive")
5785 # max(..., 1) forces at least 1 digit to the left of a separator
5786 l = min(max(len(digits), min_width, 1), l)
5787 groups.append('0'*(l - len(digits)) + digits[-l:])
5788 digits = digits[:-l]
5789 min_width -= l
5790 if not digits and min_width <= 0:
5791 break
Mark Dickinson7303b592009-03-18 08:25:36 +00005792 min_width -= len(sep)
Mark Dickinson79f52032009-03-17 23:12:51 +00005793 else:
5794 l = max(len(digits), min_width, 1)
5795 groups.append('0'*(l - len(digits)) + digits[-l:])
5796 return sep.join(reversed(groups))
5797
5798def _format_sign(is_negative, spec):
5799 """Determine sign character."""
5800
5801 if is_negative:
5802 return '-'
5803 elif spec['sign'] in ' +':
5804 return spec['sign']
5805 else:
5806 return ''
5807
5808def _format_number(is_negative, intpart, fracpart, exp, spec):
5809 """Format a number, given the following data:
5810
5811 is_negative: true if the number is negative, else false
5812 intpart: string of digits that must appear before the decimal point
5813 fracpart: string of digits that must come after the point
5814 exp: exponent, as an integer
5815 spec: dictionary resulting from parsing the format specifier
5816
5817 This function uses the information in spec to:
5818 insert separators (decimal separator and thousands separators)
5819 format the sign
5820 format the exponent
5821 add trailing '%' for the '%' type
5822 zero-pad if necessary
5823 fill and align if necessary
5824 """
5825
5826 sign = _format_sign(is_negative, spec)
5827
5828 if fracpart:
5829 fracpart = spec['decimal_point'] + fracpart
5830
5831 if exp != 0 or spec['type'] in 'eE':
5832 echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
5833 fracpart += "{0}{1:+}".format(echar, exp)
5834 if spec['type'] == '%':
5835 fracpart += '%'
5836
5837 if spec['zeropad']:
5838 min_width = spec['minimumwidth'] - len(fracpart) - len(sign)
5839 else:
5840 min_width = 0
5841 intpart = _insert_thousands_sep(intpart, spec, min_width)
5842
5843 return _format_align(sign, intpart+fracpart, spec)
5844
5845
Guido van Rossumd8faa362007-04-27 19:54:29 +00005846##### Useful Constants (internal use only) ################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005847
Guido van Rossumd8faa362007-04-27 19:54:29 +00005848# Reusable defaults
Mark Dickinson627cf6a2009-01-03 12:11:47 +00005849_Infinity = Decimal('Inf')
5850_NegativeInfinity = Decimal('-Inf')
Mark Dickinsonf9236412009-01-02 23:23:21 +00005851_NaN = Decimal('NaN')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00005852_Zero = Decimal(0)
5853_One = Decimal(1)
5854_NegativeOne = Decimal(-1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005855
Mark Dickinson627cf6a2009-01-03 12:11:47 +00005856# _SignedInfinity[sign] is infinity w/ that sign
5857_SignedInfinity = (_Infinity, _NegativeInfinity)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005858
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005859
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005860
5861if __name__ == '__main__':
5862 import doctest, sys
5863 doctest.testmod(sys.modules[__name__])