blob: 49de53592fc725d5714829ac336319cf863e60e6 [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
Mark Dickinsonaa63c4d2010-06-12 16:37:53 +000034of 0.0; Decimal('1.00') % Decimal('0.1') returns the expected
35Decimal('0.00')).
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000036
37Here are some examples of using the decimal module:
38
39>>> from decimal import *
Raymond Hettingerbd7f76d2004-07-08 00:49:18 +000040>>> setcontext(ExtendedContext)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000041>>> Decimal(0)
Christian Heimes68f5fbe2008-02-14 08:27:37 +000042Decimal('0')
43>>> Decimal('1')
44Decimal('1')
45>>> Decimal('-.0123')
46Decimal('-0.0123')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000047>>> Decimal(123456)
Christian Heimes68f5fbe2008-02-14 08:27:37 +000048Decimal('123456')
49>>> Decimal('123.45e12345678901234567890')
50Decimal('1.2345E+12345678901234567892')
51>>> Decimal('1.33') + Decimal('1.27')
52Decimal('2.60')
53>>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41')
54Decimal('-2.20')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000055>>> dig = Decimal(1)
Guido van Rossum7131f842007-02-09 20:13:25 +000056>>> print(dig / Decimal(3))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000570.333333333
58>>> getcontext().prec = 18
Guido van Rossum7131f842007-02-09 20:13:25 +000059>>> print(dig / Decimal(3))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000600.333333333333333333
Guido van Rossum7131f842007-02-09 20:13:25 +000061>>> print(dig.sqrt())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000621
Guido van Rossum7131f842007-02-09 20:13:25 +000063>>> print(Decimal(3).sqrt())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000641.73205080756887729
Guido van Rossum7131f842007-02-09 20:13:25 +000065>>> print(Decimal(3) ** 123)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000664.85192780976896427E+58
67>>> inf = Decimal(1) / Decimal(0)
Guido van Rossum7131f842007-02-09 20:13:25 +000068>>> print(inf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000069Infinity
70>>> neginf = Decimal(-1) / Decimal(0)
Guido van Rossum7131f842007-02-09 20:13:25 +000071>>> print(neginf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000072-Infinity
Guido van Rossum7131f842007-02-09 20:13:25 +000073>>> print(neginf + inf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000074NaN
Guido van Rossum7131f842007-02-09 20:13:25 +000075>>> print(neginf * inf)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000076-Infinity
Guido van Rossum7131f842007-02-09 20:13:25 +000077>>> print(dig / 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000078Infinity
Raymond Hettingerbf440692004-07-10 14:14:37 +000079>>> getcontext().traps[DivisionByZero] = 1
Guido van Rossum7131f842007-02-09 20:13:25 +000080>>> print(dig / 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000081Traceback (most recent call last):
82 ...
83 ...
84 ...
Guido van Rossum6a2a2a02006-08-26 20:37:44 +000085decimal.DivisionByZero: x / 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000086>>> c = Context()
Raymond Hettingerbf440692004-07-10 14:14:37 +000087>>> c.traps[InvalidOperation] = 0
Guido van Rossum7131f842007-02-09 20:13:25 +000088>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000890
90>>> c.divide(Decimal(0), Decimal(0))
Christian Heimes68f5fbe2008-02-14 08:27:37 +000091Decimal('NaN')
Raymond Hettingerbf440692004-07-10 14:14:37 +000092>>> c.traps[InvalidOperation] = 1
Guido van Rossum7131f842007-02-09 20:13:25 +000093>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000941
Raymond Hettinger5aa478b2004-07-09 10:02:53 +000095>>> c.flags[InvalidOperation] = 0
Guido van Rossum7131f842007-02-09 20:13:25 +000096>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000970
Guido van Rossum7131f842007-02-09 20:13:25 +000098>>> print(c.divide(Decimal(0), Decimal(0)))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000099Traceback (most recent call last):
100 ...
101 ...
102 ...
Guido van Rossum6a2a2a02006-08-26 20:37:44 +0000103decimal.InvalidOperation: 0 / 0
Guido van Rossum7131f842007-02-09 20:13:25 +0000104>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001051
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000106>>> c.flags[InvalidOperation] = 0
Raymond Hettingerbf440692004-07-10 14:14:37 +0000107>>> c.traps[InvalidOperation] = 0
Guido van Rossum7131f842007-02-09 20:13:25 +0000108>>> print(c.divide(Decimal(0), Decimal(0)))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000109NaN
Guido van Rossum7131f842007-02-09 20:13:25 +0000110>>> print(c.flags[InvalidOperation])
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001111
112>>>
113"""
114
115__all__ = [
116 # Two major classes
117 'Decimal', 'Context',
118
119 # Contexts
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +0000120 'DefaultContext', 'BasicContext', 'ExtendedContext',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000121
122 # Exceptions
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +0000123 'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
124 'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000125
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000126 # Constants for use in setting up contexts
127 'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000128 'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000129
130 # Functions for manipulating contexts
Thomas Wouters89f507f2006-12-13 04:49:30 +0000131 'setcontext', 'getcontext', 'localcontext'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000132]
133
Raymond Hettinger960dc362009-04-21 03:43:15 +0000134__version__ = '1.70' # Highest version of the spec this complies with
Raymond Hettinger697ce952010-11-30 20:32:59 +0000135 # See http://speleotrove.com/decimal/
Raymond Hettinger960dc362009-04-21 03:43:15 +0000136
Raymond Hettingereb260842005-06-07 18:52:34 +0000137import copy as _copy
Raymond Hettinger771ed762009-01-03 19:20:32 +0000138import math as _math
Raymond Hettinger82417ca2009-02-03 03:54:28 +0000139import numbers as _numbers
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000140
Christian Heimes25bb7832008-01-11 16:17:00 +0000141try:
142 from collections import namedtuple as _namedtuple
143 DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
144except ImportError:
145 DecimalTuple = lambda *args: args
146
Guido van Rossumd8faa362007-04-27 19:54:29 +0000147# Rounding
Raymond Hettinger0ea241e2004-07-04 13:53:24 +0000148ROUND_DOWN = 'ROUND_DOWN'
149ROUND_HALF_UP = 'ROUND_HALF_UP'
150ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
151ROUND_CEILING = 'ROUND_CEILING'
152ROUND_FLOOR = 'ROUND_FLOOR'
153ROUND_UP = 'ROUND_UP'
154ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000155ROUND_05UP = 'ROUND_05UP'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000156
Guido van Rossumd8faa362007-04-27 19:54:29 +0000157# Errors
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000158
159class DecimalException(ArithmeticError):
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000160 """Base exception class.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000161
162 Used exceptions derive from this.
163 If an exception derives from another exception besides this (such as
164 Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
165 called if the others are present. This isn't actually used for
166 anything, though.
167
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000168 handle -- Called when context._raise_error is called and the
Stefan Krah2eb4a072010-05-19 15:52:31 +0000169 trap_enabler is not set. First argument is self, second is the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000170 context. More arguments can be given, those being after
171 the explanation in _raise_error (For example,
172 context._raise_error(NewError, '(-x)!', self._sign) would
173 call NewError().handle(context, self._sign).)
174
175 To define a new exception, it should be sufficient to have it derive
176 from DecimalException.
177 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000178 def handle(self, context, *args):
179 pass
180
181
182class Clamped(DecimalException):
183 """Exponent of a 0 changed to fit bounds.
184
185 This occurs and signals clamped if the exponent of a result has been
186 altered in order to fit the constraints of a specific concrete
Guido van Rossumd8faa362007-04-27 19:54:29 +0000187 representation. This may occur when the exponent of a zero result would
188 be outside the bounds of a representation, or when a large normal
189 number would have an encoded exponent that cannot be represented. In
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000190 this latter case, the exponent is reduced to fit and the corresponding
191 number of zero digits are appended to the coefficient ("fold-down").
192 """
193
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000194class InvalidOperation(DecimalException):
195 """An invalid operation was performed.
196
197 Various bad things cause this:
198
199 Something creates a signaling NaN
200 -INF + INF
Guido van Rossumd8faa362007-04-27 19:54:29 +0000201 0 * (+-)INF
202 (+-)INF / (+-)INF
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000203 x % 0
204 (+-)INF % x
205 x._rescale( non-integer )
206 sqrt(-x) , x > 0
207 0 ** 0
208 x ** (non-integer)
209 x ** (+-)INF
210 An operand is invalid
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000211
212 The result of the operation after these is a quiet positive NaN,
213 except when the cause is a signaling NaN, in which case the result is
214 also a quiet NaN, but with the original sign, and an optional
215 diagnostic information.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000216 """
217 def handle(self, context, *args):
218 if args:
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000219 ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
220 return ans._fix_nan(context)
Mark Dickinsonf9236412009-01-02 23:23:21 +0000221 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000222
223class ConversionSyntax(InvalidOperation):
224 """Trying to convert badly formed string.
225
226 This occurs and signals invalid-operation if an string is being
227 converted to a number and it does not conform to the numeric string
Guido van Rossumd8faa362007-04-27 19:54:29 +0000228 syntax. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000229 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000230 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000231 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000232
233class DivisionByZero(DecimalException, ZeroDivisionError):
234 """Division by 0.
235
236 This occurs and signals division-by-zero if division of a finite number
237 by zero was attempted (during a divide-integer or divide operation, or a
238 power operation with negative right-hand operand), and the dividend was
239 not zero.
240
241 The result of the operation is [sign,inf], where sign is the exclusive
242 or of the signs of the operands for divide, or is 1 for an odd power of
243 -0, for power.
244 """
245
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000246 def handle(self, context, sign, *args):
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000247 return _SignedInfinity[sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000248
249class DivisionImpossible(InvalidOperation):
250 """Cannot perform the division adequately.
251
252 This occurs and signals invalid-operation if the integer result of a
253 divide-integer or remainder operation had too many digits (would be
Guido van Rossumd8faa362007-04-27 19:54:29 +0000254 longer than precision). The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000255 """
256
257 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000258 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000259
260class DivisionUndefined(InvalidOperation, ZeroDivisionError):
261 """Undefined result of division.
262
263 This occurs and signals invalid-operation if division by zero was
264 attempted (during a divide-integer, divide, or remainder operation), and
Guido van Rossumd8faa362007-04-27 19:54:29 +0000265 the dividend is also zero. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000266 """
267
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000268 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000269 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000270
271class Inexact(DecimalException):
272 """Had to round, losing information.
273
274 This occurs and signals inexact whenever the result of an operation is
275 not exact (that is, it needed to be rounded and any discarded digits
Guido van Rossumd8faa362007-04-27 19:54:29 +0000276 were non-zero), or if an overflow or underflow condition occurs. The
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000277 result in all cases is unchanged.
278
279 The inexact signal may be tested (or trapped) to determine if a given
280 operation (or sequence of operations) was inexact.
281 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000282
283class InvalidContext(InvalidOperation):
284 """Invalid context. Unknown rounding, for example.
285
286 This occurs and signals invalid-operation if an invalid context was
Guido van Rossumd8faa362007-04-27 19:54:29 +0000287 detected during an operation. This can occur if contexts are not checked
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000288 on creation and either the precision exceeds the capability of the
289 underlying concrete representation or an unknown or unsupported rounding
Guido van Rossumd8faa362007-04-27 19:54:29 +0000290 was specified. These aspects of the context need only be checked when
291 the values are required to be used. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000292 """
293
294 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000295 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000296
297class Rounded(DecimalException):
298 """Number got rounded (not necessarily changed during rounding).
299
300 This occurs and signals rounded whenever the result of an operation is
301 rounded (that is, some zero or non-zero digits were discarded from the
Guido van Rossumd8faa362007-04-27 19:54:29 +0000302 coefficient), or if an overflow or underflow condition occurs. The
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000303 result in all cases is unchanged.
304
305 The rounded signal may be tested (or trapped) to determine if a given
306 operation (or sequence of operations) caused a loss of precision.
307 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000308
309class Subnormal(DecimalException):
310 """Exponent < Emin before rounding.
311
312 This occurs and signals subnormal whenever the result of a conversion or
313 operation is subnormal (that is, its adjusted exponent is less than
Guido van Rossumd8faa362007-04-27 19:54:29 +0000314 Emin, before any rounding). The result in all cases is unchanged.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000315
316 The subnormal signal may be tested (or trapped) to determine if a given
317 or operation (or sequence of operations) yielded a subnormal result.
318 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000319
320class Overflow(Inexact, Rounded):
321 """Numerical overflow.
322
323 This occurs and signals overflow if the adjusted exponent of a result
324 (from a conversion or from an operation that is not an attempt to divide
325 by zero), after rounding, would be greater than the largest value that
326 can be handled by the implementation (the value Emax).
327
328 The result depends on the rounding mode:
329
330 For round-half-up and round-half-even (and for round-half-down and
331 round-up, if implemented), the result of the operation is [sign,inf],
Guido van Rossumd8faa362007-04-27 19:54:29 +0000332 where sign is the sign of the intermediate result. For round-down, the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000333 result is the largest finite number that can be represented in the
Guido van Rossumd8faa362007-04-27 19:54:29 +0000334 current precision, with the sign of the intermediate result. For
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000335 round-ceiling, the result is the same as for round-down if the sign of
Guido van Rossumd8faa362007-04-27 19:54:29 +0000336 the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000337 the result is the same as for round-down if the sign of the intermediate
Guido van Rossumd8faa362007-04-27 19:54:29 +0000338 result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000339 will also be raised.
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000340 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000341
342 def handle(self, context, sign, *args):
343 if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000344 ROUND_HALF_DOWN, ROUND_UP):
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000345 return _SignedInfinity[sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000346 if sign == 0:
347 if context.rounding == ROUND_CEILING:
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000348 return _SignedInfinity[sign]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000349 return _dec_from_triple(sign, '9'*context.prec,
350 context.Emax-context.prec+1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000351 if sign == 1:
352 if context.rounding == ROUND_FLOOR:
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000353 return _SignedInfinity[sign]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000354 return _dec_from_triple(sign, '9'*context.prec,
355 context.Emax-context.prec+1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000356
357
358class Underflow(Inexact, Rounded, Subnormal):
359 """Numerical underflow with result rounded to 0.
360
361 This occurs and signals underflow if a result is inexact and the
362 adjusted exponent of the result would be smaller (more negative) than
363 the smallest value that can be handled by the implementation (the value
Guido van Rossumd8faa362007-04-27 19:54:29 +0000364 Emin). That is, the result is both inexact and subnormal.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000365
366 The result after an underflow will be a subnormal number rounded, if
Guido van Rossumd8faa362007-04-27 19:54:29 +0000367 necessary, so that its exponent is not less than Etiny. This may result
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000368 in 0 with the sign of the intermediate result and an exponent of Etiny.
369
370 In all cases, Inexact, Rounded, and Subnormal will also be raised.
371 """
372
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000373# List of public traps and flags
Raymond Hettingerfed52962004-07-14 15:41:57 +0000374_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000375 Underflow, InvalidOperation, Subnormal]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000376
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000377# Map conditions (per the spec) to signals
378_condition_map = {ConversionSyntax:InvalidOperation,
379 DivisionImpossible:InvalidOperation,
380 DivisionUndefined:InvalidOperation,
381 InvalidContext:InvalidOperation}
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000382
Guido van Rossumd8faa362007-04-27 19:54:29 +0000383##### Context Functions ##################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000384
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000385# The getcontext() and setcontext() function manage access to a thread-local
386# current context. Py2.4 offers direct support for thread locals. If that
Georg Brandlf9926402008-06-13 06:32:25 +0000387# is not available, use threading.current_thread() which is slower but will
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000388# work for older Pythons. If threads are not part of the build, create a
389# mock threading object with threading.local() returning the module namespace.
390
391try:
392 import threading
393except ImportError:
394 # Python was compiled without threads; create a mock object instead
395 import sys
Guido van Rossumd8faa362007-04-27 19:54:29 +0000396 class MockThreading(object):
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000397 def local(self, sys=sys):
398 return sys.modules[__name__]
399 threading = MockThreading()
400 del sys, MockThreading
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000401
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000402try:
403 threading.local
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000404
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000405except AttributeError:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000406
Guido van Rossumd8faa362007-04-27 19:54:29 +0000407 # To fix reloading, force it to create a new context
408 # Old contexts have different exceptions in their dicts, making problems.
Georg Brandlf9926402008-06-13 06:32:25 +0000409 if hasattr(threading.current_thread(), '__decimal_context__'):
410 del threading.current_thread().__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000411
412 def setcontext(context):
413 """Set this thread's context to context."""
414 if context in (DefaultContext, BasicContext, ExtendedContext):
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000415 context = context.copy()
Raymond Hettinger61992ef2004-08-06 23:42:16 +0000416 context.clear_flags()
Georg Brandlf9926402008-06-13 06:32:25 +0000417 threading.current_thread().__decimal_context__ = context
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000418
419 def getcontext():
420 """Returns this thread's context.
421
422 If this thread does not yet have a context, returns
423 a new context and sets this thread's context.
424 New contexts are copies of DefaultContext.
425 """
426 try:
Georg Brandlf9926402008-06-13 06:32:25 +0000427 return threading.current_thread().__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000428 except AttributeError:
429 context = Context()
Georg Brandlf9926402008-06-13 06:32:25 +0000430 threading.current_thread().__decimal_context__ = context
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000431 return context
432
433else:
434
435 local = threading.local()
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000436 if hasattr(local, '__decimal_context__'):
437 del local.__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000438
439 def getcontext(_local=local):
440 """Returns this thread's context.
441
442 If this thread does not yet have a context, returns
443 a new context and sets this thread's context.
444 New contexts are copies of DefaultContext.
445 """
446 try:
447 return _local.__decimal_context__
448 except AttributeError:
449 context = Context()
450 _local.__decimal_context__ = context
451 return context
452
453 def setcontext(context, _local=local):
454 """Set this thread's context to context."""
455 if context in (DefaultContext, BasicContext, ExtendedContext):
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000456 context = context.copy()
Raymond Hettinger61992ef2004-08-06 23:42:16 +0000457 context.clear_flags()
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000458 _local.__decimal_context__ = context
459
460 del threading, local # Don't contaminate the namespace
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000461
Thomas Wouters89f507f2006-12-13 04:49:30 +0000462def localcontext(ctx=None):
463 """Return a context manager for a copy of the supplied context
464
465 Uses a copy of the current context if no context is specified
466 The returned context manager creates a local decimal context
467 in a with statement:
468 def sin(x):
469 with localcontext() as ctx:
470 ctx.prec += 2
471 # Rest of sin calculation algorithm
472 # uses a precision 2 greater than normal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000473 return +s # Convert result to normal precision
Thomas Wouters89f507f2006-12-13 04:49:30 +0000474
475 def sin(x):
476 with localcontext(ExtendedContext):
477 # Rest of sin calculation algorithm
478 # uses the Extended Context from the
479 # General Decimal Arithmetic Specification
Guido van Rossumd8faa362007-04-27 19:54:29 +0000480 return +s # Convert result to normal context
Thomas Wouters89f507f2006-12-13 04:49:30 +0000481
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000482 >>> setcontext(DefaultContext)
Guido van Rossum7131f842007-02-09 20:13:25 +0000483 >>> print(getcontext().prec)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000484 28
485 >>> with localcontext():
486 ... ctx = getcontext()
Thomas Wouterscf297e42007-02-23 15:07:44 +0000487 ... ctx.prec += 2
Guido van Rossum7131f842007-02-09 20:13:25 +0000488 ... print(ctx.prec)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000489 ...
Thomas Wouters89f507f2006-12-13 04:49:30 +0000490 30
491 >>> with localcontext(ExtendedContext):
Guido van Rossum7131f842007-02-09 20:13:25 +0000492 ... print(getcontext().prec)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000493 ...
Thomas Wouters89f507f2006-12-13 04:49:30 +0000494 9
Guido van Rossum7131f842007-02-09 20:13:25 +0000495 >>> print(getcontext().prec)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000496 28
497 """
498 if ctx is None: ctx = getcontext()
499 return _ContextManager(ctx)
500
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000501
Guido van Rossumd8faa362007-04-27 19:54:29 +0000502##### Decimal class #######################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000503
Raymond Hettingera0fd8882009-01-20 07:24:44 +0000504# Do not subclass Decimal from numbers.Real and do not register it as such
505# (because Decimals are not interoperable with floats). See the notes in
506# numbers.py for more detail.
507
508class Decimal(object):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000509 """Floating point class for decimal arithmetic."""
510
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000511 __slots__ = ('_exp','_int','_sign', '_is_special')
512 # Generally, the value of the Decimal instance is given by
513 # (-1)**_sign * _int * 10**_exp
514 # Special values are signified by _is_special == True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000515
Raymond Hettingerdab988d2004-10-09 07:10:44 +0000516 # We're immutable, so use __new__ not __init__
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000517 def __new__(cls, value="0", context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000518 """Create a decimal point instance.
519
520 >>> Decimal('3.14') # string input
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000521 Decimal('3.14')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000522 >>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent)
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000523 Decimal('3.14')
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000524 >>> Decimal(314) # int
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000525 Decimal('314')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000526 >>> Decimal(Decimal(314)) # another decimal instance
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000527 Decimal('314')
Christian Heimesa62da1d2008-01-12 19:39:10 +0000528 >>> Decimal(' 3.14 \\n') # leading and trailing whitespace okay
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000529 Decimal('3.14')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000530 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000531
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000532 # Note that the coefficient, self._int, is actually stored as
533 # a string rather than as a tuple of digits. This speeds up
534 # the "digits to integer" and "integer to digits" conversions
535 # that are used in almost every arithmetic operation on
536 # Decimals. This is an internal detail: the as_tuple function
537 # and the Decimal constructor still deal with tuples of
538 # digits.
539
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000540 self = object.__new__(cls)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000541
Christian Heimesd59c64c2007-11-30 19:27:20 +0000542 # From a string
543 # REs insist on real strings, so we can too.
544 if isinstance(value, str):
Christian Heimesa62da1d2008-01-12 19:39:10 +0000545 m = _parser(value.strip())
Christian Heimesd59c64c2007-11-30 19:27:20 +0000546 if m is None:
547 if context is None:
548 context = getcontext()
549 return context._raise_error(ConversionSyntax,
550 "Invalid literal for Decimal: %r" % value)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000551
Christian Heimesd59c64c2007-11-30 19:27:20 +0000552 if m.group('sign') == "-":
553 self._sign = 1
554 else:
555 self._sign = 0
556 intpart = m.group('int')
557 if intpart is not None:
558 # finite number
Mark Dickinson345adc42009-08-02 10:14:23 +0000559 fracpart = m.group('frac') or ''
Christian Heimesd59c64c2007-11-30 19:27:20 +0000560 exp = int(m.group('exp') or '0')
Mark Dickinson345adc42009-08-02 10:14:23 +0000561 self._int = str(int(intpart+fracpart))
562 self._exp = exp - len(fracpart)
Christian Heimesd59c64c2007-11-30 19:27:20 +0000563 self._is_special = False
564 else:
565 diag = m.group('diag')
566 if diag is not None:
567 # NaN
Mark Dickinson345adc42009-08-02 10:14:23 +0000568 self._int = str(int(diag or '0')).lstrip('0')
Christian Heimesd59c64c2007-11-30 19:27:20 +0000569 if m.group('signal'):
570 self._exp = 'N'
571 else:
572 self._exp = 'n'
573 else:
574 # infinity
575 self._int = '0'
576 self._exp = 'F'
577 self._is_special = True
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000578 return self
579
580 # From an integer
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000581 if isinstance(value, int):
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000582 if value >= 0:
583 self._sign = 0
584 else:
585 self._sign = 1
586 self._exp = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000587 self._int = str(abs(value))
Christian Heimesd59c64c2007-11-30 19:27:20 +0000588 self._is_special = False
589 return self
590
591 # From another decimal
592 if isinstance(value, Decimal):
593 self._exp = value._exp
594 self._sign = value._sign
595 self._int = value._int
596 self._is_special = value._is_special
597 return self
598
599 # From an internal working value
600 if isinstance(value, _WorkRep):
601 self._sign = value.sign
602 self._int = str(value.int)
603 self._exp = int(value.exp)
604 self._is_special = False
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000605 return self
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000606
607 # tuple/list conversion (possibly from as_tuple())
608 if isinstance(value, (list,tuple)):
609 if len(value) != 3:
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000610 raise ValueError('Invalid tuple size in creation of Decimal '
611 'from list or tuple. The list or tuple '
612 'should have exactly three elements.')
613 # process sign. The isinstance test rejects floats
614 if not (isinstance(value[0], int) and value[0] in (0,1)):
615 raise ValueError("Invalid sign. The first value in the tuple "
616 "should be an integer; either 0 for a "
617 "positive number or 1 for a negative number.")
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000618 self._sign = value[0]
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000619 if value[2] == 'F':
620 # infinity: value[1] is ignored
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000621 self._int = '0'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000622 self._exp = value[2]
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000623 self._is_special = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000624 else:
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000625 # process and validate the digits in value[1]
626 digits = []
627 for digit in value[1]:
628 if isinstance(digit, int) and 0 <= digit <= 9:
629 # skip leading zeros
630 if digits or digit != 0:
631 digits.append(digit)
632 else:
633 raise ValueError("The second value in the tuple must "
634 "be composed of integers in the range "
635 "0 through 9.")
636 if value[2] in ('n', 'N'):
637 # NaN: digits form the diagnostic
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000638 self._int = ''.join(map(str, digits))
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000639 self._exp = value[2]
640 self._is_special = True
641 elif isinstance(value[2], int):
642 # finite number: digits give the coefficient
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000643 self._int = ''.join(map(str, digits or [0]))
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000644 self._exp = value[2]
645 self._is_special = False
646 else:
647 raise ValueError("The third value in the tuple must "
648 "be an integer, or one of the "
649 "strings 'F', 'n', 'N'.")
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000650 return self
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000651
Raymond Hettingerbf440692004-07-10 14:14:37 +0000652 if isinstance(value, float):
Raymond Hettinger96798592010-04-02 16:58:27 +0000653 value = Decimal.from_float(value)
654 self._exp = value._exp
655 self._sign = value._sign
656 self._int = value._int
657 self._is_special = value._is_special
658 return self
Raymond Hettingerbf440692004-07-10 14:14:37 +0000659
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000660 raise TypeError("Cannot convert %r to Decimal" % value)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000661
Mark Dickinsonba298e42009-01-04 21:17:43 +0000662 # @classmethod, but @decorator is not valid Python 2.3 syntax, so
663 # don't use it (see notes on Py2.3 compatibility at top of file)
Raymond Hettinger771ed762009-01-03 19:20:32 +0000664 def from_float(cls, f):
665 """Converts a float to a decimal number, exactly.
666
667 Note that Decimal.from_float(0.1) is not the same as Decimal('0.1').
668 Since 0.1 is not exactly representable in binary floating point, the
669 value is stored as the nearest representable value which is
670 0x1.999999999999ap-4. The exact equivalent of the value in decimal
671 is 0.1000000000000000055511151231257827021181583404541015625.
672
673 >>> Decimal.from_float(0.1)
674 Decimal('0.1000000000000000055511151231257827021181583404541015625')
675 >>> Decimal.from_float(float('nan'))
676 Decimal('NaN')
677 >>> Decimal.from_float(float('inf'))
678 Decimal('Infinity')
679 >>> Decimal.from_float(-float('inf'))
680 Decimal('-Infinity')
681 >>> Decimal.from_float(-0.0)
682 Decimal('-0')
683
684 """
685 if isinstance(f, int): # handle integer inputs
686 return cls(f)
687 if _math.isinf(f) or _math.isnan(f): # raises TypeError if not a float
688 return cls(repr(f))
Mark Dickinsonba298e42009-01-04 21:17:43 +0000689 if _math.copysign(1.0, f) == 1.0:
690 sign = 0
691 else:
692 sign = 1
Raymond Hettinger771ed762009-01-03 19:20:32 +0000693 n, d = abs(f).as_integer_ratio()
694 k = d.bit_length() - 1
695 result = _dec_from_triple(sign, str(n*5**k), -k)
Mark Dickinsonba298e42009-01-04 21:17:43 +0000696 if cls is Decimal:
697 return result
698 else:
699 return cls(result)
700 from_float = classmethod(from_float)
Raymond Hettinger771ed762009-01-03 19:20:32 +0000701
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000702 def _isnan(self):
703 """Returns whether the number is not actually one.
704
705 0 if a number
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000706 1 if NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000707 2 if sNaN
708 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000709 if self._is_special:
710 exp = self._exp
711 if exp == 'n':
712 return 1
713 elif exp == 'N':
714 return 2
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000715 return 0
716
717 def _isinfinity(self):
718 """Returns whether the number is infinite
719
720 0 if finite or not a number
721 1 if +INF
722 -1 if -INF
723 """
724 if self._exp == 'F':
725 if self._sign:
726 return -1
727 return 1
728 return 0
729
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000730 def _check_nans(self, other=None, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000731 """Returns whether the number is not actually one.
732
733 if self, other are sNaN, signal
734 if self, other are NaN return nan
735 return 0
736
737 Done before operations.
738 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000739
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000740 self_is_nan = self._isnan()
741 if other is None:
742 other_is_nan = False
743 else:
744 other_is_nan = other._isnan()
745
746 if self_is_nan or other_is_nan:
747 if context is None:
748 context = getcontext()
749
750 if self_is_nan == 2:
751 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000752 self)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000753 if other_is_nan == 2:
754 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000755 other)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000756 if self_is_nan:
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000757 return self._fix_nan(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000758
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000759 return other._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000760 return 0
761
Christian Heimes77c02eb2008-02-09 02:18:51 +0000762 def _compare_check_nans(self, other, context):
763 """Version of _check_nans used for the signaling comparisons
764 compare_signal, __le__, __lt__, __ge__, __gt__.
765
766 Signal InvalidOperation if either self or other is a (quiet
767 or signaling) NaN. Signaling NaNs take precedence over quiet
768 NaNs.
769
770 Return 0 if neither operand is a NaN.
771
772 """
773 if context is None:
774 context = getcontext()
775
776 if self._is_special or other._is_special:
777 if self.is_snan():
778 return context._raise_error(InvalidOperation,
779 'comparison involving sNaN',
780 self)
781 elif other.is_snan():
782 return context._raise_error(InvalidOperation,
783 'comparison involving sNaN',
784 other)
785 elif self.is_qnan():
786 return context._raise_error(InvalidOperation,
787 'comparison involving NaN',
788 self)
789 elif other.is_qnan():
790 return context._raise_error(InvalidOperation,
791 'comparison involving NaN',
792 other)
793 return 0
794
Jack Diederich4dafcc42006-11-28 19:15:13 +0000795 def __bool__(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000796 """Return True if self is nonzero; otherwise return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000797
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000798 NaNs and infinities are considered nonzero.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000799 """
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000800 return self._is_special or self._int != '0'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000801
Christian Heimes77c02eb2008-02-09 02:18:51 +0000802 def _cmp(self, other):
803 """Compare the two non-NaN decimal instances self and other.
804
805 Returns -1 if self < other, 0 if self == other and 1
806 if self > other. This routine is for internal use only."""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000807
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000808 if self._is_special or other._is_special:
Mark Dickinsone6aad752009-01-25 10:48:51 +0000809 self_inf = self._isinfinity()
810 other_inf = other._isinfinity()
811 if self_inf == other_inf:
812 return 0
813 elif self_inf < other_inf:
814 return -1
815 else:
816 return 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000817
Mark Dickinsone6aad752009-01-25 10:48:51 +0000818 # check for zeros; Decimal('0') == Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000819 if not self:
820 if not other:
821 return 0
822 else:
823 return -((-1)**other._sign)
824 if not other:
825 return (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000826
Guido van Rossumd8faa362007-04-27 19:54:29 +0000827 # If different signs, neg one is less
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000828 if other._sign < self._sign:
829 return -1
830 if self._sign < other._sign:
831 return 1
832
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000833 self_adjusted = self.adjusted()
834 other_adjusted = other.adjusted()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000835 if self_adjusted == other_adjusted:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000836 self_padded = self._int + '0'*(self._exp - other._exp)
837 other_padded = other._int + '0'*(other._exp - self._exp)
Mark Dickinsone6aad752009-01-25 10:48:51 +0000838 if self_padded == other_padded:
839 return 0
840 elif self_padded < other_padded:
841 return -(-1)**self._sign
842 else:
843 return (-1)**self._sign
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000844 elif self_adjusted > other_adjusted:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000845 return (-1)**self._sign
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000846 else: # self_adjusted < other_adjusted
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000847 return -((-1)**self._sign)
848
Christian Heimes77c02eb2008-02-09 02:18:51 +0000849 # Note: The Decimal standard doesn't cover rich comparisons for
850 # Decimals. In particular, the specification is silent on the
851 # subject of what should happen for a comparison involving a NaN.
852 # We take the following approach:
853 #
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000854 # == comparisons involving a quiet NaN always return False
855 # != comparisons involving a quiet NaN always return True
856 # == or != comparisons involving a signaling NaN signal
857 # InvalidOperation, and return False or True as above if the
858 # InvalidOperation is not trapped.
Christian Heimes77c02eb2008-02-09 02:18:51 +0000859 # <, >, <= and >= comparisons involving a (quiet or signaling)
860 # NaN signal InvalidOperation, and return False if the
Christian Heimes3feef612008-02-11 06:19:17 +0000861 # InvalidOperation is not trapped.
Christian Heimes77c02eb2008-02-09 02:18:51 +0000862 #
863 # This behavior is designed to conform as closely as possible to
864 # that specified by IEEE 754.
865
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000866 def __eq__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000867 self, other = _convert_for_comparison(self, other, equality_op=True)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000868 if other is NotImplemented:
869 return other
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000870 if self._check_nans(other, context):
Christian Heimes77c02eb2008-02-09 02:18:51 +0000871 return False
872 return self._cmp(other) == 0
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000873
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000874 def __ne__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000875 self, other = _convert_for_comparison(self, other, equality_op=True)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000876 if other is NotImplemented:
877 return other
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000878 if self._check_nans(other, context):
Christian Heimes77c02eb2008-02-09 02:18:51 +0000879 return True
880 return self._cmp(other) != 0
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000881
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000882
Christian Heimes77c02eb2008-02-09 02:18:51 +0000883 def __lt__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000884 self, other = _convert_for_comparison(self, other)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000885 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 __le__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000893 self, other = _convert_for_comparison(self, other)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000894 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
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000900
Christian Heimes77c02eb2008-02-09 02:18:51 +0000901 def __gt__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000902 self, other = _convert_for_comparison(self, other)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000903 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
909
910 def __ge__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000911 self, other = _convert_for_comparison(self, other)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000912 if other is NotImplemented:
913 return other
914 ans = self._compare_check_nans(other, context)
915 if ans:
916 return False
917 return self._cmp(other) >= 0
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000918
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000919 def compare(self, other, context=None):
920 """Compares one to another.
921
922 -1 => a < b
923 0 => a = b
924 1 => a > b
925 NaN => one is NaN
926 Like __cmp__, but returns Decimal instances.
927 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000928 other = _convert_other(other, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000929
Guido van Rossumd8faa362007-04-27 19:54:29 +0000930 # Compare(NaN, NaN) = NaN
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000931 if (self._is_special or other and other._is_special):
932 ans = self._check_nans(other, context)
933 if ans:
934 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000935
Christian Heimes77c02eb2008-02-09 02:18:51 +0000936 return Decimal(self._cmp(other))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000937
938 def __hash__(self):
939 """x.__hash__() <==> hash(x)"""
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000940
Mark Dickinsondc787d22010-05-23 13:33:13 +0000941 # In order to make sure that the hash of a Decimal instance
942 # agrees with the hash of a numerically equal integer, float
943 # or Fraction, we follow the rules for numeric hashes outlined
944 # in the documentation. (See library docs, 'Built-in Types').
Raymond Hettingerbea3f6f2005-03-15 04:59:17 +0000945 if self._is_special:
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000946 if self.is_snan():
Raymond Hettingerd325c4b2010-11-21 04:08:28 +0000947 raise TypeError('Cannot hash a signaling NaN value.')
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000948 elif self.is_nan():
Mark Dickinsondc787d22010-05-23 13:33:13 +0000949 return _PyHASH_NAN
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000950 else:
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000951 if self._sign:
Mark Dickinsondc787d22010-05-23 13:33:13 +0000952 return -_PyHASH_INF
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000953 else:
Mark Dickinsondc787d22010-05-23 13:33:13 +0000954 return _PyHASH_INF
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000955
Mark Dickinsondc787d22010-05-23 13:33:13 +0000956 if self._exp >= 0:
957 exp_hash = pow(10, self._exp, _PyHASH_MODULUS)
958 else:
959 exp_hash = pow(_PyHASH_10INV, -self._exp, _PyHASH_MODULUS)
960 hash_ = int(self._int) * exp_hash % _PyHASH_MODULUS
Stefan Krahdc817b22010-11-17 11:16:34 +0000961 ans = hash_ if self >= 0 else -hash_
962 return -2 if ans == -1 else ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000963
964 def as_tuple(self):
965 """Represents the number as a triple tuple.
966
967 To show the internals exactly as they are.
968 """
Christian Heimes25bb7832008-01-11 16:17:00 +0000969 return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000970
971 def __repr__(self):
972 """Represents the number as an instance of Decimal."""
973 # Invariant: eval(repr(d)) == d
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000974 return "Decimal('%s')" % str(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000975
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000976 def __str__(self, eng=False, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000977 """Return string representation of the number in scientific notation.
978
979 Captures all of the information in the underlying representation.
980 """
981
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000982 sign = ['', '-'][self._sign]
Raymond Hettingere5a0a962005-06-20 09:49:42 +0000983 if self._is_special:
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000984 if self._exp == 'F':
985 return sign + 'Infinity'
986 elif self._exp == 'n':
987 return sign + 'NaN' + self._int
988 else: # self._exp == 'N'
989 return sign + 'sNaN' + self._int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000990
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000991 # number of digits of self._int to left of decimal point
992 leftdigits = self._exp + len(self._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000993
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000994 # dotplace is number of digits of self._int to the left of the
995 # decimal point in the mantissa of the output string (that is,
996 # after adjusting the exponent)
997 if self._exp <= 0 and leftdigits > -6:
998 # no exponent required
999 dotplace = leftdigits
1000 elif not eng:
1001 # usual scientific notation: 1 digit on left of the point
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001002 dotplace = 1
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001003 elif self._int == '0':
1004 # engineering notation, zero
1005 dotplace = (leftdigits + 1) % 3 - 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001006 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001007 # engineering notation, nonzero
1008 dotplace = (leftdigits - 1) % 3 + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001009
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001010 if dotplace <= 0:
1011 intpart = '0'
1012 fracpart = '.' + '0'*(-dotplace) + self._int
1013 elif dotplace >= len(self._int):
1014 intpart = self._int+'0'*(dotplace-len(self._int))
1015 fracpart = ''
1016 else:
1017 intpart = self._int[:dotplace]
1018 fracpart = '.' + self._int[dotplace:]
1019 if leftdigits == dotplace:
1020 exp = ''
1021 else:
1022 if context is None:
1023 context = getcontext()
1024 exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
1025
1026 return sign + intpart + fracpart + exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001027
1028 def to_eng_string(self, context=None):
1029 """Convert to engineering-type string.
1030
1031 Engineering notation has an exponent which is a multiple of 3, so there
1032 are up to 3 digits left of the decimal place.
1033
1034 Same rules for when in exponential and when as a value as in __str__.
1035 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001036 return self.__str__(eng=True, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001037
1038 def __neg__(self, context=None):
1039 """Returns a copy with the sign switched.
1040
1041 Rounds, if it has reason.
1042 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001043 if self._is_special:
1044 ans = self._check_nans(context=context)
1045 if ans:
1046 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001047
Mark Dickinson37a79fb2011-03-12 11:12:52 +00001048 if context is None:
1049 context = getcontext()
1050
1051 if not self and context.rounding != ROUND_FLOOR:
1052 # -Decimal('0') is Decimal('0'), not Decimal('-0'), except
1053 # in ROUND_FLOOR rounding mode.
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001054 ans = self.copy_abs()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001055 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001056 ans = self.copy_negate()
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001057
Christian Heimes2c181612007-12-17 20:04:13 +00001058 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001059
1060 def __pos__(self, context=None):
1061 """Returns a copy, unless it is a sNaN.
1062
1063 Rounds the number (if more then precision digits)
1064 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001065 if self._is_special:
1066 ans = self._check_nans(context=context)
1067 if ans:
1068 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001069
Mark Dickinson37a79fb2011-03-12 11:12:52 +00001070 if context is None:
1071 context = getcontext()
1072
1073 if not self and context.rounding != ROUND_FLOOR:
1074 # + (-0) = 0, except in ROUND_FLOOR rounding mode.
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001075 ans = self.copy_abs()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001076 else:
1077 ans = Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001078
Christian Heimes2c181612007-12-17 20:04:13 +00001079 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001080
Christian Heimes2c181612007-12-17 20:04:13 +00001081 def __abs__(self, round=True, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001082 """Returns the absolute value of self.
1083
Christian Heimes2c181612007-12-17 20:04:13 +00001084 If the keyword argument 'round' is false, do not round. The
1085 expression self.__abs__(round=False) is equivalent to
1086 self.copy_abs().
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001087 """
Christian Heimes2c181612007-12-17 20:04:13 +00001088 if not round:
1089 return self.copy_abs()
1090
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001091 if self._is_special:
1092 ans = self._check_nans(context=context)
1093 if ans:
1094 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001095
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001096 if self._sign:
1097 ans = self.__neg__(context=context)
1098 else:
1099 ans = self.__pos__(context=context)
1100
1101 return ans
1102
1103 def __add__(self, other, context=None):
1104 """Returns self + other.
1105
1106 -INF + INF (or the reverse) cause InvalidOperation errors.
1107 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001108 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001109 if other is NotImplemented:
1110 return other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001111
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001112 if context is None:
1113 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001114
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001115 if self._is_special or other._is_special:
1116 ans = self._check_nans(other, context)
1117 if ans:
1118 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001119
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001120 if self._isinfinity():
Guido van Rossumd8faa362007-04-27 19:54:29 +00001121 # If both INF, same sign => same as both, opposite => error.
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001122 if self._sign != other._sign and other._isinfinity():
1123 return context._raise_error(InvalidOperation, '-INF + INF')
1124 return Decimal(self)
1125 if other._isinfinity():
Guido van Rossumd8faa362007-04-27 19:54:29 +00001126 return Decimal(other) # Can't both be infinity here
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001127
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001128 exp = min(self._exp, other._exp)
1129 negativezero = 0
1130 if context.rounding == ROUND_FLOOR and self._sign != other._sign:
Guido van Rossumd8faa362007-04-27 19:54:29 +00001131 # If the answer is 0, the sign should be negative, in this case.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001132 negativezero = 1
1133
1134 if not self and not other:
1135 sign = min(self._sign, other._sign)
1136 if negativezero:
1137 sign = 1
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001138 ans = _dec_from_triple(sign, '0', exp)
Christian Heimes2c181612007-12-17 20:04:13 +00001139 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001140 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001141 if not self:
Facundo Batista99b55482004-10-26 23:38:46 +00001142 exp = max(exp, other._exp - context.prec-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001143 ans = other._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 if not other:
Facundo Batista99b55482004-10-26 23:38:46 +00001147 exp = max(exp, self._exp - context.prec-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001148 ans = self._rescale(exp, context.rounding)
Christian Heimes2c181612007-12-17 20:04:13 +00001149 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001150 return ans
1151
1152 op1 = _WorkRep(self)
1153 op2 = _WorkRep(other)
Christian Heimes2c181612007-12-17 20:04:13 +00001154 op1, op2 = _normalize(op1, op2, context.prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001155
1156 result = _WorkRep()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001157 if op1.sign != op2.sign:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001158 # Equal and opposite
Raymond Hettinger17931de2004-10-27 06:21:46 +00001159 if op1.int == op2.int:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001160 ans = _dec_from_triple(negativezero, '0', exp)
Christian Heimes2c181612007-12-17 20:04:13 +00001161 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001162 return ans
Raymond Hettinger17931de2004-10-27 06:21:46 +00001163 if op1.int < op2.int:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001164 op1, op2 = op2, op1
Guido van Rossumd8faa362007-04-27 19:54:29 +00001165 # OK, now abs(op1) > abs(op2)
Raymond Hettinger17931de2004-10-27 06:21:46 +00001166 if op1.sign == 1:
1167 result.sign = 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001168 op1.sign, op2.sign = op2.sign, op1.sign
1169 else:
Raymond Hettinger17931de2004-10-27 06:21:46 +00001170 result.sign = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +00001171 # So we know the sign, and op1 > 0.
Raymond Hettinger17931de2004-10-27 06:21:46 +00001172 elif op1.sign == 1:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001173 result.sign = 1
Raymond Hettinger17931de2004-10-27 06:21:46 +00001174 op1.sign, op2.sign = (0, 0)
1175 else:
1176 result.sign = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +00001177 # Now, op1 > abs(op2) > 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001178
Raymond Hettinger17931de2004-10-27 06:21:46 +00001179 if op2.sign == 0:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001180 result.int = op1.int + op2.int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001181 else:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001182 result.int = op1.int - op2.int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001183
1184 result.exp = op1.exp
1185 ans = Decimal(result)
Christian Heimes2c181612007-12-17 20:04:13 +00001186 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001187 return ans
1188
1189 __radd__ = __add__
1190
1191 def __sub__(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001192 """Return self - other"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001193 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001194 if other is NotImplemented:
1195 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001196
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001197 if self._is_special or other._is_special:
1198 ans = self._check_nans(other, context=context)
1199 if ans:
1200 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001201
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001202 # self - other is computed as self + other.copy_negate()
1203 return self.__add__(other.copy_negate(), context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001204
1205 def __rsub__(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001206 """Return other - self"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001207 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001208 if other is NotImplemented:
1209 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001210
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001211 return other.__sub__(self, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001212
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001213 def __mul__(self, other, context=None):
1214 """Return self * other.
1215
1216 (+-) INF * 0 (or its reverse) raise InvalidOperation.
1217 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001218 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001219 if other is NotImplemented:
1220 return other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001221
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001222 if context is None:
1223 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001224
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +00001225 resultsign = self._sign ^ other._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001226
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001227 if self._is_special or other._is_special:
1228 ans = self._check_nans(other, context)
1229 if ans:
1230 return ans
1231
1232 if self._isinfinity():
1233 if not other:
1234 return context._raise_error(InvalidOperation, '(+-)INF * 0')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001235 return _SignedInfinity[resultsign]
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001236
1237 if other._isinfinity():
1238 if not self:
1239 return context._raise_error(InvalidOperation, '0 * (+-)INF')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001240 return _SignedInfinity[resultsign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001241
1242 resultexp = self._exp + other._exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001243
1244 # Special case for multiplying by zero
1245 if not self or not other:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001246 ans = _dec_from_triple(resultsign, '0', resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001247 # Fixing in case the exponent is out of bounds
1248 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001249 return ans
1250
1251 # Special case for multiplying by power of 10
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001252 if self._int == '1':
1253 ans = _dec_from_triple(resultsign, other._int, resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001254 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001255 return ans
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001256 if other._int == '1':
1257 ans = _dec_from_triple(resultsign, self._int, resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001258 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001259 return ans
1260
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001261 op1 = _WorkRep(self)
1262 op2 = _WorkRep(other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001263
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001264 ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001265 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001266
1267 return ans
1268 __rmul__ = __mul__
1269
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001270 def __truediv__(self, other, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001271 """Return self / other."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001272 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001273 if other is NotImplemented:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001274 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001275
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001276 if context is None:
1277 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001278
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +00001279 sign = self._sign ^ other._sign
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001280
1281 if self._is_special or other._is_special:
1282 ans = self._check_nans(other, context)
1283 if ans:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001284 return ans
1285
1286 if self._isinfinity() and other._isinfinity():
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001287 return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001288
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001289 if self._isinfinity():
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001290 return _SignedInfinity[sign]
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001291
1292 if other._isinfinity():
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001293 context._raise_error(Clamped, 'Division by infinity')
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001294 return _dec_from_triple(sign, '0', context.Etiny())
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001295
1296 # Special cases for zeroes
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001297 if not other:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001298 if not self:
1299 return context._raise_error(DivisionUndefined, '0 / 0')
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001300 return context._raise_error(DivisionByZero, 'x / 0', sign)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001301
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001302 if not self:
1303 exp = self._exp - other._exp
1304 coeff = 0
1305 else:
1306 # OK, so neither = 0, INF or NaN
1307 shift = len(other._int) - len(self._int) + context.prec + 1
1308 exp = self._exp - other._exp - shift
1309 op1 = _WorkRep(self)
1310 op2 = _WorkRep(other)
1311 if shift >= 0:
1312 coeff, remainder = divmod(op1.int * 10**shift, op2.int)
1313 else:
1314 coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
1315 if remainder:
1316 # result is not exact; adjust to ensure correct rounding
1317 if coeff % 5 == 0:
1318 coeff += 1
1319 else:
1320 # result is exact; get as close to ideal exponent as possible
1321 ideal_exp = self._exp - other._exp
1322 while exp < ideal_exp and coeff % 10 == 0:
1323 coeff //= 10
1324 exp += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001325
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001326 ans = _dec_from_triple(sign, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001327 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001328
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001329 def _divide(self, other, context):
1330 """Return (self // other, self % other), to context.prec precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001331
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001332 Assumes that neither self nor other is a NaN, that self is not
1333 infinite and that other is nonzero.
1334 """
1335 sign = self._sign ^ other._sign
1336 if other._isinfinity():
1337 ideal_exp = self._exp
1338 else:
1339 ideal_exp = min(self._exp, other._exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001340
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001341 expdiff = self.adjusted() - other.adjusted()
1342 if not self or other._isinfinity() or expdiff <= -2:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001343 return (_dec_from_triple(sign, '0', 0),
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001344 self._rescale(ideal_exp, context.rounding))
1345 if expdiff <= context.prec:
1346 op1 = _WorkRep(self)
1347 op2 = _WorkRep(other)
1348 if op1.exp >= op2.exp:
1349 op1.int *= 10**(op1.exp - op2.exp)
1350 else:
1351 op2.int *= 10**(op2.exp - op1.exp)
1352 q, r = divmod(op1.int, op2.int)
1353 if q < 10**context.prec:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001354 return (_dec_from_triple(sign, str(q), 0),
1355 _dec_from_triple(self._sign, str(r), ideal_exp))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001356
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001357 # Here the quotient is too large to be representable
1358 ans = context._raise_error(DivisionImpossible,
1359 'quotient too large in //, % or divmod')
1360 return ans, ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001361
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001362 def __rtruediv__(self, other, context=None):
1363 """Swaps self/other and returns __truediv__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001364 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001365 if other is NotImplemented:
1366 return other
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001367 return other.__truediv__(self, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001368
1369 def __divmod__(self, other, context=None):
1370 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001371 Return (self // other, self % other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001372 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001373 other = _convert_other(other)
1374 if other is NotImplemented:
1375 return other
1376
1377 if context is None:
1378 context = getcontext()
1379
1380 ans = self._check_nans(other, context)
1381 if ans:
1382 return (ans, ans)
1383
1384 sign = self._sign ^ other._sign
1385 if self._isinfinity():
1386 if other._isinfinity():
1387 ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
1388 return ans, ans
1389 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001390 return (_SignedInfinity[sign],
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001391 context._raise_error(InvalidOperation, 'INF % x'))
1392
1393 if not other:
1394 if not self:
1395 ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
1396 return ans, ans
1397 else:
1398 return (context._raise_error(DivisionByZero, 'x // 0', sign),
1399 context._raise_error(InvalidOperation, 'x % 0'))
1400
1401 quotient, remainder = self._divide(other, context)
Christian Heimes2c181612007-12-17 20:04:13 +00001402 remainder = remainder._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001403 return quotient, remainder
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001404
1405 def __rdivmod__(self, other, context=None):
1406 """Swaps self/other and returns __divmod__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001407 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001408 if other is NotImplemented:
1409 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001410 return other.__divmod__(self, context=context)
1411
1412 def __mod__(self, other, context=None):
1413 """
1414 self % other
1415 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001416 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001417 if other is NotImplemented:
1418 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001419
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001420 if context is None:
1421 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001422
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001423 ans = self._check_nans(other, context)
1424 if ans:
1425 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001426
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001427 if self._isinfinity():
1428 return context._raise_error(InvalidOperation, 'INF % x')
1429 elif not other:
1430 if self:
1431 return context._raise_error(InvalidOperation, 'x % 0')
1432 else:
1433 return context._raise_error(DivisionUndefined, '0 % 0')
1434
1435 remainder = self._divide(other, context)[1]
Christian Heimes2c181612007-12-17 20:04:13 +00001436 remainder = remainder._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001437 return remainder
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001438
1439 def __rmod__(self, other, context=None):
1440 """Swaps self/other and returns __mod__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001441 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001442 if other is NotImplemented:
1443 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001444 return other.__mod__(self, context=context)
1445
1446 def remainder_near(self, other, context=None):
1447 """
1448 Remainder nearest to 0- abs(remainder-near) <= other/2
1449 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001450 if context is None:
1451 context = getcontext()
1452
1453 other = _convert_other(other, raiseit=True)
1454
1455 ans = self._check_nans(other, context)
1456 if ans:
1457 return ans
1458
1459 # self == +/-infinity -> InvalidOperation
1460 if self._isinfinity():
1461 return context._raise_error(InvalidOperation,
1462 'remainder_near(infinity, x)')
1463
1464 # other == 0 -> either InvalidOperation or DivisionUndefined
1465 if not other:
1466 if self:
1467 return context._raise_error(InvalidOperation,
1468 'remainder_near(x, 0)')
1469 else:
1470 return context._raise_error(DivisionUndefined,
1471 'remainder_near(0, 0)')
1472
1473 # other = +/-infinity -> remainder = self
1474 if other._isinfinity():
1475 ans = Decimal(self)
1476 return ans._fix(context)
1477
1478 # self = 0 -> remainder = self, with ideal exponent
1479 ideal_exponent = min(self._exp, other._exp)
1480 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001481 ans = _dec_from_triple(self._sign, '0', ideal_exponent)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001482 return ans._fix(context)
1483
1484 # catch most cases of large or small quotient
1485 expdiff = self.adjusted() - other.adjusted()
1486 if expdiff >= context.prec + 1:
1487 # expdiff >= prec+1 => abs(self/other) > 10**prec
1488 return context._raise_error(DivisionImpossible)
1489 if expdiff <= -2:
1490 # expdiff <= -2 => abs(self/other) < 0.1
1491 ans = self._rescale(ideal_exponent, context.rounding)
1492 return ans._fix(context)
1493
1494 # adjust both arguments to have the same exponent, then divide
1495 op1 = _WorkRep(self)
1496 op2 = _WorkRep(other)
1497 if op1.exp >= op2.exp:
1498 op1.int *= 10**(op1.exp - op2.exp)
1499 else:
1500 op2.int *= 10**(op2.exp - op1.exp)
1501 q, r = divmod(op1.int, op2.int)
1502 # remainder is r*10**ideal_exponent; other is +/-op2.int *
1503 # 10**ideal_exponent. Apply correction to ensure that
1504 # abs(remainder) <= abs(other)/2
1505 if 2*r + (q&1) > op2.int:
1506 r -= op2.int
1507 q += 1
1508
1509 if q >= 10**context.prec:
1510 return context._raise_error(DivisionImpossible)
1511
1512 # result has same sign as self unless r is negative
1513 sign = self._sign
1514 if r < 0:
1515 sign = 1-sign
1516 r = -r
1517
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001518 ans = _dec_from_triple(sign, str(r), ideal_exponent)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001519 return ans._fix(context)
1520
1521 def __floordiv__(self, other, context=None):
1522 """self // other"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001523 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001524 if other is NotImplemented:
1525 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001526
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001527 if context is None:
1528 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001529
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001530 ans = self._check_nans(other, context)
1531 if ans:
1532 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001533
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001534 if self._isinfinity():
1535 if other._isinfinity():
1536 return context._raise_error(InvalidOperation, 'INF // INF')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001537 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001538 return _SignedInfinity[self._sign ^ other._sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001539
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001540 if not other:
1541 if self:
1542 return context._raise_error(DivisionByZero, 'x // 0',
1543 self._sign ^ other._sign)
1544 else:
1545 return context._raise_error(DivisionUndefined, '0 // 0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001546
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001547 return self._divide(other, context)[0]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001548
1549 def __rfloordiv__(self, other, context=None):
1550 """Swaps self/other and returns __floordiv__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001551 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001552 if other is NotImplemented:
1553 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001554 return other.__floordiv__(self, context=context)
1555
1556 def __float__(self):
1557 """Float representation."""
Mark Dickinsone4204bc2012-08-24 19:32:13 +01001558 if self._isnan():
1559 if self.is_snan():
1560 raise ValueError("Cannot convert signaling NaN to float")
1561 s = "-nan" if self._sign else "nan"
1562 else:
1563 s = str(self)
1564 return float(s)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001565
1566 def __int__(self):
Brett Cannon46b08022005-03-01 03:12:26 +00001567 """Converts self to an int, truncating if necessary."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001568 if self._is_special:
1569 if self._isnan():
Mark Dickinson825fce32009-09-07 18:08:12 +00001570 raise ValueError("Cannot convert NaN to integer")
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001571 elif self._isinfinity():
Mark Dickinson825fce32009-09-07 18:08:12 +00001572 raise OverflowError("Cannot convert infinity to integer")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001573 s = (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001574 if self._exp >= 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001575 return s*int(self._int)*10**self._exp
Raymond Hettinger605ed022004-11-24 07:28:48 +00001576 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001577 return s*int(self._int[:self._exp] or '0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001578
Christian Heimes969fe572008-01-25 11:23:10 +00001579 __trunc__ = __int__
1580
Christian Heimes0bd4e112008-02-12 22:59:25 +00001581 def real(self):
1582 return self
Mark Dickinson315a20a2009-01-04 21:34:18 +00001583 real = property(real)
Christian Heimes0bd4e112008-02-12 22:59:25 +00001584
Christian Heimes0bd4e112008-02-12 22:59:25 +00001585 def imag(self):
1586 return Decimal(0)
Mark Dickinson315a20a2009-01-04 21:34:18 +00001587 imag = property(imag)
Christian Heimes0bd4e112008-02-12 22:59:25 +00001588
1589 def conjugate(self):
1590 return self
1591
1592 def __complex__(self):
1593 return complex(float(self))
1594
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001595 def _fix_nan(self, context):
1596 """Decapitate the payload of a NaN to fit the context"""
1597 payload = self._int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001598
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001599 # maximum length of payload is precision if clamp=0,
1600 # precision-1 if clamp=1.
1601 max_payload_len = context.prec - context.clamp
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001602 if len(payload) > max_payload_len:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001603 payload = payload[len(payload)-max_payload_len:].lstrip('0')
1604 return _dec_from_triple(self._sign, payload, self._exp, True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001605 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001606
Raymond Hettingerdab988d2004-10-09 07:10:44 +00001607 def _fix(self, context):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001608 """Round if it is necessary to keep self within prec precision.
1609
1610 Rounds and fixes the exponent. Does not raise on a sNaN.
1611
1612 Arguments:
1613 self - Decimal instance
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001614 context - context used.
1615 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001616
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001617 if self._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001618 if self._isnan():
1619 # decapitate payload if necessary
1620 return self._fix_nan(context)
1621 else:
1622 # self is +/-Infinity; return unaltered
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001623 return Decimal(self)
1624
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001625 # if self is zero then exponent should be between Etiny and
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001626 # Emax if clamp==0, and between Etiny and Etop if clamp==1.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001627 Etiny = context.Etiny()
1628 Etop = context.Etop()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001629 if not self:
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001630 exp_max = [context.Emax, Etop][context.clamp]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001631 new_exp = min(max(self._exp, Etiny), exp_max)
1632 if new_exp != self._exp:
1633 context._raise_error(Clamped)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001634 return _dec_from_triple(self._sign, '0', new_exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001635 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001636 return Decimal(self)
1637
1638 # exp_min is the smallest allowable exponent of the result,
1639 # equal to max(self.adjusted()-context.prec+1, Etiny)
1640 exp_min = len(self._int) + self._exp - context.prec
1641 if exp_min > Etop:
1642 # overflow: exp_min > Etop iff self.adjusted() > Emax
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001643 ans = context._raise_error(Overflow, 'above Emax', self._sign)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001644 context._raise_error(Inexact)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001645 context._raise_error(Rounded)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001646 return ans
1647
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001648 self_is_subnormal = exp_min < Etiny
1649 if self_is_subnormal:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001650 exp_min = Etiny
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001651
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001652 # round if self has too many digits
1653 if self._exp < exp_min:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001654 digits = len(self._int) + self._exp - exp_min
1655 if digits < 0:
1656 self = _dec_from_triple(self._sign, '1', exp_min-1)
1657 digits = 0
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001658 rounding_method = self._pick_rounding_function[context.rounding]
Alexander Belopolsky1a20c122011-04-12 23:03:39 -04001659 changed = rounding_method(self, digits)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001660 coeff = self._int[:digits] or '0'
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001661 if changed > 0:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001662 coeff = str(int(coeff)+1)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001663 if len(coeff) > context.prec:
1664 coeff = coeff[:-1]
1665 exp_min += 1
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001666
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001667 # check whether the rounding pushed the exponent out of range
1668 if exp_min > Etop:
1669 ans = context._raise_error(Overflow, 'above Emax', self._sign)
1670 else:
1671 ans = _dec_from_triple(self._sign, coeff, exp_min)
1672
1673 # raise the appropriate signals, taking care to respect
1674 # the precedence described in the specification
1675 if changed and self_is_subnormal:
1676 context._raise_error(Underflow)
1677 if self_is_subnormal:
1678 context._raise_error(Subnormal)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001679 if changed:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001680 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001681 context._raise_error(Rounded)
1682 if not ans:
1683 # raise Clamped on underflow to 0
1684 context._raise_error(Clamped)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001685 return ans
1686
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001687 if self_is_subnormal:
1688 context._raise_error(Subnormal)
1689
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001690 # fold down if clamp == 1 and self has too few digits
1691 if context.clamp == 1 and self._exp > Etop:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001692 context._raise_error(Clamped)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001693 self_padded = self._int + '0'*(self._exp - Etop)
1694 return _dec_from_triple(self._sign, self_padded, Etop)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001695
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001696 # here self was representable to begin with; return unchanged
1697 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001698
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001699 # for each of the rounding functions below:
1700 # self is a finite, nonzero Decimal
1701 # prec is an integer satisfying 0 <= prec < len(self._int)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001702 #
1703 # each function returns either -1, 0, or 1, as follows:
1704 # 1 indicates that self should be rounded up (away from zero)
1705 # 0 indicates that self should be truncated, and that all the
1706 # digits to be truncated are zeros (so the value is unchanged)
1707 # -1 indicates that there are nonzero digits to be truncated
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001708
1709 def _round_down(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001710 """Also known as round-towards-0, truncate."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001711 if _all_zeros(self._int, prec):
1712 return 0
1713 else:
1714 return -1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001715
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001716 def _round_up(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001717 """Rounds away from 0."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001718 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001719
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001720 def _round_half_up(self, prec):
1721 """Rounds 5 up (away from 0)"""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001722 if self._int[prec] in '56789':
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001723 return 1
1724 elif _all_zeros(self._int, prec):
1725 return 0
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001726 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001727 return -1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001728
1729 def _round_half_down(self, prec):
1730 """Round 5 down"""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001731 if _exact_half(self._int, prec):
1732 return -1
1733 else:
1734 return self._round_half_up(prec)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001735
1736 def _round_half_even(self, prec):
1737 """Round 5 to even, rest to nearest."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001738 if _exact_half(self._int, prec) and \
1739 (prec == 0 or self._int[prec-1] in '02468'):
1740 return -1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001741 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001742 return self._round_half_up(prec)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001743
1744 def _round_ceiling(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001745 """Rounds up (not away from 0 if negative.)"""
1746 if self._sign:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001747 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001748 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001749 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001750
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001751 def _round_floor(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001752 """Rounds down (not towards 0 if negative)"""
1753 if not self._sign:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001754 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001755 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001756 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001757
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001758 def _round_05up(self, prec):
1759 """Round down unless digit prec-1 is 0 or 5."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001760 if prec and self._int[prec-1] not in '05':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001761 return self._round_down(prec)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001762 else:
1763 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001764
Alexander Belopolsky1a20c122011-04-12 23:03:39 -04001765 _pick_rounding_function = dict(
1766 ROUND_DOWN = _round_down,
1767 ROUND_UP = _round_up,
1768 ROUND_HALF_UP = _round_half_up,
1769 ROUND_HALF_DOWN = _round_half_down,
1770 ROUND_HALF_EVEN = _round_half_even,
1771 ROUND_CEILING = _round_ceiling,
1772 ROUND_FLOOR = _round_floor,
1773 ROUND_05UP = _round_05up,
1774 )
1775
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001776 def __round__(self, n=None):
1777 """Round self to the nearest integer, or to a given precision.
1778
1779 If only one argument is supplied, round a finite Decimal
1780 instance self to the nearest integer. If self is infinite or
1781 a NaN then a Python exception is raised. If self is finite
1782 and lies exactly halfway between two integers then it is
1783 rounded to the integer with even last digit.
1784
1785 >>> round(Decimal('123.456'))
1786 123
1787 >>> round(Decimal('-456.789'))
1788 -457
1789 >>> round(Decimal('-3.0'))
1790 -3
1791 >>> round(Decimal('2.5'))
1792 2
1793 >>> round(Decimal('3.5'))
1794 4
1795 >>> round(Decimal('Inf'))
1796 Traceback (most recent call last):
1797 ...
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001798 OverflowError: cannot round an infinity
1799 >>> round(Decimal('NaN'))
1800 Traceback (most recent call last):
1801 ...
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001802 ValueError: cannot round a NaN
1803
1804 If a second argument n is supplied, self is rounded to n
1805 decimal places using the rounding mode for the current
1806 context.
1807
1808 For an integer n, round(self, -n) is exactly equivalent to
1809 self.quantize(Decimal('1En')).
1810
1811 >>> round(Decimal('123.456'), 0)
1812 Decimal('123')
1813 >>> round(Decimal('123.456'), 2)
1814 Decimal('123.46')
1815 >>> round(Decimal('123.456'), -2)
1816 Decimal('1E+2')
1817 >>> round(Decimal('-Infinity'), 37)
1818 Decimal('NaN')
1819 >>> round(Decimal('sNaN123'), 0)
1820 Decimal('NaN123')
1821
1822 """
1823 if n is not None:
1824 # two-argument form: use the equivalent quantize call
1825 if not isinstance(n, int):
1826 raise TypeError('Second argument to round should be integral')
1827 exp = _dec_from_triple(0, '1', -n)
1828 return self.quantize(exp)
1829
1830 # one-argument form
1831 if self._is_special:
1832 if self.is_nan():
1833 raise ValueError("cannot round a NaN")
1834 else:
1835 raise OverflowError("cannot round an infinity")
1836 return int(self._rescale(0, ROUND_HALF_EVEN))
1837
1838 def __floor__(self):
1839 """Return the floor of self, as an integer.
1840
1841 For a finite Decimal instance self, return the greatest
1842 integer n such that n <= self. If self is infinite or a NaN
1843 then a Python exception is raised.
1844
1845 """
1846 if self._is_special:
1847 if self.is_nan():
1848 raise ValueError("cannot round a NaN")
1849 else:
1850 raise OverflowError("cannot round an infinity")
1851 return int(self._rescale(0, ROUND_FLOOR))
1852
1853 def __ceil__(self):
1854 """Return the ceiling of self, as an integer.
1855
1856 For a finite Decimal instance self, return the least integer n
1857 such that n >= self. If self is infinite or a NaN then a
1858 Python exception is raised.
1859
1860 """
1861 if self._is_special:
1862 if self.is_nan():
1863 raise ValueError("cannot round a NaN")
1864 else:
1865 raise OverflowError("cannot round an infinity")
1866 return int(self._rescale(0, ROUND_CEILING))
1867
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001868 def fma(self, other, third, context=None):
1869 """Fused multiply-add.
1870
1871 Returns self*other+third with no rounding of the intermediate
1872 product self*other.
1873
1874 self and other are multiplied together, with no rounding of
1875 the result. The third operand is then added to the result,
1876 and a single final rounding is performed.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001877 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001878
1879 other = _convert_other(other, raiseit=True)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001880
1881 # compute product; raise InvalidOperation if either operand is
1882 # a signaling NaN or if the product is zero times infinity.
1883 if self._is_special or other._is_special:
1884 if context is None:
1885 context = getcontext()
1886 if self._exp == 'N':
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001887 return context._raise_error(InvalidOperation, 'sNaN', self)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001888 if other._exp == 'N':
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001889 return context._raise_error(InvalidOperation, 'sNaN', other)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001890 if self._exp == 'n':
1891 product = self
1892 elif other._exp == 'n':
1893 product = other
1894 elif self._exp == 'F':
1895 if not other:
1896 return context._raise_error(InvalidOperation,
1897 'INF * 0 in fma')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001898 product = _SignedInfinity[self._sign ^ other._sign]
Christian Heimes8b0facf2007-12-04 19:30:01 +00001899 elif other._exp == 'F':
1900 if not self:
1901 return context._raise_error(InvalidOperation,
1902 '0 * INF in fma')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001903 product = _SignedInfinity[self._sign ^ other._sign]
Christian Heimes8b0facf2007-12-04 19:30:01 +00001904 else:
1905 product = _dec_from_triple(self._sign ^ other._sign,
1906 str(int(self._int) * int(other._int)),
1907 self._exp + other._exp)
1908
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001909 third = _convert_other(third, raiseit=True)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001910 return product.__add__(third, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001911
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001912 def _power_modulo(self, other, modulo, context=None):
1913 """Three argument version of __pow__"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001914
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001915 # if can't convert other and modulo to Decimal, raise
1916 # TypeError; there's no point returning NotImplemented (no
1917 # equivalent of __rpow__ for three argument pow)
1918 other = _convert_other(other, raiseit=True)
1919 modulo = _convert_other(modulo, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001920
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001921 if context is None:
1922 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001923
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001924 # deal with NaNs: if there are any sNaNs then first one wins,
1925 # (i.e. behaviour for NaNs is identical to that of fma)
1926 self_is_nan = self._isnan()
1927 other_is_nan = other._isnan()
1928 modulo_is_nan = modulo._isnan()
1929 if self_is_nan or other_is_nan or modulo_is_nan:
1930 if self_is_nan == 2:
1931 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001932 self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001933 if other_is_nan == 2:
1934 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001935 other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001936 if modulo_is_nan == 2:
1937 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001938 modulo)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001939 if self_is_nan:
1940 return self._fix_nan(context)
1941 if other_is_nan:
1942 return other._fix_nan(context)
1943 return modulo._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001944
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001945 # check inputs: we apply same restrictions as Python's pow()
1946 if not (self._isinteger() and
1947 other._isinteger() and
1948 modulo._isinteger()):
1949 return context._raise_error(InvalidOperation,
1950 'pow() 3rd argument not allowed '
1951 'unless all arguments are integers')
1952 if other < 0:
1953 return context._raise_error(InvalidOperation,
1954 'pow() 2nd argument cannot be '
1955 'negative when 3rd argument specified')
1956 if not modulo:
1957 return context._raise_error(InvalidOperation,
1958 'pow() 3rd argument cannot be 0')
1959
1960 # additional restriction for decimal: the modulus must be less
1961 # than 10**prec in absolute value
1962 if modulo.adjusted() >= context.prec:
1963 return context._raise_error(InvalidOperation,
1964 'insufficient precision: pow() 3rd '
1965 'argument must not have more than '
1966 'precision digits')
1967
1968 # define 0**0 == NaN, for consistency with two-argument pow
1969 # (even though it hurts!)
1970 if not other and not self:
1971 return context._raise_error(InvalidOperation,
1972 'at least one of pow() 1st argument '
1973 'and 2nd argument must be nonzero ;'
1974 '0**0 is not defined')
1975
1976 # compute sign of result
1977 if other._iseven():
1978 sign = 0
1979 else:
1980 sign = self._sign
1981
1982 # convert modulo to a Python integer, and self and other to
1983 # Decimal integers (i.e. force their exponents to be >= 0)
1984 modulo = abs(int(modulo))
1985 base = _WorkRep(self.to_integral_value())
1986 exponent = _WorkRep(other.to_integral_value())
1987
1988 # compute result using integer pow()
1989 base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
1990 for i in range(exponent.exp):
1991 base = pow(base, 10, modulo)
1992 base = pow(base, exponent.int, modulo)
1993
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001994 return _dec_from_triple(sign, str(base), 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001995
1996 def _power_exact(self, other, p):
1997 """Attempt to compute self**other exactly.
1998
1999 Given Decimals self and other and an integer p, attempt to
2000 compute an exact result for the power self**other, with p
2001 digits of precision. Return None if self**other is not
2002 exactly representable in p digits.
2003
2004 Assumes that elimination of special cases has already been
2005 performed: self and other must both be nonspecial; self must
2006 be positive and not numerically equal to 1; other must be
2007 nonzero. For efficiency, other._exp should not be too large,
2008 so that 10**abs(other._exp) is a feasible calculation."""
2009
2010 # In the comments below, we write x for the value of self and
2011 # y for the value of other. Write x = xc*10**xe and y =
2012 # yc*10**ye.
2013
2014 # The main purpose of this method is to identify the *failure*
2015 # of x**y to be exactly representable with as little effort as
2016 # possible. So we look for cheap and easy tests that
2017 # eliminate the possibility of x**y being exact. Only if all
2018 # these tests are passed do we go on to actually compute x**y.
2019
2020 # Here's the main idea. First normalize both x and y. We
2021 # express y as a rational m/n, with m and n relatively prime
2022 # and n>0. Then for x**y to be exactly representable (at
2023 # *any* precision), xc must be the nth power of a positive
2024 # integer and xe must be divisible by n. If m is negative
2025 # then additionally xc must be a power of either 2 or 5, hence
2026 # a power of 2**n or 5**n.
2027 #
2028 # There's a limit to how small |y| can be: if y=m/n as above
2029 # then:
2030 #
2031 # (1) if xc != 1 then for the result to be representable we
2032 # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So
2033 # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
2034 # 2**(1/|y|), hence xc**|y| < 2 and the result is not
2035 # representable.
2036 #
2037 # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if
2038 # |y| < 1/|xe| then the result is not representable.
2039 #
2040 # Note that since x is not equal to 1, at least one of (1) and
2041 # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
2042 # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
2043 #
2044 # There's also a limit to how large y can be, at least if it's
2045 # positive: the normalized result will have coefficient xc**y,
2046 # so if it's representable then xc**y < 10**p, and y <
2047 # p/log10(xc). Hence if y*log10(xc) >= p then the result is
2048 # not exactly representable.
2049
2050 # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
2051 # so |y| < 1/xe and the result is not representable.
2052 # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
2053 # < 1/nbits(xc).
2054
2055 x = _WorkRep(self)
2056 xc, xe = x.int, x.exp
2057 while xc % 10 == 0:
2058 xc //= 10
2059 xe += 1
2060
2061 y = _WorkRep(other)
2062 yc, ye = y.int, y.exp
2063 while yc % 10 == 0:
2064 yc //= 10
2065 ye += 1
2066
2067 # case where xc == 1: result is 10**(xe*y), with xe*y
2068 # required to be an integer
2069 if xc == 1:
Mark Dickinsona1236312010-07-08 19:03:34 +00002070 xe *= yc
2071 # result is now 10**(xe * 10**ye); xe * 10**ye must be integral
2072 while xe % 10 == 0:
2073 xe //= 10
2074 ye += 1
2075 if ye < 0:
2076 return None
2077 exponent = xe * 10**ye
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002078 if y.sign == 1:
2079 exponent = -exponent
2080 # if other is a nonnegative integer, use ideal exponent
2081 if other._isinteger() and other._sign == 0:
2082 ideal_exponent = self._exp*int(other)
2083 zeros = min(exponent-ideal_exponent, p-1)
2084 else:
2085 zeros = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002086 return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002087
2088 # case where y is negative: xc must be either a power
2089 # of 2 or a power of 5.
2090 if y.sign == 1:
2091 last_digit = xc % 10
2092 if last_digit in (2,4,6,8):
2093 # quick test for power of 2
2094 if xc & -xc != xc:
2095 return None
2096 # now xc is a power of 2; e is its exponent
2097 e = _nbits(xc)-1
2098 # find e*y and xe*y; both must be integers
2099 if ye >= 0:
2100 y_as_int = yc*10**ye
2101 e = e*y_as_int
2102 xe = xe*y_as_int
2103 else:
2104 ten_pow = 10**-ye
2105 e, remainder = divmod(e*yc, ten_pow)
2106 if remainder:
2107 return None
2108 xe, remainder = divmod(xe*yc, ten_pow)
2109 if remainder:
2110 return None
2111
2112 if e*65 >= p*93: # 93/65 > log(10)/log(5)
2113 return None
2114 xc = 5**e
2115
2116 elif last_digit == 5:
2117 # e >= log_5(xc) if xc is a power of 5; we have
2118 # equality all the way up to xc=5**2658
2119 e = _nbits(xc)*28//65
2120 xc, remainder = divmod(5**e, xc)
2121 if remainder:
2122 return None
2123 while xc % 5 == 0:
2124 xc //= 5
2125 e -= 1
2126 if ye >= 0:
2127 y_as_integer = yc*10**ye
2128 e = e*y_as_integer
2129 xe = xe*y_as_integer
2130 else:
2131 ten_pow = 10**-ye
2132 e, remainder = divmod(e*yc, ten_pow)
2133 if remainder:
2134 return None
2135 xe, remainder = divmod(xe*yc, ten_pow)
2136 if remainder:
2137 return None
2138 if e*3 >= p*10: # 10/3 > log(10)/log(2)
2139 return None
2140 xc = 2**e
2141 else:
2142 return None
2143
2144 if xc >= 10**p:
2145 return None
2146 xe = -e-xe
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002147 return _dec_from_triple(0, str(xc), xe)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002148
2149 # now y is positive; find m and n such that y = m/n
2150 if ye >= 0:
2151 m, n = yc*10**ye, 1
2152 else:
2153 if xe != 0 and len(str(abs(yc*xe))) <= -ye:
2154 return None
2155 xc_bits = _nbits(xc)
2156 if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
2157 return None
2158 m, n = yc, 10**(-ye)
2159 while m % 2 == n % 2 == 0:
2160 m //= 2
2161 n //= 2
2162 while m % 5 == n % 5 == 0:
2163 m //= 5
2164 n //= 5
2165
2166 # compute nth root of xc*10**xe
2167 if n > 1:
2168 # if 1 < xc < 2**n then xc isn't an nth power
2169 if xc != 1 and xc_bits <= n:
2170 return None
2171
2172 xe, rem = divmod(xe, n)
2173 if rem != 0:
2174 return None
2175
2176 # compute nth root of xc using Newton's method
2177 a = 1 << -(-_nbits(xc)//n) # initial estimate
2178 while True:
2179 q, r = divmod(xc, a**(n-1))
2180 if a <= q:
2181 break
2182 else:
2183 a = (a*(n-1) + q)//n
2184 if not (a == q and r == 0):
2185 return None
2186 xc = a
2187
2188 # now xc*10**xe is the nth root of the original xc*10**xe
2189 # compute mth power of xc*10**xe
2190
2191 # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
2192 # 10**p and the result is not representable.
2193 if xc > 1 and m > p*100//_log10_lb(xc):
2194 return None
2195 xc = xc**m
2196 xe *= m
2197 if xc > 10**p:
2198 return None
2199
2200 # by this point the result *is* exactly representable
2201 # adjust the exponent to get as close as possible to the ideal
2202 # exponent, if necessary
2203 str_xc = str(xc)
2204 if other._isinteger() and other._sign == 0:
2205 ideal_exponent = self._exp*int(other)
2206 zeros = min(xe-ideal_exponent, p-len(str_xc))
2207 else:
2208 zeros = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002209 return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002210
2211 def __pow__(self, other, modulo=None, context=None):
2212 """Return self ** other [ % modulo].
2213
2214 With two arguments, compute self**other.
2215
2216 With three arguments, compute (self**other) % modulo. For the
2217 three argument form, the following restrictions on the
2218 arguments hold:
2219
2220 - all three arguments must be integral
2221 - other must be nonnegative
2222 - either self or other (or both) must be nonzero
2223 - modulo must be nonzero and must have at most p digits,
2224 where p is the context precision.
2225
2226 If any of these restrictions is violated the InvalidOperation
2227 flag is raised.
2228
2229 The result of pow(self, other, modulo) is identical to the
2230 result that would be obtained by computing (self**other) %
2231 modulo with unbounded precision, but is computed more
2232 efficiently. It is always exact.
2233 """
2234
2235 if modulo is not None:
2236 return self._power_modulo(other, modulo, context)
2237
2238 other = _convert_other(other)
2239 if other is NotImplemented:
2240 return other
2241
2242 if context is None:
2243 context = getcontext()
2244
2245 # either argument is a NaN => result is NaN
2246 ans = self._check_nans(other, context)
2247 if ans:
2248 return ans
2249
2250 # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
2251 if not other:
2252 if not self:
2253 return context._raise_error(InvalidOperation, '0 ** 0')
2254 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002255 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002256
2257 # result has sign 1 iff self._sign is 1 and other is an odd integer
2258 result_sign = 0
2259 if self._sign == 1:
2260 if other._isinteger():
2261 if not other._iseven():
2262 result_sign = 1
2263 else:
2264 # -ve**noninteger = NaN
2265 # (-0)**noninteger = 0**noninteger
2266 if self:
2267 return context._raise_error(InvalidOperation,
2268 'x ** y with x negative and y not an integer')
2269 # negate self, without doing any unwanted rounding
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002270 self = self.copy_negate()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002271
2272 # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
2273 if not self:
2274 if other._sign == 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002275 return _dec_from_triple(result_sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002276 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002277 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002278
2279 # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002280 if self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002281 if other._sign == 0:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002282 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002283 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002284 return _dec_from_triple(result_sign, '0', 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002285
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002286 # 1**other = 1, but the choice of exponent and the flags
2287 # depend on the exponent of self, and on whether other is a
2288 # positive integer, a negative integer, or neither
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002289 if self == _One:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002290 if other._isinteger():
2291 # exp = max(self._exp*max(int(other), 0),
2292 # 1-context.prec) but evaluating int(other) directly
2293 # is dangerous until we know other is small (other
2294 # could be 1e999999999)
2295 if other._sign == 1:
2296 multiplier = 0
2297 elif other > context.prec:
2298 multiplier = context.prec
2299 else:
2300 multiplier = int(other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002301
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002302 exp = self._exp * multiplier
2303 if exp < 1-context.prec:
2304 exp = 1-context.prec
2305 context._raise_error(Rounded)
2306 else:
2307 context._raise_error(Inexact)
2308 context._raise_error(Rounded)
2309 exp = 1-context.prec
2310
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002311 return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002312
2313 # compute adjusted exponent of self
2314 self_adj = self.adjusted()
2315
2316 # self ** infinity is infinity if self > 1, 0 if self < 1
2317 # self ** -infinity is infinity if self < 1, 0 if self > 1
2318 if other._isinfinity():
2319 if (other._sign == 0) == (self_adj < 0):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002320 return _dec_from_triple(result_sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002321 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002322 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002323
2324 # from here on, the result always goes through the call
2325 # to _fix at the end of this function.
2326 ans = None
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002327 exact = False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002328
2329 # crude test to catch cases of extreme overflow/underflow. If
2330 # log10(self)*other >= 10**bound and bound >= len(str(Emax))
2331 # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
2332 # self**other >= 10**(Emax+1), so overflow occurs. The test
2333 # for underflow is similar.
2334 bound = self._log10_exp_bound() + other.adjusted()
2335 if (self_adj >= 0) == (other._sign == 0):
2336 # self > 1 and other +ve, or self < 1 and other -ve
2337 # possibility of overflow
2338 if bound >= len(str(context.Emax)):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002339 ans = _dec_from_triple(result_sign, '1', context.Emax+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002340 else:
2341 # self > 1 and other -ve, or self < 1 and other +ve
2342 # possibility of underflow to 0
2343 Etiny = context.Etiny()
2344 if bound >= len(str(-Etiny)):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002345 ans = _dec_from_triple(result_sign, '1', Etiny-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002346
2347 # try for an exact result with precision +1
2348 if ans is None:
2349 ans = self._power_exact(other, context.prec + 1)
Mark Dickinsone42f1bb2010-07-08 19:09:16 +00002350 if ans is not None:
2351 if result_sign == 1:
2352 ans = _dec_from_triple(1, ans._int, ans._exp)
2353 exact = True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002354
2355 # usual case: inexact result, x**y computed directly as exp(y*log(x))
2356 if ans is None:
2357 p = context.prec
2358 x = _WorkRep(self)
2359 xc, xe = x.int, x.exp
2360 y = _WorkRep(other)
2361 yc, ye = y.int, y.exp
2362 if y.sign == 1:
2363 yc = -yc
2364
2365 # compute correctly rounded result: start with precision +3,
2366 # then increase precision until result is unambiguously roundable
2367 extra = 3
2368 while True:
2369 coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
2370 if coeff % (5*10**(len(str(coeff))-p-1)):
2371 break
2372 extra += 3
2373
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002374 ans = _dec_from_triple(result_sign, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002375
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002376 # unlike exp, ln and log10, the power function respects the
2377 # rounding mode; no need to switch to ROUND_HALF_EVEN here
2378
2379 # There's a difficulty here when 'other' is not an integer and
2380 # the result is exact. In this case, the specification
2381 # requires that the Inexact flag be raised (in spite of
2382 # exactness), but since the result is exact _fix won't do this
2383 # for us. (Correspondingly, the Underflow signal should also
2384 # be raised for subnormal results.) We can't directly raise
2385 # these signals either before or after calling _fix, since
2386 # that would violate the precedence for signals. So we wrap
2387 # the ._fix call in a temporary context, and reraise
2388 # afterwards.
2389 if exact and not other._isinteger():
2390 # pad with zeros up to length context.prec+1 if necessary; this
2391 # ensures that the Rounded signal will be raised.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002392 if len(ans._int) <= context.prec:
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002393 expdiff = context.prec + 1 - len(ans._int)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002394 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
2395 ans._exp-expdiff)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002396
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002397 # create a copy of the current context, with cleared flags/traps
2398 newcontext = context.copy()
2399 newcontext.clear_flags()
2400 for exception in _signals:
2401 newcontext.traps[exception] = 0
2402
2403 # round in the new context
2404 ans = ans._fix(newcontext)
2405
2406 # raise Inexact, and if necessary, Underflow
2407 newcontext._raise_error(Inexact)
2408 if newcontext.flags[Subnormal]:
2409 newcontext._raise_error(Underflow)
2410
2411 # propagate signals to the original context; _fix could
2412 # have raised any of Overflow, Underflow, Subnormal,
2413 # Inexact, Rounded, Clamped. Overflow needs the correct
2414 # arguments. Note that the order of the exceptions is
2415 # important here.
2416 if newcontext.flags[Overflow]:
2417 context._raise_error(Overflow, 'above Emax', ans._sign)
2418 for exception in Underflow, Subnormal, Inexact, Rounded, Clamped:
2419 if newcontext.flags[exception]:
2420 context._raise_error(exception)
2421
2422 else:
2423 ans = ans._fix(context)
2424
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002425 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002426
2427 def __rpow__(self, other, context=None):
2428 """Swaps self/other and returns __pow__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002429 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00002430 if other is NotImplemented:
2431 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002432 return other.__pow__(self, context=context)
2433
2434 def normalize(self, context=None):
2435 """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002436
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002437 if context is None:
2438 context = getcontext()
2439
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002440 if self._is_special:
2441 ans = self._check_nans(context=context)
2442 if ans:
2443 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002444
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002445 dup = self._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002446 if dup._isinfinity():
2447 return dup
2448
2449 if not dup:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002450 return _dec_from_triple(dup._sign, '0', 0)
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00002451 exp_max = [context.Emax, context.Etop()][context.clamp]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002452 end = len(dup._int)
2453 exp = dup._exp
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002454 while dup._int[end-1] == '0' and exp < exp_max:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002455 exp += 1
2456 end -= 1
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002457 return _dec_from_triple(dup._sign, dup._int[:end], exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002458
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002459 def quantize(self, exp, rounding=None, context=None, watchexp=True):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002460 """Quantize self so its exponent is the same as that of exp.
2461
2462 Similar to self._rescale(exp._exp) but with error checking.
2463 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002464 exp = _convert_other(exp, raiseit=True)
2465
2466 if context is None:
2467 context = getcontext()
2468 if rounding is None:
2469 rounding = context.rounding
2470
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002471 if self._is_special or exp._is_special:
2472 ans = self._check_nans(exp, context)
2473 if ans:
2474 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002475
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002476 if exp._isinfinity() or self._isinfinity():
2477 if exp._isinfinity() and self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002478 return Decimal(self) # if both are inf, it is OK
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002479 return context._raise_error(InvalidOperation,
2480 'quantize with one INF')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002481
2482 # if we're not watching exponents, do a simple rescale
2483 if not watchexp:
2484 ans = self._rescale(exp._exp, rounding)
2485 # raise Inexact and Rounded where appropriate
2486 if ans._exp > self._exp:
2487 context._raise_error(Rounded)
2488 if ans != self:
2489 context._raise_error(Inexact)
2490 return ans
2491
2492 # exp._exp should be between Etiny and Emax
2493 if not (context.Etiny() <= exp._exp <= context.Emax):
2494 return context._raise_error(InvalidOperation,
2495 'target exponent out of bounds in quantize')
2496
2497 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002498 ans = _dec_from_triple(self._sign, '0', exp._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002499 return ans._fix(context)
2500
2501 self_adjusted = self.adjusted()
2502 if self_adjusted > context.Emax:
2503 return context._raise_error(InvalidOperation,
2504 'exponent of quantize result too large for current context')
2505 if self_adjusted - exp._exp + 1 > context.prec:
2506 return context._raise_error(InvalidOperation,
2507 'quantize result has too many digits for current context')
2508
2509 ans = self._rescale(exp._exp, rounding)
2510 if ans.adjusted() > context.Emax:
2511 return context._raise_error(InvalidOperation,
2512 'exponent of quantize result too large for current context')
2513 if len(ans._int) > context.prec:
2514 return context._raise_error(InvalidOperation,
2515 'quantize result has too many digits for current context')
2516
2517 # raise appropriate flags
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002518 if ans and ans.adjusted() < context.Emin:
2519 context._raise_error(Subnormal)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002520 if ans._exp > self._exp:
2521 if ans != self:
2522 context._raise_error(Inexact)
2523 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002524
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002525 # call to fix takes care of any necessary folddown, and
2526 # signals Clamped if necessary
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002527 ans = ans._fix(context)
2528 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002529
2530 def same_quantum(self, other):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002531 """Return True if self and other have the same exponent; otherwise
2532 return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002533
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002534 If either operand is a special value, the following rules are used:
2535 * return True if both operands are infinities
2536 * return True if both operands are NaNs
2537 * otherwise, return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002538 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002539 other = _convert_other(other, raiseit=True)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002540 if self._is_special or other._is_special:
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002541 return (self.is_nan() and other.is_nan() or
2542 self.is_infinite() and other.is_infinite())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002543 return self._exp == other._exp
2544
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002545 def _rescale(self, exp, rounding):
2546 """Rescale self so that the exponent is exp, either by padding with zeros
2547 or by truncating digits, using the given rounding mode.
2548
2549 Specials are returned without change. This operation is
2550 quiet: it raises no flags, and uses no information from the
2551 context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002552
2553 exp = exp to scale to (an integer)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002554 rounding = rounding mode
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002555 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002556 if self._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002557 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002558 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002559 return _dec_from_triple(self._sign, '0', exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002560
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002561 if self._exp >= exp:
2562 # pad answer with zeros if necessary
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002563 return _dec_from_triple(self._sign,
2564 self._int + '0'*(self._exp - exp), exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002565
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002566 # too many digits; round and lose data. If self.adjusted() <
2567 # exp-1, replace self by 10**(exp-1) before rounding
2568 digits = len(self._int) + self._exp - exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002569 if digits < 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002570 self = _dec_from_triple(self._sign, '1', exp-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002571 digits = 0
Alexander Belopolsky1a20c122011-04-12 23:03:39 -04002572 this_function = self._pick_rounding_function[rounding]
2573 changed = this_function(self, digits)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00002574 coeff = self._int[:digits] or '0'
2575 if changed == 1:
2576 coeff = str(int(coeff)+1)
2577 return _dec_from_triple(self._sign, coeff, exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002578
Christian Heimesf16baeb2008-02-29 14:57:44 +00002579 def _round(self, places, rounding):
2580 """Round a nonzero, nonspecial Decimal to a fixed number of
2581 significant figures, using the given rounding mode.
2582
2583 Infinities, NaNs and zeros are returned unaltered.
2584
2585 This operation is quiet: it raises no flags, and uses no
2586 information from the context.
2587
2588 """
2589 if places <= 0:
2590 raise ValueError("argument should be at least 1 in _round")
2591 if self._is_special or not self:
2592 return Decimal(self)
2593 ans = self._rescale(self.adjusted()+1-places, rounding)
2594 # it can happen that the rescale alters the adjusted exponent;
2595 # for example when rounding 99.97 to 3 significant figures.
2596 # When this happens we end up with an extra 0 at the end of
2597 # the number; a second rescale fixes this.
2598 if ans.adjusted() != self.adjusted():
2599 ans = ans._rescale(ans.adjusted()+1-places, rounding)
2600 return ans
2601
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002602 def to_integral_exact(self, rounding=None, context=None):
2603 """Rounds to a nearby integer.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002604
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002605 If no rounding mode is specified, take the rounding mode from
2606 the context. This method raises the Rounded and Inexact flags
2607 when appropriate.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002608
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002609 See also: to_integral_value, which does exactly the same as
2610 this method except that it doesn't raise Inexact or Rounded.
2611 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002612 if self._is_special:
2613 ans = self._check_nans(context=context)
2614 if ans:
2615 return ans
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002616 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002617 if self._exp >= 0:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002618 return Decimal(self)
2619 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002620 return _dec_from_triple(self._sign, '0', 0)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002621 if context is None:
2622 context = getcontext()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002623 if rounding is None:
2624 rounding = context.rounding
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002625 ans = self._rescale(0, rounding)
2626 if ans != self:
2627 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002628 context._raise_error(Rounded)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002629 return ans
2630
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002631 def to_integral_value(self, rounding=None, context=None):
2632 """Rounds to the nearest integer, without raising inexact, rounded."""
2633 if context is None:
2634 context = getcontext()
2635 if rounding is None:
2636 rounding = context.rounding
2637 if self._is_special:
2638 ans = self._check_nans(context=context)
2639 if ans:
2640 return ans
2641 return Decimal(self)
2642 if self._exp >= 0:
2643 return Decimal(self)
2644 else:
2645 return self._rescale(0, rounding)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002646
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002647 # the method name changed, but we provide also the old one, for compatibility
2648 to_integral = to_integral_value
2649
2650 def sqrt(self, context=None):
2651 """Return the square root of self."""
Christian Heimes0348fb62008-03-26 12:55:56 +00002652 if context is None:
2653 context = getcontext()
2654
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002655 if self._is_special:
2656 ans = self._check_nans(context=context)
2657 if ans:
2658 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002659
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002660 if self._isinfinity() and self._sign == 0:
2661 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002662
2663 if not self:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002664 # exponent = self._exp // 2. sqrt(-0) = -0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002665 ans = _dec_from_triple(self._sign, '0', self._exp // 2)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002666 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002667
2668 if self._sign == 1:
2669 return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
2670
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002671 # At this point self represents a positive number. Let p be
2672 # the desired precision and express self in the form c*100**e
2673 # with c a positive real number and e an integer, c and e
2674 # being chosen so that 100**(p-1) <= c < 100**p. Then the
2675 # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
2676 # <= sqrt(c) < 10**p, so the closest representable Decimal at
2677 # precision p is n*10**e where n = round_half_even(sqrt(c)),
2678 # the closest integer to sqrt(c) with the even integer chosen
2679 # in the case of a tie.
2680 #
2681 # To ensure correct rounding in all cases, we use the
2682 # following trick: we compute the square root to an extra
2683 # place (precision p+1 instead of precision p), rounding down.
2684 # Then, if the result is inexact and its last digit is 0 or 5,
2685 # we increase the last digit to 1 or 6 respectively; if it's
2686 # exact we leave the last digit alone. Now the final round to
2687 # p places (or fewer in the case of underflow) will round
2688 # correctly and raise the appropriate flags.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002689
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002690 # use an extra digit of precision
2691 prec = context.prec+1
2692
2693 # write argument in the form c*100**e where e = self._exp//2
2694 # is the 'ideal' exponent, to be used if the square root is
2695 # exactly representable. l is the number of 'digits' of c in
2696 # base 100, so that 100**(l-1) <= c < 100**l.
2697 op = _WorkRep(self)
2698 e = op.exp >> 1
2699 if op.exp & 1:
2700 c = op.int * 10
2701 l = (len(self._int) >> 1) + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002702 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002703 c = op.int
2704 l = len(self._int)+1 >> 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002705
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002706 # rescale so that c has exactly prec base 100 'digits'
2707 shift = prec-l
2708 if shift >= 0:
2709 c *= 100**shift
2710 exact = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002711 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002712 c, remainder = divmod(c, 100**-shift)
2713 exact = not remainder
2714 e -= shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002715
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002716 # find n = floor(sqrt(c)) using Newton's method
2717 n = 10**prec
2718 while True:
2719 q = c//n
2720 if n <= q:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002721 break
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002722 else:
2723 n = n + q >> 1
2724 exact = exact and n*n == c
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002725
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002726 if exact:
2727 # result is exact; rescale to use ideal exponent e
2728 if shift >= 0:
2729 # assert n % 10**shift == 0
2730 n //= 10**shift
2731 else:
2732 n *= 10**-shift
2733 e += shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002734 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002735 # result is not exact; fix last digit as described above
2736 if n % 5 == 0:
2737 n += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002738
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002739 ans = _dec_from_triple(0, str(n), e)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002740
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002741 # round, and fit to current context
2742 context = context._shallow_copy()
2743 rounding = context._set_rounding(ROUND_HALF_EVEN)
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002744 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002745 context.rounding = rounding
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002746
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002747 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002748
2749 def max(self, other, context=None):
2750 """Returns the larger value.
2751
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002752 Like max(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002753 NaN (and signals if one is sNaN). Also rounds.
2754 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002755 other = _convert_other(other, raiseit=True)
2756
2757 if context is None:
2758 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002759
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002760 if self._is_special or other._is_special:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002761 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002762 # number is always returned
2763 sn = self._isnan()
2764 on = other._isnan()
2765 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00002766 if on == 1 and sn == 0:
2767 return self._fix(context)
2768 if sn == 1 and on == 0:
2769 return other._fix(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002770 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002771
Christian Heimes77c02eb2008-02-09 02:18:51 +00002772 c = self._cmp(other)
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002773 if c == 0:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002774 # If both operands are finite and equal in numerical value
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002775 # then an ordering is applied:
2776 #
Guido van Rossumd8faa362007-04-27 19:54:29 +00002777 # If the signs differ then max returns the operand with the
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002778 # positive sign and min returns the operand with the negative sign
2779 #
Guido van Rossumd8faa362007-04-27 19:54:29 +00002780 # If the signs are the same then the exponent is used to select
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002781 # the result. This is exactly the ordering used in compare_total.
2782 c = self.compare_total(other)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002783
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002784 if c == -1:
2785 ans = other
2786 else:
2787 ans = self
2788
Christian Heimes2c181612007-12-17 20:04:13 +00002789 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002790
2791 def min(self, other, context=None):
2792 """Returns the smaller value.
2793
Guido van Rossumd8faa362007-04-27 19:54:29 +00002794 Like min(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002795 NaN (and signals if one is sNaN). Also rounds.
2796 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002797 other = _convert_other(other, raiseit=True)
2798
2799 if context is None:
2800 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002801
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002802 if self._is_special or other._is_special:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002803 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002804 # number is always returned
2805 sn = self._isnan()
2806 on = other._isnan()
2807 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00002808 if on == 1 and sn == 0:
2809 return self._fix(context)
2810 if sn == 1 and on == 0:
2811 return other._fix(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002812 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002813
Christian Heimes77c02eb2008-02-09 02:18:51 +00002814 c = self._cmp(other)
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002815 if c == 0:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002816 c = self.compare_total(other)
2817
2818 if c == -1:
2819 ans = self
2820 else:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002821 ans = other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002822
Christian Heimes2c181612007-12-17 20:04:13 +00002823 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002824
2825 def _isinteger(self):
2826 """Returns whether self is an integer"""
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002827 if self._is_special:
2828 return False
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002829 if self._exp >= 0:
2830 return True
2831 rest = self._int[self._exp:]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002832 return rest == '0'*len(rest)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002833
2834 def _iseven(self):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002835 """Returns True if self is even. Assumes self is an integer."""
2836 if not self or self._exp > 0:
2837 return True
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002838 return self._int[-1+self._exp] in '02468'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002839
2840 def adjusted(self):
2841 """Return the adjusted exponent of self"""
2842 try:
2843 return self._exp + len(self._int) - 1
Guido van Rossumd8faa362007-04-27 19:54:29 +00002844 # If NaN or Infinity, self._exp is string
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002845 except TypeError:
2846 return 0
2847
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002848 def canonical(self, context=None):
2849 """Returns the same Decimal object.
2850
2851 As we do not have different encodings for the same number, the
2852 received object already is in its canonical form.
2853 """
2854 return self
2855
2856 def compare_signal(self, other, context=None):
2857 """Compares self to the other operand numerically.
2858
2859 It's pretty much like compare(), but all NaNs signal, with signaling
2860 NaNs taking precedence over quiet NaNs.
2861 """
Christian Heimes77c02eb2008-02-09 02:18:51 +00002862 other = _convert_other(other, raiseit = True)
2863 ans = self._compare_check_nans(other, context)
2864 if ans:
2865 return ans
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002866 return self.compare(other, context=context)
2867
2868 def compare_total(self, other):
2869 """Compares self to other using the abstract representations.
2870
2871 This is not like the standard compare, which use their numerical
2872 value. Note that a total ordering is defined for all possible abstract
2873 representations.
2874 """
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00002875 other = _convert_other(other, raiseit=True)
2876
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002877 # if one is negative and the other is positive, it's easy
2878 if self._sign and not other._sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002879 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002880 if not self._sign and other._sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002881 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002882 sign = self._sign
2883
2884 # let's handle both NaN types
2885 self_nan = self._isnan()
2886 other_nan = other._isnan()
2887 if self_nan or other_nan:
2888 if self_nan == other_nan:
Mark Dickinsond314e1b2009-08-28 13:39:53 +00002889 # compare payloads as though they're integers
2890 self_key = len(self._int), self._int
2891 other_key = len(other._int), other._int
2892 if self_key < other_key:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002893 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002894 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002895 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002896 return _NegativeOne
Mark Dickinsond314e1b2009-08-28 13:39:53 +00002897 if self_key > other_key:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002898 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002899 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002900 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002901 return _One
2902 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002903
2904 if sign:
2905 if self_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002906 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002907 if other_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002908 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002909 if self_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002910 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002911 if other_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002912 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002913 else:
2914 if self_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002915 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002916 if other_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002917 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002918 if self_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002919 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002920 if other_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002921 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002922
2923 if self < other:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002924 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002925 if self > other:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002926 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002927
2928 if self._exp < other._exp:
2929 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002930 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002931 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002932 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002933 if self._exp > other._exp:
2934 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002935 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002936 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002937 return _One
2938 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002939
2940
2941 def compare_total_mag(self, other):
2942 """Compares self to other using abstract repr., ignoring sign.
2943
2944 Like compare_total, but with operand's sign ignored and assumed to be 0.
2945 """
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00002946 other = _convert_other(other, raiseit=True)
2947
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002948 s = self.copy_abs()
2949 o = other.copy_abs()
2950 return s.compare_total(o)
2951
2952 def copy_abs(self):
2953 """Returns a copy with the sign set to 0. """
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002954 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002955
2956 def copy_negate(self):
2957 """Returns a copy with the sign inverted."""
2958 if self._sign:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002959 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002960 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002961 return _dec_from_triple(1, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002962
2963 def copy_sign(self, other):
2964 """Returns self with the sign of other."""
Mark Dickinson84230a12010-02-18 14:49:50 +00002965 other = _convert_other(other, raiseit=True)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002966 return _dec_from_triple(other._sign, self._int,
2967 self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002968
2969 def exp(self, context=None):
2970 """Returns e ** self."""
2971
2972 if context is None:
2973 context = getcontext()
2974
2975 # exp(NaN) = NaN
2976 ans = self._check_nans(context=context)
2977 if ans:
2978 return ans
2979
2980 # exp(-Infinity) = 0
2981 if self._isinfinity() == -1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002982 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002983
2984 # exp(0) = 1
2985 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002986 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002987
2988 # exp(Infinity) = Infinity
2989 if self._isinfinity() == 1:
2990 return Decimal(self)
2991
2992 # the result is now guaranteed to be inexact (the true
2993 # mathematical result is transcendental). There's no need to
2994 # raise Rounded and Inexact here---they'll always be raised as
2995 # a result of the call to _fix.
2996 p = context.prec
2997 adj = self.adjusted()
2998
2999 # we only need to do any computation for quite a small range
3000 # of adjusted exponents---for example, -29 <= adj <= 10 for
3001 # the default context. For smaller exponent the result is
3002 # indistinguishable from 1 at the given precision, while for
3003 # larger exponent the result either overflows or underflows.
3004 if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
3005 # overflow
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003006 ans = _dec_from_triple(0, '1', context.Emax+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003007 elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
3008 # underflow to 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003009 ans = _dec_from_triple(0, '1', context.Etiny()-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003010 elif self._sign == 0 and adj < -p:
3011 # p+1 digits; final round will raise correct flags
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003012 ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003013 elif self._sign == 1 and adj < -p-1:
3014 # p+1 digits; final round will raise correct flags
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003015 ans = _dec_from_triple(0, '9'*(p+1), -p-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003016 # general case
3017 else:
3018 op = _WorkRep(self)
3019 c, e = op.int, op.exp
3020 if op.sign == 1:
3021 c = -c
3022
3023 # compute correctly rounded result: increase precision by
3024 # 3 digits at a time until we get an unambiguously
3025 # roundable result
3026 extra = 3
3027 while True:
3028 coeff, exp = _dexp(c, e, p+extra)
3029 if coeff % (5*10**(len(str(coeff))-p-1)):
3030 break
3031 extra += 3
3032
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003033 ans = _dec_from_triple(0, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003034
3035 # at this stage, ans should round correctly with *any*
3036 # rounding mode, not just with ROUND_HALF_EVEN
3037 context = context._shallow_copy()
3038 rounding = context._set_rounding(ROUND_HALF_EVEN)
3039 ans = ans._fix(context)
3040 context.rounding = rounding
3041
3042 return ans
3043
3044 def is_canonical(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003045 """Return True if self is canonical; otherwise return False.
3046
3047 Currently, the encoding of a Decimal instance is always
3048 canonical, so this method returns True for any Decimal.
3049 """
3050 return True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003051
3052 def is_finite(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003053 """Return True if self is finite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003054
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003055 A Decimal instance is considered finite if it is neither
3056 infinite nor a NaN.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003057 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003058 return not self._is_special
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003059
3060 def is_infinite(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003061 """Return True if self is infinite; otherwise return False."""
3062 return self._exp == 'F'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003063
3064 def is_nan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003065 """Return True if self is a qNaN or sNaN; otherwise return False."""
3066 return self._exp in ('n', 'N')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003067
3068 def is_normal(self, context=None):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003069 """Return True if self is a normal number; otherwise return False."""
3070 if self._is_special or not self:
3071 return False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003072 if context is None:
3073 context = getcontext()
Mark Dickinson06bb6742009-10-20 13:38:04 +00003074 return context.Emin <= self.adjusted()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003075
3076 def is_qnan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003077 """Return True if self is a quiet NaN; otherwise return False."""
3078 return self._exp == 'n'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003079
3080 def is_signed(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003081 """Return True if self is negative; otherwise return False."""
3082 return self._sign == 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003083
3084 def is_snan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003085 """Return True if self is a signaling NaN; otherwise return False."""
3086 return self._exp == 'N'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003087
3088 def is_subnormal(self, context=None):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003089 """Return True if self is subnormal; otherwise return False."""
3090 if self._is_special or not self:
3091 return False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003092 if context is None:
3093 context = getcontext()
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003094 return self.adjusted() < context.Emin
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003095
3096 def is_zero(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003097 """Return True if self is a zero; otherwise return False."""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003098 return not self._is_special and self._int == '0'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003099
3100 def _ln_exp_bound(self):
3101 """Compute a lower bound for the adjusted exponent of self.ln().
3102 In other words, compute r such that self.ln() >= 10**r. Assumes
3103 that self is finite and positive and that self != 1.
3104 """
3105
3106 # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
3107 adj = self._exp + len(self._int) - 1
3108 if adj >= 1:
3109 # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
3110 return len(str(adj*23//10)) - 1
3111 if adj <= -2:
3112 # argument <= 0.1
3113 return len(str((-1-adj)*23//10)) - 1
3114 op = _WorkRep(self)
3115 c, e = op.int, op.exp
3116 if adj == 0:
3117 # 1 < self < 10
3118 num = str(c-10**-e)
3119 den = str(c)
3120 return len(num) - len(den) - (num < den)
3121 # adj == -1, 0.1 <= self < 1
3122 return e + len(str(10**-e - c)) - 1
3123
3124
3125 def ln(self, context=None):
3126 """Returns the natural (base e) logarithm of self."""
3127
3128 if context is None:
3129 context = getcontext()
3130
3131 # ln(NaN) = NaN
3132 ans = self._check_nans(context=context)
3133 if ans:
3134 return ans
3135
3136 # ln(0.0) == -Infinity
3137 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003138 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003139
3140 # ln(Infinity) = Infinity
3141 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003142 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003143
3144 # ln(1.0) == 0.0
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003145 if self == _One:
3146 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003147
3148 # ln(negative) raises InvalidOperation
3149 if self._sign == 1:
3150 return context._raise_error(InvalidOperation,
3151 'ln of a negative value')
3152
3153 # result is irrational, so necessarily inexact
3154 op = _WorkRep(self)
3155 c, e = op.int, op.exp
3156 p = context.prec
3157
3158 # correctly rounded result: repeatedly increase precision by 3
3159 # until we get an unambiguously roundable result
3160 places = p - self._ln_exp_bound() + 2 # at least p+3 places
3161 while True:
3162 coeff = _dlog(c, e, places)
3163 # assert len(str(abs(coeff)))-p >= 1
3164 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3165 break
3166 places += 3
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003167 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003168
3169 context = context._shallow_copy()
3170 rounding = context._set_rounding(ROUND_HALF_EVEN)
3171 ans = ans._fix(context)
3172 context.rounding = rounding
3173 return ans
3174
3175 def _log10_exp_bound(self):
3176 """Compute a lower bound for the adjusted exponent of self.log10().
3177 In other words, find r such that self.log10() >= 10**r.
3178 Assumes that self is finite and positive and that self != 1.
3179 """
3180
3181 # For x >= 10 or x < 0.1 we only need a bound on the integer
3182 # part of log10(self), and this comes directly from the
3183 # exponent of x. For 0.1 <= x <= 10 we use the inequalities
3184 # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
3185 # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0
3186
3187 adj = self._exp + len(self._int) - 1
3188 if adj >= 1:
3189 # self >= 10
3190 return len(str(adj))-1
3191 if adj <= -2:
3192 # self < 0.1
3193 return len(str(-1-adj))-1
3194 op = _WorkRep(self)
3195 c, e = op.int, op.exp
3196 if adj == 0:
3197 # 1 < self < 10
3198 num = str(c-10**-e)
3199 den = str(231*c)
3200 return len(num) - len(den) - (num < den) + 2
3201 # adj == -1, 0.1 <= self < 1
3202 num = str(10**-e-c)
3203 return len(num) + e - (num < "231") - 1
3204
3205 def log10(self, context=None):
3206 """Returns the base 10 logarithm of self."""
3207
3208 if context is None:
3209 context = getcontext()
3210
3211 # log10(NaN) = NaN
3212 ans = self._check_nans(context=context)
3213 if ans:
3214 return ans
3215
3216 # log10(0.0) == -Infinity
3217 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003218 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003219
3220 # log10(Infinity) = Infinity
3221 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003222 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003223
3224 # log10(negative or -Infinity) raises InvalidOperation
3225 if self._sign == 1:
3226 return context._raise_error(InvalidOperation,
3227 'log10 of a negative value')
3228
3229 # log10(10**n) = n
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003230 if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003231 # answer may need rounding
3232 ans = Decimal(self._exp + len(self._int) - 1)
3233 else:
3234 # result is irrational, so necessarily inexact
3235 op = _WorkRep(self)
3236 c, e = op.int, op.exp
3237 p = context.prec
3238
3239 # correctly rounded result: repeatedly increase precision
3240 # until result is unambiguously roundable
3241 places = p-self._log10_exp_bound()+2
3242 while True:
3243 coeff = _dlog10(c, e, places)
3244 # assert len(str(abs(coeff)))-p >= 1
3245 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3246 break
3247 places += 3
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003248 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003249
3250 context = context._shallow_copy()
3251 rounding = context._set_rounding(ROUND_HALF_EVEN)
3252 ans = ans._fix(context)
3253 context.rounding = rounding
3254 return ans
3255
3256 def logb(self, context=None):
3257 """ Returns the exponent of the magnitude of self's MSD.
3258
3259 The result is the integer which is the exponent of the magnitude
3260 of the most significant digit of self (as though it were truncated
3261 to a single digit while maintaining the value of that digit and
3262 without limiting the resulting exponent).
3263 """
3264 # logb(NaN) = NaN
3265 ans = self._check_nans(context=context)
3266 if ans:
3267 return ans
3268
3269 if context is None:
3270 context = getcontext()
3271
3272 # logb(+/-Inf) = +Inf
3273 if self._isinfinity():
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003274 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003275
3276 # logb(0) = -Inf, DivisionByZero
3277 if not self:
3278 return context._raise_error(DivisionByZero, 'logb(0)', 1)
3279
3280 # otherwise, simply return the adjusted exponent of self, as a
3281 # Decimal. Note that no attempt is made to fit the result
3282 # into the current context.
Mark Dickinson56df8872009-10-07 19:23:50 +00003283 ans = Decimal(self.adjusted())
3284 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003285
3286 def _islogical(self):
3287 """Return True if self is a logical operand.
3288
Christian Heimes679db4a2008-01-18 09:56:22 +00003289 For being logical, it must be a finite number with a sign of 0,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003290 an exponent of 0, and a coefficient whose digits must all be
3291 either 0 or 1.
3292 """
3293 if self._sign != 0 or self._exp != 0:
3294 return False
3295 for dig in self._int:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003296 if dig not in '01':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003297 return False
3298 return True
3299
3300 def _fill_logical(self, context, opa, opb):
3301 dif = context.prec - len(opa)
3302 if dif > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003303 opa = '0'*dif + opa
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003304 elif dif < 0:
3305 opa = opa[-context.prec:]
3306 dif = context.prec - len(opb)
3307 if dif > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003308 opb = '0'*dif + opb
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003309 elif dif < 0:
3310 opb = opb[-context.prec:]
3311 return opa, opb
3312
3313 def logical_and(self, other, context=None):
3314 """Applies an 'and' operation between self and other's digits."""
3315 if context is None:
3316 context = getcontext()
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003317
3318 other = _convert_other(other, raiseit=True)
3319
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003320 if not self._islogical() or not other._islogical():
3321 return context._raise_error(InvalidOperation)
3322
3323 # fill to context.prec
3324 (opa, opb) = self._fill_logical(context, self._int, other._int)
3325
3326 # make the operation, and clean starting zeroes
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003327 result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
3328 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003329
3330 def logical_invert(self, context=None):
3331 """Invert all its digits."""
3332 if context is None:
3333 context = getcontext()
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003334 return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
3335 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003336
3337 def logical_or(self, other, context=None):
3338 """Applies an 'or' operation between self and other's digits."""
3339 if context is None:
3340 context = getcontext()
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003341
3342 other = _convert_other(other, raiseit=True)
3343
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003344 if not self._islogical() or not other._islogical():
3345 return context._raise_error(InvalidOperation)
3346
3347 # fill to context.prec
3348 (opa, opb) = self._fill_logical(context, self._int, other._int)
3349
3350 # make the operation, and clean starting zeroes
Mark Dickinson315a20a2009-01-04 21:34:18 +00003351 result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)])
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003352 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003353
3354 def logical_xor(self, other, context=None):
3355 """Applies an 'xor' operation between self and other's digits."""
3356 if context is None:
3357 context = getcontext()
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003358
3359 other = _convert_other(other, raiseit=True)
3360
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003361 if not self._islogical() or not other._islogical():
3362 return context._raise_error(InvalidOperation)
3363
3364 # fill to context.prec
3365 (opa, opb) = self._fill_logical(context, self._int, other._int)
3366
3367 # make the operation, and clean starting zeroes
Mark Dickinson315a20a2009-01-04 21:34:18 +00003368 result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)])
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003369 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003370
3371 def max_mag(self, other, context=None):
3372 """Compares the values numerically with their sign ignored."""
3373 other = _convert_other(other, raiseit=True)
3374
3375 if context is None:
3376 context = getcontext()
3377
3378 if self._is_special or other._is_special:
3379 # If one operand is a quiet NaN and the other is number, then the
3380 # number is always returned
3381 sn = self._isnan()
3382 on = other._isnan()
3383 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00003384 if on == 1 and sn == 0:
3385 return self._fix(context)
3386 if sn == 1 and on == 0:
3387 return other._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003388 return self._check_nans(other, context)
3389
Christian Heimes77c02eb2008-02-09 02:18:51 +00003390 c = self.copy_abs()._cmp(other.copy_abs())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003391 if c == 0:
3392 c = self.compare_total(other)
3393
3394 if c == -1:
3395 ans = other
3396 else:
3397 ans = self
3398
Christian Heimes2c181612007-12-17 20:04:13 +00003399 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003400
3401 def min_mag(self, other, context=None):
3402 """Compares the values numerically with their sign ignored."""
3403 other = _convert_other(other, raiseit=True)
3404
3405 if context is None:
3406 context = getcontext()
3407
3408 if self._is_special or other._is_special:
3409 # If one operand is a quiet NaN and the other is number, then the
3410 # number is always returned
3411 sn = self._isnan()
3412 on = other._isnan()
3413 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00003414 if on == 1 and sn == 0:
3415 return self._fix(context)
3416 if sn == 1 and on == 0:
3417 return other._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003418 return self._check_nans(other, context)
3419
Christian Heimes77c02eb2008-02-09 02:18:51 +00003420 c = self.copy_abs()._cmp(other.copy_abs())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003421 if c == 0:
3422 c = self.compare_total(other)
3423
3424 if c == -1:
3425 ans = self
3426 else:
3427 ans = other
3428
Christian Heimes2c181612007-12-17 20:04:13 +00003429 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003430
3431 def next_minus(self, context=None):
3432 """Returns the largest representable number smaller than itself."""
3433 if context is None:
3434 context = getcontext()
3435
3436 ans = self._check_nans(context=context)
3437 if ans:
3438 return ans
3439
3440 if self._isinfinity() == -1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003441 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003442 if self._isinfinity() == 1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003443 return _dec_from_triple(0, '9'*context.prec, context.Etop())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003444
3445 context = context.copy()
3446 context._set_rounding(ROUND_FLOOR)
3447 context._ignore_all_flags()
3448 new_self = self._fix(context)
3449 if new_self != self:
3450 return new_self
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003451 return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
3452 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003453
3454 def next_plus(self, context=None):
3455 """Returns the smallest representable number larger than itself."""
3456 if context is None:
3457 context = getcontext()
3458
3459 ans = self._check_nans(context=context)
3460 if ans:
3461 return ans
3462
3463 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003464 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003465 if self._isinfinity() == -1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003466 return _dec_from_triple(1, '9'*context.prec, context.Etop())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003467
3468 context = context.copy()
3469 context._set_rounding(ROUND_CEILING)
3470 context._ignore_all_flags()
3471 new_self = self._fix(context)
3472 if new_self != self:
3473 return new_self
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003474 return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
3475 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003476
3477 def next_toward(self, other, context=None):
3478 """Returns the number closest to self, in the direction towards other.
3479
3480 The result is the closest representable number to self
3481 (excluding self) that is in the direction towards other,
3482 unless both have the same value. If the two operands are
3483 numerically equal, then the result is a copy of self with the
3484 sign set to be the same as the sign of other.
3485 """
3486 other = _convert_other(other, raiseit=True)
3487
3488 if context is None:
3489 context = getcontext()
3490
3491 ans = self._check_nans(other, context)
3492 if ans:
3493 return ans
3494
Christian Heimes77c02eb2008-02-09 02:18:51 +00003495 comparison = self._cmp(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003496 if comparison == 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003497 return self.copy_sign(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003498
3499 if comparison == -1:
3500 ans = self.next_plus(context)
3501 else: # comparison == 1
3502 ans = self.next_minus(context)
3503
3504 # decide which flags to raise using value of ans
3505 if ans._isinfinity():
3506 context._raise_error(Overflow,
3507 'Infinite result from next_toward',
3508 ans._sign)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003509 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00003510 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003511 elif ans.adjusted() < context.Emin:
3512 context._raise_error(Underflow)
3513 context._raise_error(Subnormal)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003514 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00003515 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003516 # if precision == 1 then we don't raise Clamped for a
3517 # result 0E-Etiny.
3518 if not ans:
3519 context._raise_error(Clamped)
3520
3521 return ans
3522
3523 def number_class(self, context=None):
3524 """Returns an indication of the class of self.
3525
3526 The class is one of the following strings:
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003527 sNaN
3528 NaN
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003529 -Infinity
3530 -Normal
3531 -Subnormal
3532 -Zero
3533 +Zero
3534 +Subnormal
3535 +Normal
3536 +Infinity
3537 """
3538 if self.is_snan():
3539 return "sNaN"
3540 if self.is_qnan():
3541 return "NaN"
3542 inf = self._isinfinity()
3543 if inf == 1:
3544 return "+Infinity"
3545 if inf == -1:
3546 return "-Infinity"
3547 if self.is_zero():
3548 if self._sign:
3549 return "-Zero"
3550 else:
3551 return "+Zero"
3552 if context is None:
3553 context = getcontext()
3554 if self.is_subnormal(context=context):
3555 if self._sign:
3556 return "-Subnormal"
3557 else:
3558 return "+Subnormal"
3559 # just a normal, regular, boring number, :)
3560 if self._sign:
3561 return "-Normal"
3562 else:
3563 return "+Normal"
3564
3565 def radix(self):
3566 """Just returns 10, as this is Decimal, :)"""
3567 return Decimal(10)
3568
3569 def rotate(self, other, context=None):
3570 """Returns a rotated copy of self, value-of-other times."""
3571 if context is None:
3572 context = getcontext()
3573
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003574 other = _convert_other(other, raiseit=True)
3575
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003576 ans = self._check_nans(other, context)
3577 if ans:
3578 return ans
3579
3580 if other._exp != 0:
3581 return context._raise_error(InvalidOperation)
3582 if not (-context.prec <= int(other) <= context.prec):
3583 return context._raise_error(InvalidOperation)
3584
3585 if self._isinfinity():
3586 return Decimal(self)
3587
3588 # get values, pad if necessary
3589 torot = int(other)
3590 rotdig = self._int
3591 topad = context.prec - len(rotdig)
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003592 if topad > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003593 rotdig = '0'*topad + rotdig
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003594 elif topad < 0:
3595 rotdig = rotdig[-topad:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003596
3597 # let's rotate!
3598 rotated = rotdig[torot:] + rotdig[:torot]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003599 return _dec_from_triple(self._sign,
3600 rotated.lstrip('0') or '0', self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003601
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003602 def scaleb(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003603 """Returns self operand after adding the second value to its exp."""
3604 if context is None:
3605 context = getcontext()
3606
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003607 other = _convert_other(other, raiseit=True)
3608
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003609 ans = self._check_nans(other, context)
3610 if ans:
3611 return ans
3612
3613 if other._exp != 0:
3614 return context._raise_error(InvalidOperation)
3615 liminf = -2 * (context.Emax + context.prec)
3616 limsup = 2 * (context.Emax + context.prec)
3617 if not (liminf <= int(other) <= limsup):
3618 return context._raise_error(InvalidOperation)
3619
3620 if self._isinfinity():
3621 return Decimal(self)
3622
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003623 d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003624 d = d._fix(context)
3625 return d
3626
3627 def shift(self, other, context=None):
3628 """Returns a shifted copy of self, value-of-other times."""
3629 if context is None:
3630 context = getcontext()
3631
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003632 other = _convert_other(other, raiseit=True)
3633
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003634 ans = self._check_nans(other, context)
3635 if ans:
3636 return ans
3637
3638 if other._exp != 0:
3639 return context._raise_error(InvalidOperation)
3640 if not (-context.prec <= int(other) <= context.prec):
3641 return context._raise_error(InvalidOperation)
3642
3643 if self._isinfinity():
3644 return Decimal(self)
3645
3646 # get values, pad if necessary
3647 torot = int(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003648 rotdig = self._int
3649 topad = context.prec - len(rotdig)
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003650 if topad > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003651 rotdig = '0'*topad + rotdig
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003652 elif topad < 0:
3653 rotdig = rotdig[-topad:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003654
3655 # let's shift!
3656 if torot < 0:
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003657 shifted = rotdig[:torot]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003658 else:
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003659 shifted = rotdig + '0'*torot
3660 shifted = shifted[-context.prec:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003661
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003662 return _dec_from_triple(self._sign,
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003663 shifted.lstrip('0') or '0', self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003664
Guido van Rossumd8faa362007-04-27 19:54:29 +00003665 # Support for pickling, copy, and deepcopy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003666 def __reduce__(self):
3667 return (self.__class__, (str(self),))
3668
3669 def __copy__(self):
Benjamin Petersond69fe2a2010-02-03 02:59:43 +00003670 if type(self) is Decimal:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003671 return self # I'm immutable; therefore I am my own clone
3672 return self.__class__(str(self))
3673
3674 def __deepcopy__(self, memo):
Benjamin Petersond69fe2a2010-02-03 02:59:43 +00003675 if type(self) is Decimal:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003676 return self # My components are also immutable
3677 return self.__class__(str(self))
3678
Mark Dickinson79f52032009-03-17 23:12:51 +00003679 # PEP 3101 support. the _localeconv keyword argument should be
3680 # considered private: it's provided for ease of testing only.
3681 def __format__(self, specifier, context=None, _localeconv=None):
Christian Heimesf16baeb2008-02-29 14:57:44 +00003682 """Format a Decimal instance according to the given specifier.
3683
3684 The specifier should be a standard format specifier, with the
3685 form described in PEP 3101. Formatting types 'e', 'E', 'f',
Mark Dickinson79f52032009-03-17 23:12:51 +00003686 'F', 'g', 'G', 'n' and '%' are supported. If the formatting
3687 type is omitted it defaults to 'g' or 'G', depending on the
3688 value of context.capitals.
Christian Heimesf16baeb2008-02-29 14:57:44 +00003689 """
3690
3691 # Note: PEP 3101 says that if the type is not present then
3692 # there should be at least one digit after the decimal point.
3693 # We take the liberty of ignoring this requirement for
3694 # Decimal---it's presumably there to make sure that
3695 # format(float, '') behaves similarly to str(float).
3696 if context is None:
3697 context = getcontext()
3698
Mark Dickinson79f52032009-03-17 23:12:51 +00003699 spec = _parse_format_specifier(specifier, _localeconv=_localeconv)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003700
Mark Dickinson79f52032009-03-17 23:12:51 +00003701 # special values don't care about the type or precision
Christian Heimesf16baeb2008-02-29 14:57:44 +00003702 if self._is_special:
Mark Dickinson79f52032009-03-17 23:12:51 +00003703 sign = _format_sign(self._sign, spec)
3704 body = str(self.copy_abs())
3705 return _format_align(sign, body, spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003706
3707 # a type of None defaults to 'g' or 'G', depending on context
Christian Heimesf16baeb2008-02-29 14:57:44 +00003708 if spec['type'] is None:
3709 spec['type'] = ['g', 'G'][context.capitals]
Mark Dickinson79f52032009-03-17 23:12:51 +00003710
3711 # if type is '%', adjust exponent of self accordingly
3712 if spec['type'] == '%':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003713 self = _dec_from_triple(self._sign, self._int, self._exp+2)
3714
3715 # round if necessary, taking rounding mode from the context
3716 rounding = context.rounding
3717 precision = spec['precision']
3718 if precision is not None:
3719 if spec['type'] in 'eE':
3720 self = self._round(precision+1, rounding)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003721 elif spec['type'] in 'fF%':
3722 self = self._rescale(-precision, rounding)
Mark Dickinson79f52032009-03-17 23:12:51 +00003723 elif spec['type'] in 'gG' and len(self._int) > precision:
3724 self = self._round(precision, rounding)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003725 # special case: zeros with a positive exponent can't be
3726 # represented in fixed point; rescale them to 0e0.
Mark Dickinson79f52032009-03-17 23:12:51 +00003727 if not self and self._exp > 0 and spec['type'] in 'fF%':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003728 self = self._rescale(0, rounding)
3729
3730 # figure out placement of the decimal point
3731 leftdigits = self._exp + len(self._int)
Mark Dickinson79f52032009-03-17 23:12:51 +00003732 if spec['type'] in 'eE':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003733 if not self and precision is not None:
3734 dotplace = 1 - precision
3735 else:
3736 dotplace = 1
Mark Dickinson79f52032009-03-17 23:12:51 +00003737 elif spec['type'] in 'fF%':
3738 dotplace = leftdigits
Christian Heimesf16baeb2008-02-29 14:57:44 +00003739 elif spec['type'] in 'gG':
3740 if self._exp <= 0 and leftdigits > -6:
3741 dotplace = leftdigits
3742 else:
3743 dotplace = 1
3744
Mark Dickinson79f52032009-03-17 23:12:51 +00003745 # find digits before and after decimal point, and get exponent
3746 if dotplace < 0:
3747 intpart = '0'
3748 fracpart = '0'*(-dotplace) + self._int
3749 elif dotplace > len(self._int):
3750 intpart = self._int + '0'*(dotplace-len(self._int))
3751 fracpart = ''
Christian Heimesf16baeb2008-02-29 14:57:44 +00003752 else:
Mark Dickinson79f52032009-03-17 23:12:51 +00003753 intpart = self._int[:dotplace] or '0'
3754 fracpart = self._int[dotplace:]
3755 exp = leftdigits-dotplace
Christian Heimesf16baeb2008-02-29 14:57:44 +00003756
Mark Dickinson79f52032009-03-17 23:12:51 +00003757 # done with the decimal-specific stuff; hand over the rest
3758 # of the formatting to the _format_number function
3759 return _format_number(self._sign, intpart, fracpart, exp, spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003760
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003761def _dec_from_triple(sign, coefficient, exponent, special=False):
3762 """Create a decimal instance directly, without any validation,
3763 normalization (e.g. removal of leading zeros) or argument
3764 conversion.
3765
3766 This function is for *internal use only*.
3767 """
3768
3769 self = object.__new__(Decimal)
3770 self._sign = sign
3771 self._int = coefficient
3772 self._exp = exponent
3773 self._is_special = special
3774
3775 return self
3776
Raymond Hettinger82417ca2009-02-03 03:54:28 +00003777# Register Decimal as a kind of Number (an abstract base class).
3778# However, do not register it as Real (because Decimals are not
3779# interoperable with floats).
3780_numbers.Number.register(Decimal)
3781
3782
Guido van Rossumd8faa362007-04-27 19:54:29 +00003783##### Context class #######################################################
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003784
Thomas Wouters89f507f2006-12-13 04:49:30 +00003785class _ContextManager(object):
3786 """Context manager class to support localcontext().
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003787
Thomas Wouters89f507f2006-12-13 04:49:30 +00003788 Sets a copy of the supplied context in __enter__() and restores
3789 the previous decimal context in __exit__()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003790 """
3791 def __init__(self, new_context):
Thomas Wouters89f507f2006-12-13 04:49:30 +00003792 self.new_context = new_context.copy()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003793 def __enter__(self):
3794 self.saved_context = getcontext()
3795 setcontext(self.new_context)
3796 return self.new_context
3797 def __exit__(self, t, v, tb):
3798 setcontext(self.saved_context)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003799
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003800class Context(object):
3801 """Contains the context for a Decimal instance.
3802
3803 Contains:
3804 prec - precision (for use in rounding, division, square roots..)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003805 rounding - rounding type (how you round)
Raymond Hettingerbf440692004-07-10 14:14:37 +00003806 traps - If traps[exception] = 1, then the exception is
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003807 raised when it is caused. Otherwise, a value is
3808 substituted in.
Raymond Hettinger86173da2008-02-01 20:38:12 +00003809 flags - When an exception is caused, flags[exception] is set.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003810 (Whether or not the trap_enabler is set)
3811 Should be reset by user of Decimal instance.
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003812 Emin - Minimum exponent
3813 Emax - Maximum exponent
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003814 capitals - If 1, 1*10^1 is printed as 1E+1.
3815 If 0, printed as 1e1
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003816 clamp - If 1, change exponents if too high (Default 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003817 """
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003818
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003819 def __init__(self, prec=None, rounding=None,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003820 traps=None, flags=None,
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003821 Emin=None, Emax=None,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003822 capitals=None, clamp=None,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003823 _ignored_flags=None):
Mark Dickinson0dd8f782010-07-08 21:15:36 +00003824 # Set defaults; for everything except flags and _ignored_flags,
3825 # inherit from DefaultContext.
3826 try:
3827 dc = DefaultContext
3828 except NameError:
3829 pass
3830
3831 self.prec = prec if prec is not None else dc.prec
3832 self.rounding = rounding if rounding is not None else dc.rounding
3833 self.Emin = Emin if Emin is not None else dc.Emin
3834 self.Emax = Emax if Emax is not None else dc.Emax
3835 self.capitals = capitals if capitals is not None else dc.capitals
3836 self.clamp = clamp if clamp is not None else dc.clamp
3837
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003838 if _ignored_flags is None:
Mark Dickinson0dd8f782010-07-08 21:15:36 +00003839 self._ignored_flags = []
3840 else:
3841 self._ignored_flags = _ignored_flags
3842
3843 if traps is None:
3844 self.traps = dc.traps.copy()
3845 elif not isinstance(traps, dict):
3846 self.traps = dict((s, int(s in traps)) for s in _signals)
3847 else:
3848 self.traps = traps
3849
3850 if flags is None:
3851 self.flags = dict.fromkeys(_signals, 0)
3852 elif not isinstance(flags, dict):
3853 self.flags = dict((s, int(s in flags)) for s in _signals)
3854 else:
3855 self.flags = flags
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003856
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003857 def __repr__(self):
Raymond Hettingerbf440692004-07-10 14:14:37 +00003858 """Show the current context."""
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003859 s = []
Guido van Rossumd8faa362007-04-27 19:54:29 +00003860 s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003861 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d, '
3862 'clamp=%(clamp)d'
Guido van Rossumd8faa362007-04-27 19:54:29 +00003863 % vars(self))
3864 names = [f.__name__ for f, v in self.flags.items() if v]
3865 s.append('flags=[' + ', '.join(names) + ']')
3866 names = [t.__name__ for t, v in self.traps.items() if v]
3867 s.append('traps=[' + ', '.join(names) + ']')
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003868 return ', '.join(s) + ')'
3869
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003870 def clear_flags(self):
3871 """Reset all flags to zero"""
3872 for flag in self.flags:
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003873 self.flags[flag] = 0
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003874
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003875 def _shallow_copy(self):
3876 """Returns a shallow copy from self."""
Christian Heimes2c181612007-12-17 20:04:13 +00003877 nc = Context(self.prec, self.rounding, self.traps,
3878 self.flags, self.Emin, self.Emax,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003879 self.capitals, self.clamp, self._ignored_flags)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003880 return nc
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003881
3882 def copy(self):
3883 """Returns a deep copy from self."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00003884 nc = Context(self.prec, self.rounding, self.traps.copy(),
Christian Heimes2c181612007-12-17 20:04:13 +00003885 self.flags.copy(), self.Emin, self.Emax,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003886 self.capitals, self.clamp, self._ignored_flags)
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003887 return nc
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003888 __copy__ = copy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003889
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003890 # _clamp is provided for backwards compatibility with third-party
3891 # code. May be removed in Python >= 3.3.
3892 def _get_clamp(self):
3893 "_clamp mirrors the clamp attribute. Its use is deprecated."
3894 import warnings
3895 warnings.warn('Use of the _clamp attribute is deprecated. '
3896 'Please use clamp instead.',
3897 DeprecationWarning)
3898 return self.clamp
3899
3900 def _set_clamp(self, clamp):
3901 "_clamp mirrors the clamp attribute. Its use is deprecated."
3902 import warnings
3903 warnings.warn('Use of the _clamp attribute is deprecated. '
3904 'Please use clamp instead.',
3905 DeprecationWarning)
3906 self.clamp = clamp
3907
3908 # don't bother with _del_clamp; no sane 3rd party code should
3909 # be deleting the _clamp attribute
3910 _clamp = property(_get_clamp, _set_clamp)
3911
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003912 def _raise_error(self, condition, explanation = None, *args):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003913 """Handles an error
3914
3915 If the flag is in _ignored_flags, returns the default response.
Raymond Hettinger86173da2008-02-01 20:38:12 +00003916 Otherwise, it sets the flag, then, if the corresponding
Stefan Krah2eb4a072010-05-19 15:52:31 +00003917 trap_enabler is set, it reraises the exception. Otherwise, it returns
Raymond Hettinger86173da2008-02-01 20:38:12 +00003918 the default value after setting the flag.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003919 """
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003920 error = _condition_map.get(condition, condition)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003921 if error in self._ignored_flags:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003922 # Don't touch the flag
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003923 return error().handle(self, *args)
3924
Raymond Hettinger86173da2008-02-01 20:38:12 +00003925 self.flags[error] = 1
Raymond Hettingerbf440692004-07-10 14:14:37 +00003926 if not self.traps[error]:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003927 # The errors define how to handle themselves.
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003928 return condition().handle(self, *args)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003929
3930 # Errors should only be risked on copies of the context
Guido van Rossumd8faa362007-04-27 19:54:29 +00003931 # self._ignored_flags = []
Collin Winterce36ad82007-08-30 01:19:48 +00003932 raise error(explanation)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003933
3934 def _ignore_all_flags(self):
3935 """Ignore all flags, if they are raised"""
Raymond Hettingerfed52962004-07-14 15:41:57 +00003936 return self._ignore_flags(*_signals)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003937
3938 def _ignore_flags(self, *flags):
3939 """Ignore the flags, if they are raised"""
3940 # Do not mutate-- This way, copies of a context leave the original
3941 # alone.
3942 self._ignored_flags = (self._ignored_flags + list(flags))
3943 return list(flags)
3944
3945 def _regard_flags(self, *flags):
3946 """Stop ignoring the flags, if they are raised"""
3947 if flags and isinstance(flags[0], (tuple,list)):
3948 flags = flags[0]
3949 for flag in flags:
3950 self._ignored_flags.remove(flag)
3951
Nick Coghland1abd252008-07-15 15:46:38 +00003952 # We inherit object.__hash__, so we must deny this explicitly
3953 __hash__ = None
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003954
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003955 def Etiny(self):
3956 """Returns Etiny (= Emin - prec + 1)"""
3957 return int(self.Emin - self.prec + 1)
3958
3959 def Etop(self):
Raymond Hettingere0f15812004-07-05 05:36:39 +00003960 """Returns maximum exponent (= Emax - prec + 1)"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003961 return int(self.Emax - self.prec + 1)
3962
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003963 def _set_rounding(self, type):
3964 """Sets the rounding type.
3965
3966 Sets the rounding type, and returns the current (previous)
3967 rounding type. Often used like:
3968
3969 context = context.copy()
3970 # so you don't change the calling context
3971 # if an error occurs in the middle.
3972 rounding = context._set_rounding(ROUND_UP)
3973 val = self.__sub__(other, context=context)
3974 context._set_rounding(rounding)
3975
3976 This will make it round up for that operation.
3977 """
3978 rounding = self.rounding
3979 self.rounding= type
3980 return rounding
3981
Raymond Hettingerfed52962004-07-14 15:41:57 +00003982 def create_decimal(self, num='0'):
Christian Heimesa62da1d2008-01-12 19:39:10 +00003983 """Creates a new Decimal instance but using self as context.
3984
3985 This method implements the to-number operation of the
3986 IBM Decimal specification."""
3987
3988 if isinstance(num, str) and num != num.strip():
3989 return self._raise_error(ConversionSyntax,
3990 "no trailing or leading whitespace is "
3991 "permitted.")
3992
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003993 d = Decimal(num, context=self)
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003994 if d._isnan() and len(d._int) > self.prec - self.clamp:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003995 return self._raise_error(ConversionSyntax,
3996 "diagnostic info too long in NaN")
Raymond Hettingerdab988d2004-10-09 07:10:44 +00003997 return d._fix(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003998
Raymond Hettinger771ed762009-01-03 19:20:32 +00003999 def create_decimal_from_float(self, f):
4000 """Creates a new Decimal instance from a float but rounding using self
4001 as the context.
4002
4003 >>> context = Context(prec=5, rounding=ROUND_DOWN)
4004 >>> context.create_decimal_from_float(3.1415926535897932)
4005 Decimal('3.1415')
4006 >>> context = Context(prec=5, traps=[Inexact])
4007 >>> context.create_decimal_from_float(3.1415926535897932)
4008 Traceback (most recent call last):
4009 ...
4010 decimal.Inexact: None
4011
4012 """
4013 d = Decimal.from_float(f) # An exact conversion
4014 return d._fix(self) # Apply the context rounding
4015
Guido van Rossumd8faa362007-04-27 19:54:29 +00004016 # Methods
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004017 def abs(self, a):
4018 """Returns the absolute value of the operand.
4019
4020 If the operand is negative, the result is the same as using the minus
Guido van Rossumd8faa362007-04-27 19:54:29 +00004021 operation on the operand. Otherwise, the result is the same as using
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004022 the plus operation on the operand.
4023
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004024 >>> ExtendedContext.abs(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004025 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004026 >>> ExtendedContext.abs(Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004027 Decimal('100')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004028 >>> ExtendedContext.abs(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004029 Decimal('101.5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004030 >>> ExtendedContext.abs(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004031 Decimal('101.5')
Mark Dickinson84230a12010-02-18 14:49:50 +00004032 >>> ExtendedContext.abs(-1)
4033 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004034 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004035 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004036 return a.__abs__(context=self)
4037
4038 def add(self, a, b):
4039 """Return the sum of the two operands.
4040
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004041 >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004042 Decimal('19.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004043 >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004044 Decimal('1.02E+4')
Mark Dickinson84230a12010-02-18 14:49:50 +00004045 >>> ExtendedContext.add(1, Decimal(2))
4046 Decimal('3')
4047 >>> ExtendedContext.add(Decimal(8), 5)
4048 Decimal('13')
4049 >>> ExtendedContext.add(5, 5)
4050 Decimal('10')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004051 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004052 a = _convert_other(a, raiseit=True)
4053 r = a.__add__(b, context=self)
4054 if r is NotImplemented:
4055 raise TypeError("Unable to convert %s to Decimal" % b)
4056 else:
4057 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004058
4059 def _apply(self, a):
Raymond Hettingerdab988d2004-10-09 07:10:44 +00004060 return str(a._fix(self))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004061
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004062 def canonical(self, a):
4063 """Returns the same Decimal object.
4064
4065 As we do not have different encodings for the same number, the
4066 received object already is in its canonical form.
4067
4068 >>> ExtendedContext.canonical(Decimal('2.50'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004069 Decimal('2.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004070 """
4071 return a.canonical(context=self)
4072
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004073 def compare(self, a, b):
4074 """Compares values numerically.
4075
4076 If the signs of the operands differ, a value representing each operand
4077 ('-1' if the operand is less than zero, '0' if the operand is zero or
4078 negative zero, or '1' if the operand is greater than zero) is used in
4079 place of that operand for the comparison instead of the actual
4080 operand.
4081
4082 The comparison is then effected by subtracting the second operand from
4083 the first and then returning a value according to the result of the
4084 subtraction: '-1' if the result is less than zero, '0' if the result is
4085 zero or negative zero, or '1' if the result is greater than zero.
4086
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004087 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004088 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004089 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004090 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004091 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004092 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004093 >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004094 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004095 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004096 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004097 >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004098 Decimal('-1')
Mark Dickinson84230a12010-02-18 14:49:50 +00004099 >>> ExtendedContext.compare(1, 2)
4100 Decimal('-1')
4101 >>> ExtendedContext.compare(Decimal(1), 2)
4102 Decimal('-1')
4103 >>> ExtendedContext.compare(1, Decimal(2))
4104 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004105 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004106 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004107 return a.compare(b, context=self)
4108
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004109 def compare_signal(self, a, b):
4110 """Compares the values of the two operands numerically.
4111
4112 It's pretty much like compare(), but all NaNs signal, with signaling
4113 NaNs taking precedence over quiet NaNs.
4114
4115 >>> c = ExtendedContext
4116 >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004117 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004118 >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004119 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004120 >>> c.flags[InvalidOperation] = 0
4121 >>> print(c.flags[InvalidOperation])
4122 0
4123 >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004124 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004125 >>> print(c.flags[InvalidOperation])
4126 1
4127 >>> c.flags[InvalidOperation] = 0
4128 >>> print(c.flags[InvalidOperation])
4129 0
4130 >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004131 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004132 >>> print(c.flags[InvalidOperation])
4133 1
Mark Dickinson84230a12010-02-18 14:49:50 +00004134 >>> c.compare_signal(-1, 2)
4135 Decimal('-1')
4136 >>> c.compare_signal(Decimal(-1), 2)
4137 Decimal('-1')
4138 >>> c.compare_signal(-1, Decimal(2))
4139 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004140 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004141 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004142 return a.compare_signal(b, context=self)
4143
4144 def compare_total(self, a, b):
4145 """Compares two operands using their abstract representation.
4146
4147 This is not like the standard compare, which use their numerical
4148 value. Note that a total ordering is defined for all possible abstract
4149 representations.
4150
4151 >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004152 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004153 >>> ExtendedContext.compare_total(Decimal('-127'), Decimal('12'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004154 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004155 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004156 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004157 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004158 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004159 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('12.300'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004160 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004161 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004162 Decimal('-1')
Mark Dickinson84230a12010-02-18 14:49:50 +00004163 >>> ExtendedContext.compare_total(1, 2)
4164 Decimal('-1')
4165 >>> ExtendedContext.compare_total(Decimal(1), 2)
4166 Decimal('-1')
4167 >>> ExtendedContext.compare_total(1, Decimal(2))
4168 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004169 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004170 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004171 return a.compare_total(b)
4172
4173 def compare_total_mag(self, a, b):
4174 """Compares two operands using their abstract representation ignoring sign.
4175
4176 Like compare_total, but with operand's sign ignored and assumed to be 0.
4177 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004178 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004179 return a.compare_total_mag(b)
4180
4181 def copy_abs(self, a):
4182 """Returns a copy of the operand with the sign set to 0.
4183
4184 >>> ExtendedContext.copy_abs(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004185 Decimal('2.1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004186 >>> ExtendedContext.copy_abs(Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004187 Decimal('100')
Mark Dickinson84230a12010-02-18 14:49:50 +00004188 >>> ExtendedContext.copy_abs(-1)
4189 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004190 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004191 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004192 return a.copy_abs()
4193
4194 def copy_decimal(self, a):
Mark Dickinson84230a12010-02-18 14:49:50 +00004195 """Returns a copy of the decimal object.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004196
4197 >>> ExtendedContext.copy_decimal(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004198 Decimal('2.1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004199 >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004200 Decimal('-1.00')
Mark Dickinson84230a12010-02-18 14:49:50 +00004201 >>> ExtendedContext.copy_decimal(1)
4202 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004203 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004204 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004205 return Decimal(a)
4206
4207 def copy_negate(self, a):
4208 """Returns a copy of the operand with the sign inverted.
4209
4210 >>> ExtendedContext.copy_negate(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004211 Decimal('-101.5')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004212 >>> ExtendedContext.copy_negate(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004213 Decimal('101.5')
Mark Dickinson84230a12010-02-18 14:49:50 +00004214 >>> ExtendedContext.copy_negate(1)
4215 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004216 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004217 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004218 return a.copy_negate()
4219
4220 def copy_sign(self, a, b):
4221 """Copies the second operand's sign to the first one.
4222
4223 In detail, it returns a copy of the first operand with the sign
4224 equal to the sign of the second operand.
4225
4226 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004227 Decimal('1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004228 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004229 Decimal('1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004230 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004231 Decimal('-1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004232 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004233 Decimal('-1.50')
Mark Dickinson84230a12010-02-18 14:49:50 +00004234 >>> ExtendedContext.copy_sign(1, -2)
4235 Decimal('-1')
4236 >>> ExtendedContext.copy_sign(Decimal(1), -2)
4237 Decimal('-1')
4238 >>> ExtendedContext.copy_sign(1, Decimal(-2))
4239 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004240 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004241 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004242 return a.copy_sign(b)
4243
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004244 def divide(self, a, b):
4245 """Decimal division in a specified context.
4246
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004247 >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004248 Decimal('0.333333333')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004249 >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004250 Decimal('0.666666667')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004251 >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004252 Decimal('2.5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004253 >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004254 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004255 >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004256 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004257 >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004258 Decimal('4.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004259 >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004260 Decimal('1.20')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004261 >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004262 Decimal('10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004263 >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004264 Decimal('1000')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004265 >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004266 Decimal('1.20E+6')
Mark Dickinson84230a12010-02-18 14:49:50 +00004267 >>> ExtendedContext.divide(5, 5)
4268 Decimal('1')
4269 >>> ExtendedContext.divide(Decimal(5), 5)
4270 Decimal('1')
4271 >>> ExtendedContext.divide(5, Decimal(5))
4272 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004273 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004274 a = _convert_other(a, raiseit=True)
4275 r = a.__truediv__(b, context=self)
4276 if r is NotImplemented:
4277 raise TypeError("Unable to convert %s to Decimal" % b)
4278 else:
4279 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004280
4281 def divide_int(self, a, b):
4282 """Divides two numbers and returns the integer part of the result.
4283
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004284 >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004285 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004286 >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004287 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004288 >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004289 Decimal('3')
Mark Dickinson84230a12010-02-18 14:49:50 +00004290 >>> ExtendedContext.divide_int(10, 3)
4291 Decimal('3')
4292 >>> ExtendedContext.divide_int(Decimal(10), 3)
4293 Decimal('3')
4294 >>> ExtendedContext.divide_int(10, Decimal(3))
4295 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004296 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004297 a = _convert_other(a, raiseit=True)
4298 r = a.__floordiv__(b, context=self)
4299 if r is NotImplemented:
4300 raise TypeError("Unable to convert %s to Decimal" % b)
4301 else:
4302 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004303
4304 def divmod(self, a, b):
Mark Dickinson84230a12010-02-18 14:49:50 +00004305 """Return (a // b, a % b).
Mark Dickinsonc53796e2010-01-06 16:22:15 +00004306
4307 >>> ExtendedContext.divmod(Decimal(8), Decimal(3))
4308 (Decimal('2'), Decimal('2'))
4309 >>> ExtendedContext.divmod(Decimal(8), Decimal(4))
4310 (Decimal('2'), Decimal('0'))
Mark Dickinson84230a12010-02-18 14:49:50 +00004311 >>> ExtendedContext.divmod(8, 4)
4312 (Decimal('2'), Decimal('0'))
4313 >>> ExtendedContext.divmod(Decimal(8), 4)
4314 (Decimal('2'), Decimal('0'))
4315 >>> ExtendedContext.divmod(8, Decimal(4))
4316 (Decimal('2'), Decimal('0'))
Mark Dickinsonc53796e2010-01-06 16:22:15 +00004317 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004318 a = _convert_other(a, raiseit=True)
4319 r = a.__divmod__(b, context=self)
4320 if r is NotImplemented:
4321 raise TypeError("Unable to convert %s to Decimal" % b)
4322 else:
4323 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004324
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004325 def exp(self, a):
4326 """Returns e ** a.
4327
4328 >>> c = ExtendedContext.copy()
4329 >>> c.Emin = -999
4330 >>> c.Emax = 999
4331 >>> c.exp(Decimal('-Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004332 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004333 >>> c.exp(Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004334 Decimal('0.367879441')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004335 >>> c.exp(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004336 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004337 >>> c.exp(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004338 Decimal('2.71828183')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004339 >>> c.exp(Decimal('0.693147181'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004340 Decimal('2.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004341 >>> c.exp(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004342 Decimal('Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004343 >>> c.exp(10)
4344 Decimal('22026.4658')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004345 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004346 a =_convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004347 return a.exp(context=self)
4348
4349 def fma(self, a, b, c):
4350 """Returns a multiplied by b, plus c.
4351
4352 The first two operands are multiplied together, using multiply,
4353 the third operand is then added to the result of that
4354 multiplication, using add, all with only one final rounding.
4355
4356 >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004357 Decimal('22')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004358 >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004359 Decimal('-8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004360 >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004361 Decimal('1.38435736E+12')
Mark Dickinson84230a12010-02-18 14:49:50 +00004362 >>> ExtendedContext.fma(1, 3, 4)
4363 Decimal('7')
4364 >>> ExtendedContext.fma(1, Decimal(3), 4)
4365 Decimal('7')
4366 >>> ExtendedContext.fma(1, 3, Decimal(4))
4367 Decimal('7')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004368 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004369 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004370 return a.fma(b, c, context=self)
4371
4372 def is_canonical(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004373 """Return True if the operand is canonical; otherwise return False.
4374
4375 Currently, the encoding of a Decimal instance is always
4376 canonical, so this method returns True for any Decimal.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004377
4378 >>> ExtendedContext.is_canonical(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004379 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004380 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004381 return a.is_canonical()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004382
4383 def is_finite(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004384 """Return True if the operand is finite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004385
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004386 A Decimal instance is considered finite if it is neither
4387 infinite nor a NaN.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004388
4389 >>> ExtendedContext.is_finite(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004390 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004391 >>> ExtendedContext.is_finite(Decimal('-0.3'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004392 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004393 >>> ExtendedContext.is_finite(Decimal('0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004394 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004395 >>> ExtendedContext.is_finite(Decimal('Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004396 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004397 >>> ExtendedContext.is_finite(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004398 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004399 >>> ExtendedContext.is_finite(1)
4400 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004401 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004402 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004403 return a.is_finite()
4404
4405 def is_infinite(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004406 """Return True if the operand is infinite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004407
4408 >>> ExtendedContext.is_infinite(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004409 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004410 >>> ExtendedContext.is_infinite(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004411 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004412 >>> ExtendedContext.is_infinite(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004413 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004414 >>> ExtendedContext.is_infinite(1)
4415 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004416 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004417 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004418 return a.is_infinite()
4419
4420 def is_nan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004421 """Return True if the operand is a qNaN or sNaN;
4422 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004423
4424 >>> ExtendedContext.is_nan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004425 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004426 >>> ExtendedContext.is_nan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004427 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004428 >>> ExtendedContext.is_nan(Decimal('-sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004429 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004430 >>> ExtendedContext.is_nan(1)
4431 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004432 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004433 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004434 return a.is_nan()
4435
4436 def is_normal(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004437 """Return True if the operand is a normal number;
4438 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004439
4440 >>> c = ExtendedContext.copy()
4441 >>> c.Emin = -999
4442 >>> c.Emax = 999
4443 >>> c.is_normal(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004444 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004445 >>> c.is_normal(Decimal('0.1E-999'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004446 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004447 >>> c.is_normal(Decimal('0.00'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004448 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004449 >>> c.is_normal(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004450 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004451 >>> c.is_normal(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004452 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004453 >>> c.is_normal(1)
4454 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004455 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004456 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004457 return a.is_normal(context=self)
4458
4459 def is_qnan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004460 """Return True if the operand is a quiet NaN; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004461
4462 >>> ExtendedContext.is_qnan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004463 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004464 >>> ExtendedContext.is_qnan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004465 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004466 >>> ExtendedContext.is_qnan(Decimal('sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004467 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004468 >>> ExtendedContext.is_qnan(1)
4469 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004470 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004471 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004472 return a.is_qnan()
4473
4474 def is_signed(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004475 """Return True if the operand is negative; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004476
4477 >>> ExtendedContext.is_signed(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004478 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004479 >>> ExtendedContext.is_signed(Decimal('-12'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004480 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004481 >>> ExtendedContext.is_signed(Decimal('-0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004482 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004483 >>> ExtendedContext.is_signed(8)
4484 False
4485 >>> ExtendedContext.is_signed(-8)
4486 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004487 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004488 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004489 return a.is_signed()
4490
4491 def is_snan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004492 """Return True if the operand is a signaling NaN;
4493 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004494
4495 >>> ExtendedContext.is_snan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004496 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004497 >>> ExtendedContext.is_snan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004498 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004499 >>> ExtendedContext.is_snan(Decimal('sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004500 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004501 >>> ExtendedContext.is_snan(1)
4502 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004503 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004504 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004505 return a.is_snan()
4506
4507 def is_subnormal(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004508 """Return True if the operand is subnormal; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004509
4510 >>> c = ExtendedContext.copy()
4511 >>> c.Emin = -999
4512 >>> c.Emax = 999
4513 >>> c.is_subnormal(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004514 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004515 >>> c.is_subnormal(Decimal('0.1E-999'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004516 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004517 >>> c.is_subnormal(Decimal('0.00'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004518 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004519 >>> c.is_subnormal(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004520 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004521 >>> c.is_subnormal(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004522 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004523 >>> c.is_subnormal(1)
4524 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004525 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004526 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004527 return a.is_subnormal(context=self)
4528
4529 def is_zero(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004530 """Return True if the operand is a zero; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004531
4532 >>> ExtendedContext.is_zero(Decimal('0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004533 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004534 >>> ExtendedContext.is_zero(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004535 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004536 >>> ExtendedContext.is_zero(Decimal('-0E+2'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004537 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004538 >>> ExtendedContext.is_zero(1)
4539 False
4540 >>> ExtendedContext.is_zero(0)
4541 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004542 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004543 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004544 return a.is_zero()
4545
4546 def ln(self, a):
4547 """Returns the natural (base e) logarithm of the operand.
4548
4549 >>> c = ExtendedContext.copy()
4550 >>> c.Emin = -999
4551 >>> c.Emax = 999
4552 >>> c.ln(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004553 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004554 >>> c.ln(Decimal('1.000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004555 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004556 >>> c.ln(Decimal('2.71828183'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004557 Decimal('1.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004558 >>> c.ln(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004559 Decimal('2.30258509')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004560 >>> c.ln(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004561 Decimal('Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004562 >>> c.ln(1)
4563 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004564 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004565 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004566 return a.ln(context=self)
4567
4568 def log10(self, a):
4569 """Returns the base 10 logarithm of the operand.
4570
4571 >>> c = ExtendedContext.copy()
4572 >>> c.Emin = -999
4573 >>> c.Emax = 999
4574 >>> c.log10(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004575 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004576 >>> c.log10(Decimal('0.001'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004577 Decimal('-3')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004578 >>> c.log10(Decimal('1.000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004579 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004580 >>> c.log10(Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004581 Decimal('0.301029996')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004582 >>> c.log10(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004583 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004584 >>> c.log10(Decimal('70'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004585 Decimal('1.84509804')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004586 >>> c.log10(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004587 Decimal('Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004588 >>> c.log10(0)
4589 Decimal('-Infinity')
4590 >>> c.log10(1)
4591 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004592 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004593 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004594 return a.log10(context=self)
4595
4596 def logb(self, a):
4597 """ Returns the exponent of the magnitude of the operand's MSD.
4598
4599 The result is the integer which is the exponent of the magnitude
4600 of the most significant digit of the operand (as though the
4601 operand were truncated to a single digit while maintaining the
4602 value of that digit and without limiting the resulting exponent).
4603
4604 >>> ExtendedContext.logb(Decimal('250'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004605 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004606 >>> ExtendedContext.logb(Decimal('2.50'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004607 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004608 >>> ExtendedContext.logb(Decimal('0.03'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004609 Decimal('-2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004610 >>> ExtendedContext.logb(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004611 Decimal('-Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004612 >>> ExtendedContext.logb(1)
4613 Decimal('0')
4614 >>> ExtendedContext.logb(10)
4615 Decimal('1')
4616 >>> ExtendedContext.logb(100)
4617 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004618 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004619 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004620 return a.logb(context=self)
4621
4622 def logical_and(self, a, b):
4623 """Applies the logical operation 'and' between each operand's digits.
4624
4625 The operands must be both logical numbers.
4626
4627 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004628 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004629 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004630 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004631 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004632 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004633 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004634 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004635 >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004636 Decimal('1000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004637 >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004638 Decimal('10')
Mark Dickinson84230a12010-02-18 14:49:50 +00004639 >>> ExtendedContext.logical_and(110, 1101)
4640 Decimal('100')
4641 >>> ExtendedContext.logical_and(Decimal(110), 1101)
4642 Decimal('100')
4643 >>> ExtendedContext.logical_and(110, Decimal(1101))
4644 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004645 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004646 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004647 return a.logical_and(b, context=self)
4648
4649 def logical_invert(self, a):
4650 """Invert all the digits in the operand.
4651
4652 The operand must be a logical number.
4653
4654 >>> ExtendedContext.logical_invert(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004655 Decimal('111111111')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004656 >>> ExtendedContext.logical_invert(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004657 Decimal('111111110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004658 >>> ExtendedContext.logical_invert(Decimal('111111111'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004659 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004660 >>> ExtendedContext.logical_invert(Decimal('101010101'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004661 Decimal('10101010')
Mark Dickinson84230a12010-02-18 14:49:50 +00004662 >>> ExtendedContext.logical_invert(1101)
4663 Decimal('111110010')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004664 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004665 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004666 return a.logical_invert(context=self)
4667
4668 def logical_or(self, a, b):
4669 """Applies the logical operation 'or' between each operand's digits.
4670
4671 The operands must be both logical numbers.
4672
4673 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004674 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004675 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004676 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004677 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004678 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004679 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004680 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004681 >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004682 Decimal('1110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004683 >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004684 Decimal('1110')
Mark Dickinson84230a12010-02-18 14:49:50 +00004685 >>> ExtendedContext.logical_or(110, 1101)
4686 Decimal('1111')
4687 >>> ExtendedContext.logical_or(Decimal(110), 1101)
4688 Decimal('1111')
4689 >>> ExtendedContext.logical_or(110, Decimal(1101))
4690 Decimal('1111')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004691 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004692 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004693 return a.logical_or(b, context=self)
4694
4695 def logical_xor(self, a, b):
4696 """Applies the logical operation 'xor' between each operand's digits.
4697
4698 The operands must be both logical numbers.
4699
4700 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004701 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004702 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004703 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004704 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004705 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004706 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004707 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004708 >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004709 Decimal('110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004710 >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004711 Decimal('1101')
Mark Dickinson84230a12010-02-18 14:49:50 +00004712 >>> ExtendedContext.logical_xor(110, 1101)
4713 Decimal('1011')
4714 >>> ExtendedContext.logical_xor(Decimal(110), 1101)
4715 Decimal('1011')
4716 >>> ExtendedContext.logical_xor(110, Decimal(1101))
4717 Decimal('1011')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004718 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004719 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004720 return a.logical_xor(b, context=self)
4721
Mark Dickinson84230a12010-02-18 14:49:50 +00004722 def max(self, a, b):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004723 """max compares two values numerically and returns the maximum.
4724
4725 If either operand is a NaN then the general rules apply.
Christian Heimes679db4a2008-01-18 09:56:22 +00004726 Otherwise, the operands are compared as though by the compare
Guido van Rossumd8faa362007-04-27 19:54:29 +00004727 operation. If they are numerically equal then the left-hand operand
4728 is chosen as the result. Otherwise the maximum (closer to positive
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004729 infinity) of the two operands is chosen as the result.
4730
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004731 >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004732 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004733 >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004734 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004735 >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004736 Decimal('1')
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004737 >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004738 Decimal('7')
Mark Dickinson84230a12010-02-18 14:49:50 +00004739 >>> ExtendedContext.max(1, 2)
4740 Decimal('2')
4741 >>> ExtendedContext.max(Decimal(1), 2)
4742 Decimal('2')
4743 >>> ExtendedContext.max(1, Decimal(2))
4744 Decimal('2')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004745 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004746 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004747 return a.max(b, context=self)
4748
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004749 def max_mag(self, a, b):
Mark Dickinson84230a12010-02-18 14:49:50 +00004750 """Compares the values numerically with their sign ignored.
4751
4752 >>> ExtendedContext.max_mag(Decimal('7'), Decimal('NaN'))
4753 Decimal('7')
4754 >>> ExtendedContext.max_mag(Decimal('7'), Decimal('-10'))
4755 Decimal('-10')
4756 >>> ExtendedContext.max_mag(1, -2)
4757 Decimal('-2')
4758 >>> ExtendedContext.max_mag(Decimal(1), -2)
4759 Decimal('-2')
4760 >>> ExtendedContext.max_mag(1, Decimal(-2))
4761 Decimal('-2')
4762 """
4763 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004764 return a.max_mag(b, context=self)
4765
Mark Dickinson84230a12010-02-18 14:49:50 +00004766 def min(self, a, b):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004767 """min compares two values numerically and returns the minimum.
4768
4769 If either operand is a NaN then the general rules apply.
Christian Heimes679db4a2008-01-18 09:56:22 +00004770 Otherwise, the operands are compared as though by the compare
Guido van Rossumd8faa362007-04-27 19:54:29 +00004771 operation. If they are numerically equal then the left-hand operand
4772 is chosen as the result. Otherwise the minimum (closer to negative
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004773 infinity) of the two operands is chosen as the result.
4774
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004775 >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004776 Decimal('2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004777 >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004778 Decimal('-10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004779 >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004780 Decimal('1.0')
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004781 >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004782 Decimal('7')
Mark Dickinson84230a12010-02-18 14:49:50 +00004783 >>> ExtendedContext.min(1, 2)
4784 Decimal('1')
4785 >>> ExtendedContext.min(Decimal(1), 2)
4786 Decimal('1')
4787 >>> ExtendedContext.min(1, Decimal(29))
4788 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004789 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004790 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004791 return a.min(b, context=self)
4792
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004793 def min_mag(self, a, b):
Mark Dickinson84230a12010-02-18 14:49:50 +00004794 """Compares the values numerically with their sign ignored.
4795
4796 >>> ExtendedContext.min_mag(Decimal('3'), Decimal('-2'))
4797 Decimal('-2')
4798 >>> ExtendedContext.min_mag(Decimal('-3'), Decimal('NaN'))
4799 Decimal('-3')
4800 >>> ExtendedContext.min_mag(1, -2)
4801 Decimal('1')
4802 >>> ExtendedContext.min_mag(Decimal(1), -2)
4803 Decimal('1')
4804 >>> ExtendedContext.min_mag(1, Decimal(-2))
4805 Decimal('1')
4806 """
4807 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004808 return a.min_mag(b, context=self)
4809
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004810 def minus(self, a):
4811 """Minus corresponds to unary prefix minus in Python.
4812
4813 The operation is evaluated using the same rules as subtract; the
4814 operation minus(a) is calculated as subtract('0', a) where the '0'
4815 has the same exponent as the operand.
4816
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004817 >>> ExtendedContext.minus(Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004818 Decimal('-1.3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004819 >>> ExtendedContext.minus(Decimal('-1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004820 Decimal('1.3')
Mark Dickinson84230a12010-02-18 14:49:50 +00004821 >>> ExtendedContext.minus(1)
4822 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004823 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004824 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004825 return a.__neg__(context=self)
4826
4827 def multiply(self, a, b):
4828 """multiply multiplies two operands.
4829
4830 If either operand is a special value then the general rules apply.
Mark Dickinson84230a12010-02-18 14:49:50 +00004831 Otherwise, the operands are multiplied together
4832 ('long multiplication'), resulting in a number which may be as long as
4833 the sum of the lengths of the two operands.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004834
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004835 >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004836 Decimal('3.60')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004837 >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004838 Decimal('21')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004839 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004840 Decimal('0.72')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004841 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004842 Decimal('-0.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004843 >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004844 Decimal('4.28135971E+11')
Mark Dickinson84230a12010-02-18 14:49:50 +00004845 >>> ExtendedContext.multiply(7, 7)
4846 Decimal('49')
4847 >>> ExtendedContext.multiply(Decimal(7), 7)
4848 Decimal('49')
4849 >>> ExtendedContext.multiply(7, Decimal(7))
4850 Decimal('49')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004851 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004852 a = _convert_other(a, raiseit=True)
4853 r = a.__mul__(b, context=self)
4854 if r is NotImplemented:
4855 raise TypeError("Unable to convert %s to Decimal" % b)
4856 else:
4857 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004858
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004859 def next_minus(self, a):
4860 """Returns the largest representable number smaller than a.
4861
4862 >>> c = ExtendedContext.copy()
4863 >>> c.Emin = -999
4864 >>> c.Emax = 999
4865 >>> ExtendedContext.next_minus(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004866 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004867 >>> c.next_minus(Decimal('1E-1007'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004868 Decimal('0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004869 >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004870 Decimal('-1.00000004')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004871 >>> c.next_minus(Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004872 Decimal('9.99999999E+999')
Mark Dickinson84230a12010-02-18 14:49:50 +00004873 >>> c.next_minus(1)
4874 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004875 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004876 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004877 return a.next_minus(context=self)
4878
4879 def next_plus(self, a):
4880 """Returns the smallest representable number larger than a.
4881
4882 >>> c = ExtendedContext.copy()
4883 >>> c.Emin = -999
4884 >>> c.Emax = 999
4885 >>> ExtendedContext.next_plus(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004886 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004887 >>> c.next_plus(Decimal('-1E-1007'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004888 Decimal('-0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004889 >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004890 Decimal('-1.00000002')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004891 >>> c.next_plus(Decimal('-Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004892 Decimal('-9.99999999E+999')
Mark Dickinson84230a12010-02-18 14:49:50 +00004893 >>> c.next_plus(1)
4894 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004895 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004896 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004897 return a.next_plus(context=self)
4898
4899 def next_toward(self, a, b):
4900 """Returns the number closest to a, in direction towards b.
4901
4902 The result is the closest representable number from the first
4903 operand (but not the first operand) that is in the direction
4904 towards the second operand, unless the operands have the same
4905 value.
4906
4907 >>> c = ExtendedContext.copy()
4908 >>> c.Emin = -999
4909 >>> c.Emax = 999
4910 >>> c.next_toward(Decimal('1'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004911 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004912 >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004913 Decimal('-0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004914 >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004915 Decimal('-1.00000002')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004916 >>> c.next_toward(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004917 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004918 >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004919 Decimal('0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004920 >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004921 Decimal('-1.00000004')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004922 >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004923 Decimal('-0.00')
Mark Dickinson84230a12010-02-18 14:49:50 +00004924 >>> c.next_toward(0, 1)
4925 Decimal('1E-1007')
4926 >>> c.next_toward(Decimal(0), 1)
4927 Decimal('1E-1007')
4928 >>> c.next_toward(0, Decimal(1))
4929 Decimal('1E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004930 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004931 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004932 return a.next_toward(b, context=self)
4933
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004934 def normalize(self, a):
Raymond Hettingere0f15812004-07-05 05:36:39 +00004935 """normalize reduces an operand to its simplest form.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004936
4937 Essentially a plus operation with all trailing zeros removed from the
4938 result.
4939
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004940 >>> ExtendedContext.normalize(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004941 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004942 >>> ExtendedContext.normalize(Decimal('-2.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004943 Decimal('-2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004944 >>> ExtendedContext.normalize(Decimal('1.200'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004945 Decimal('1.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004946 >>> ExtendedContext.normalize(Decimal('-120'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004947 Decimal('-1.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004948 >>> ExtendedContext.normalize(Decimal('120.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004949 Decimal('1.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004950 >>> ExtendedContext.normalize(Decimal('0.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004951 Decimal('0')
Mark Dickinson84230a12010-02-18 14:49:50 +00004952 >>> ExtendedContext.normalize(6)
4953 Decimal('6')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004954 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004955 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004956 return a.normalize(context=self)
4957
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004958 def number_class(self, a):
4959 """Returns an indication of the class of the operand.
4960
4961 The class is one of the following strings:
4962 -sNaN
4963 -NaN
4964 -Infinity
4965 -Normal
4966 -Subnormal
4967 -Zero
4968 +Zero
4969 +Subnormal
4970 +Normal
4971 +Infinity
4972
4973 >>> c = Context(ExtendedContext)
4974 >>> c.Emin = -999
4975 >>> c.Emax = 999
4976 >>> c.number_class(Decimal('Infinity'))
4977 '+Infinity'
4978 >>> c.number_class(Decimal('1E-10'))
4979 '+Normal'
4980 >>> c.number_class(Decimal('2.50'))
4981 '+Normal'
4982 >>> c.number_class(Decimal('0.1E-999'))
4983 '+Subnormal'
4984 >>> c.number_class(Decimal('0'))
4985 '+Zero'
4986 >>> c.number_class(Decimal('-0'))
4987 '-Zero'
4988 >>> c.number_class(Decimal('-0.1E-999'))
4989 '-Subnormal'
4990 >>> c.number_class(Decimal('-1E-10'))
4991 '-Normal'
4992 >>> c.number_class(Decimal('-2.50'))
4993 '-Normal'
4994 >>> c.number_class(Decimal('-Infinity'))
4995 '-Infinity'
4996 >>> c.number_class(Decimal('NaN'))
4997 'NaN'
4998 >>> c.number_class(Decimal('-NaN'))
4999 'NaN'
5000 >>> c.number_class(Decimal('sNaN'))
5001 'sNaN'
Mark Dickinson84230a12010-02-18 14:49:50 +00005002 >>> c.number_class(123)
5003 '+Normal'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005004 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005005 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005006 return a.number_class(context=self)
5007
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005008 def plus(self, a):
5009 """Plus corresponds to unary prefix plus in Python.
5010
5011 The operation is evaluated using the same rules as add; the
5012 operation plus(a) is calculated as add('0', a) where the '0'
5013 has the same exponent as the operand.
5014
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005015 >>> ExtendedContext.plus(Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005016 Decimal('1.3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005017 >>> ExtendedContext.plus(Decimal('-1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005018 Decimal('-1.3')
Mark Dickinson84230a12010-02-18 14:49:50 +00005019 >>> ExtendedContext.plus(-1)
5020 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005021 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005022 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005023 return a.__pos__(context=self)
5024
5025 def power(self, a, b, modulo=None):
5026 """Raises a to the power of b, to modulo if given.
5027
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005028 With two arguments, compute a**b. If a is negative then b
5029 must be integral. The result will be inexact unless b is
5030 integral and the result is finite and can be expressed exactly
5031 in 'precision' digits.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005032
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005033 With three arguments, compute (a**b) % modulo. For the
5034 three argument form, the following restrictions on the
5035 arguments hold:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005036
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005037 - all three arguments must be integral
5038 - b must be nonnegative
5039 - at least one of a or b must be nonzero
5040 - modulo must be nonzero and have at most 'precision' digits
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005041
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005042 The result of pow(a, b, modulo) is identical to the result
5043 that would be obtained by computing (a**b) % modulo with
5044 unbounded precision, but is computed more efficiently. It is
5045 always exact.
5046
5047 >>> c = ExtendedContext.copy()
5048 >>> c.Emin = -999
5049 >>> c.Emax = 999
5050 >>> c.power(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005051 Decimal('8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005052 >>> c.power(Decimal('-2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005053 Decimal('-8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005054 >>> c.power(Decimal('2'), Decimal('-3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005055 Decimal('0.125')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005056 >>> c.power(Decimal('1.7'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005057 Decimal('69.7575744')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005058 >>> c.power(Decimal('10'), Decimal('0.301029996'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005059 Decimal('2.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005060 >>> c.power(Decimal('Infinity'), Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005061 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005062 >>> c.power(Decimal('Infinity'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005063 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005064 >>> c.power(Decimal('Infinity'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005065 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005066 >>> c.power(Decimal('-Infinity'), Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005067 Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005068 >>> c.power(Decimal('-Infinity'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005069 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005070 >>> c.power(Decimal('-Infinity'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005071 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005072 >>> c.power(Decimal('-Infinity'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005073 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005074 >>> c.power(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005075 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005076
5077 >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005078 Decimal('11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005079 >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005080 Decimal('-11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005081 >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005082 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005083 >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005084 Decimal('11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005085 >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005086 Decimal('11729830')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005087 >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005088 Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005089 >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005090 Decimal('1')
Mark Dickinson84230a12010-02-18 14:49:50 +00005091 >>> ExtendedContext.power(7, 7)
5092 Decimal('823543')
5093 >>> ExtendedContext.power(Decimal(7), 7)
5094 Decimal('823543')
5095 >>> ExtendedContext.power(7, Decimal(7), 2)
5096 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005097 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005098 a = _convert_other(a, raiseit=True)
5099 r = a.__pow__(b, modulo, context=self)
5100 if r is NotImplemented:
5101 raise TypeError("Unable to convert %s to Decimal" % b)
5102 else:
5103 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005104
5105 def quantize(self, a, b):
Guido van Rossumd8faa362007-04-27 19:54:29 +00005106 """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005107
5108 The coefficient of the result is derived from that of the left-hand
Guido van Rossumd8faa362007-04-27 19:54:29 +00005109 operand. It may be rounded using the current rounding setting (if the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005110 exponent is being increased), multiplied by a positive power of ten (if
5111 the exponent is being decreased), or is unchanged (if the exponent is
5112 already equal to that of the right-hand operand).
5113
5114 Unlike other operations, if the length of the coefficient after the
5115 quantize operation would be greater than precision then an Invalid
Guido van Rossumd8faa362007-04-27 19:54:29 +00005116 operation condition is raised. This guarantees that, unless there is
5117 an error condition, the exponent of the result of a quantize is always
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005118 equal to that of the right-hand operand.
5119
5120 Also unlike other operations, quantize will never raise Underflow, even
5121 if the result is subnormal and inexact.
5122
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005123 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005124 Decimal('2.170')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005125 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005126 Decimal('2.17')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005127 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005128 Decimal('2.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005129 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005130 Decimal('2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005131 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005132 Decimal('0E+1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005133 >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005134 Decimal('-Infinity')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005135 >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005136 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005137 >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005138 Decimal('-0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005139 >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005140 Decimal('-0E+5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005141 >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005142 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005143 >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005144 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005145 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005146 Decimal('217.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005147 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005148 Decimal('217')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005149 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005150 Decimal('2.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005151 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005152 Decimal('2E+2')
Mark Dickinson84230a12010-02-18 14:49:50 +00005153 >>> ExtendedContext.quantize(1, 2)
5154 Decimal('1')
5155 >>> ExtendedContext.quantize(Decimal(1), 2)
5156 Decimal('1')
5157 >>> ExtendedContext.quantize(1, Decimal(2))
5158 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005159 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005160 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005161 return a.quantize(b, context=self)
5162
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005163 def radix(self):
5164 """Just returns 10, as this is Decimal, :)
5165
5166 >>> ExtendedContext.radix()
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005167 Decimal('10')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005168 """
5169 return Decimal(10)
5170
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005171 def remainder(self, a, b):
5172 """Returns the remainder from integer division.
5173
5174 The result is the residue of the dividend after the operation of
Guido van Rossumd8faa362007-04-27 19:54:29 +00005175 calculating integer division as described for divide-integer, rounded
5176 to precision digits if necessary. The sign of the result, if
5177 non-zero, is the same as that of the original dividend.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005178
5179 This operation will fail under the same conditions as integer division
5180 (that is, if integer division on the same two operands would fail, the
5181 remainder cannot be calculated).
5182
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005183 >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005184 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005185 >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005186 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005187 >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005188 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005189 >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005190 Decimal('0.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005191 >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005192 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005193 >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005194 Decimal('1.0')
Mark Dickinson84230a12010-02-18 14:49:50 +00005195 >>> ExtendedContext.remainder(22, 6)
5196 Decimal('4')
5197 >>> ExtendedContext.remainder(Decimal(22), 6)
5198 Decimal('4')
5199 >>> ExtendedContext.remainder(22, Decimal(6))
5200 Decimal('4')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005201 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005202 a = _convert_other(a, raiseit=True)
5203 r = a.__mod__(b, context=self)
5204 if r is NotImplemented:
5205 raise TypeError("Unable to convert %s to Decimal" % b)
5206 else:
5207 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005208
5209 def remainder_near(self, a, b):
5210 """Returns to be "a - b * n", where n is the integer nearest the exact
5211 value of "x / b" (if two integers are equally near then the even one
Guido van Rossumd8faa362007-04-27 19:54:29 +00005212 is chosen). If the result is equal to 0 then its sign will be the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005213 sign of a.
5214
5215 This operation will fail under the same conditions as integer division
5216 (that is, if integer division on the same two operands would fail, the
5217 remainder cannot be calculated).
5218
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005219 >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005220 Decimal('-0.9')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005221 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005222 Decimal('-2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005223 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005224 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005225 >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005226 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005227 >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005228 Decimal('0.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005229 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005230 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005231 >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005232 Decimal('-0.3')
Mark Dickinson84230a12010-02-18 14:49:50 +00005233 >>> ExtendedContext.remainder_near(3, 11)
5234 Decimal('3')
5235 >>> ExtendedContext.remainder_near(Decimal(3), 11)
5236 Decimal('3')
5237 >>> ExtendedContext.remainder_near(3, Decimal(11))
5238 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005239 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005240 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005241 return a.remainder_near(b, context=self)
5242
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005243 def rotate(self, a, b):
5244 """Returns a rotated copy of a, b times.
5245
5246 The coefficient of the result is a rotated copy of the digits in
5247 the coefficient of the first operand. The number of places of
5248 rotation is taken from the absolute value of the second operand,
5249 with the rotation being to the left if the second operand is
5250 positive or to the right otherwise.
5251
5252 >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005253 Decimal('400000003')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005254 >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005255 Decimal('12')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005256 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005257 Decimal('891234567')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005258 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005259 Decimal('123456789')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005260 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005261 Decimal('345678912')
Mark Dickinson84230a12010-02-18 14:49:50 +00005262 >>> ExtendedContext.rotate(1333333, 1)
5263 Decimal('13333330')
5264 >>> ExtendedContext.rotate(Decimal(1333333), 1)
5265 Decimal('13333330')
5266 >>> ExtendedContext.rotate(1333333, Decimal(1))
5267 Decimal('13333330')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005268 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005269 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005270 return a.rotate(b, context=self)
5271
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005272 def same_quantum(self, a, b):
5273 """Returns True if the two operands have the same exponent.
5274
5275 The result is never affected by either the sign or the coefficient of
5276 either operand.
5277
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005278 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005279 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005280 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005281 True
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005282 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005283 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005284 >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005285 True
Mark Dickinson84230a12010-02-18 14:49:50 +00005286 >>> ExtendedContext.same_quantum(10000, -1)
5287 True
5288 >>> ExtendedContext.same_quantum(Decimal(10000), -1)
5289 True
5290 >>> ExtendedContext.same_quantum(10000, Decimal(-1))
5291 True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005292 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005293 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005294 return a.same_quantum(b)
5295
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005296 def scaleb (self, a, b):
5297 """Returns the first operand after adding the second value its exp.
5298
5299 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005300 Decimal('0.0750')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005301 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005302 Decimal('7.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005303 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005304 Decimal('7.50E+3')
Mark Dickinson84230a12010-02-18 14:49:50 +00005305 >>> ExtendedContext.scaleb(1, 4)
5306 Decimal('1E+4')
5307 >>> ExtendedContext.scaleb(Decimal(1), 4)
5308 Decimal('1E+4')
5309 >>> ExtendedContext.scaleb(1, Decimal(4))
5310 Decimal('1E+4')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005311 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005312 a = _convert_other(a, raiseit=True)
5313 return a.scaleb(b, context=self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005314
5315 def shift(self, a, b):
5316 """Returns a shifted copy of a, b times.
5317
5318 The coefficient of the result is a shifted copy of the digits
5319 in the coefficient of the first operand. The number of places
5320 to shift is taken from the absolute value of the second operand,
5321 with the shift being to the left if the second operand is
5322 positive or to the right otherwise. Digits shifted into the
5323 coefficient are zeros.
5324
5325 >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005326 Decimal('400000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005327 >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005328 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005329 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005330 Decimal('1234567')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005331 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005332 Decimal('123456789')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005333 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005334 Decimal('345678900')
Mark Dickinson84230a12010-02-18 14:49:50 +00005335 >>> ExtendedContext.shift(88888888, 2)
5336 Decimal('888888800')
5337 >>> ExtendedContext.shift(Decimal(88888888), 2)
5338 Decimal('888888800')
5339 >>> ExtendedContext.shift(88888888, Decimal(2))
5340 Decimal('888888800')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005341 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005342 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005343 return a.shift(b, context=self)
5344
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005345 def sqrt(self, a):
Guido van Rossumd8faa362007-04-27 19:54:29 +00005346 """Square root of a non-negative number to context precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005347
5348 If the result must be inexact, it is rounded using the round-half-even
5349 algorithm.
5350
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005351 >>> ExtendedContext.sqrt(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005352 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005353 >>> ExtendedContext.sqrt(Decimal('-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005354 Decimal('-0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005355 >>> ExtendedContext.sqrt(Decimal('0.39'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005356 Decimal('0.624499800')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005357 >>> ExtendedContext.sqrt(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005358 Decimal('10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005359 >>> ExtendedContext.sqrt(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005360 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005361 >>> ExtendedContext.sqrt(Decimal('1.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005362 Decimal('1.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005363 >>> ExtendedContext.sqrt(Decimal('1.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005364 Decimal('1.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005365 >>> ExtendedContext.sqrt(Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005366 Decimal('2.64575131')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005367 >>> ExtendedContext.sqrt(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005368 Decimal('3.16227766')
Mark Dickinson84230a12010-02-18 14:49:50 +00005369 >>> ExtendedContext.sqrt(2)
5370 Decimal('1.41421356')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005371 >>> ExtendedContext.prec
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005372 9
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005373 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005374 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005375 return a.sqrt(context=self)
5376
5377 def subtract(self, a, b):
Georg Brandlf33d01d2005-08-22 19:35:18 +00005378 """Return the difference between the two operands.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005379
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005380 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005381 Decimal('0.23')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005382 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005383 Decimal('0.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005384 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005385 Decimal('-0.77')
Mark Dickinson84230a12010-02-18 14:49:50 +00005386 >>> ExtendedContext.subtract(8, 5)
5387 Decimal('3')
5388 >>> ExtendedContext.subtract(Decimal(8), 5)
5389 Decimal('3')
5390 >>> ExtendedContext.subtract(8, Decimal(5))
5391 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005392 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005393 a = _convert_other(a, raiseit=True)
5394 r = a.__sub__(b, context=self)
5395 if r is NotImplemented:
5396 raise TypeError("Unable to convert %s to Decimal" % b)
5397 else:
5398 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005399
5400 def to_eng_string(self, a):
5401 """Converts a number to a string, using scientific notation.
5402
5403 The operation is not affected by the context.
5404 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005405 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005406 return a.to_eng_string(context=self)
5407
5408 def to_sci_string(self, a):
5409 """Converts a number to a string, using scientific notation.
5410
5411 The operation is not affected by the context.
5412 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005413 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005414 return a.__str__(context=self)
5415
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005416 def to_integral_exact(self, a):
5417 """Rounds to an integer.
5418
5419 When the operand has a negative exponent, the result is the same
5420 as using the quantize() operation using the given operand as the
5421 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
5422 of the operand as the precision setting; Inexact and Rounded flags
5423 are allowed in this operation. The rounding mode is taken from the
5424 context.
5425
5426 >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005427 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005428 >>> ExtendedContext.to_integral_exact(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005429 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005430 >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005431 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005432 >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005433 Decimal('102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005434 >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005435 Decimal('-102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005436 >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005437 Decimal('1.0E+6')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005438 >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005439 Decimal('7.89E+77')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005440 >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005441 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005442 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005443 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005444 return a.to_integral_exact(context=self)
5445
5446 def to_integral_value(self, a):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005447 """Rounds to an integer.
5448
5449 When the operand has a negative exponent, the result is the same
5450 as using the quantize() operation using the given operand as the
5451 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
5452 of the operand as the precision setting, except that no flags will
Guido van Rossumd8faa362007-04-27 19:54:29 +00005453 be set. The rounding mode is taken from the context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005454
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005455 >>> ExtendedContext.to_integral_value(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005456 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005457 >>> ExtendedContext.to_integral_value(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005458 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005459 >>> ExtendedContext.to_integral_value(Decimal('100.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005460 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005461 >>> ExtendedContext.to_integral_value(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005462 Decimal('102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005463 >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005464 Decimal('-102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005465 >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005466 Decimal('1.0E+6')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005467 >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005468 Decimal('7.89E+77')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005469 >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005470 Decimal('-Infinity')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005471 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005472 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005473 return a.to_integral_value(context=self)
5474
5475 # the method name changed, but we provide also the old one, for compatibility
5476 to_integral = to_integral_value
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005477
5478class _WorkRep(object):
5479 __slots__ = ('sign','int','exp')
Raymond Hettinger17931de2004-10-27 06:21:46 +00005480 # sign: 0 or 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005481 # int: int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005482 # exp: None, int, or string
5483
5484 def __init__(self, value=None):
5485 if value is None:
5486 self.sign = None
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005487 self.int = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005488 self.exp = None
Raymond Hettinger17931de2004-10-27 06:21:46 +00005489 elif isinstance(value, Decimal):
5490 self.sign = value._sign
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005491 self.int = int(value._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005492 self.exp = value._exp
Raymond Hettinger17931de2004-10-27 06:21:46 +00005493 else:
5494 # assert isinstance(value, tuple)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005495 self.sign = value[0]
5496 self.int = value[1]
5497 self.exp = value[2]
5498
5499 def __repr__(self):
5500 return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
5501
5502 __str__ = __repr__
5503
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005504
5505
Christian Heimes2c181612007-12-17 20:04:13 +00005506def _normalize(op1, op2, prec = 0):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005507 """Normalizes op1, op2 to have the same exp and length of coefficient.
5508
5509 Done during addition.
5510 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005511 if op1.exp < op2.exp:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005512 tmp = op2
5513 other = op1
5514 else:
5515 tmp = op1
5516 other = op2
5517
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005518 # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
5519 # Then adding 10**exp to tmp has the same effect (after rounding)
5520 # as adding any positive quantity smaller than 10**exp; similarly
5521 # for subtraction. So if other is smaller than 10**exp we replace
5522 # it with 10**exp. This avoids tmp.exp - other.exp getting too large.
Christian Heimes2c181612007-12-17 20:04:13 +00005523 tmp_len = len(str(tmp.int))
5524 other_len = len(str(other.int))
5525 exp = tmp.exp + min(-1, tmp_len - prec - 2)
5526 if other_len + other.exp - 1 < exp:
5527 other.int = 1
5528 other.exp = exp
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005529
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005530 tmp.int *= 10 ** (tmp.exp - other.exp)
5531 tmp.exp = other.exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005532 return op1, op2
5533
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005534##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005535
Raymond Hettingerdb213a22010-11-27 08:09:40 +00005536_nbits = int.bit_length
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005537
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005538def _sqrt_nearest(n, a):
5539 """Closest integer to the square root of the positive integer n. a is
5540 an initial approximation to the square root. Any positive integer
5541 will do for a, but the closer a is to the square root of n the
5542 faster convergence will be.
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005543
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005544 """
5545 if n <= 0 or a <= 0:
5546 raise ValueError("Both arguments to _sqrt_nearest should be positive.")
5547
5548 b=0
5549 while a != b:
5550 b, a = a, a--n//a>>1
5551 return a
5552
5553def _rshift_nearest(x, shift):
5554 """Given an integer x and a nonnegative integer shift, return closest
5555 integer to x / 2**shift; use round-to-even in case of a tie.
5556
5557 """
5558 b, q = 1 << shift, x >> shift
5559 return q + (2*(x & (b-1)) + (q&1) > b)
5560
5561def _div_nearest(a, b):
5562 """Closest integer to a/b, a and b positive integers; rounds to even
5563 in the case of a tie.
5564
5565 """
5566 q, r = divmod(a, b)
5567 return q + (2*r + (q&1) > b)
5568
5569def _ilog(x, M, L = 8):
5570 """Integer approximation to M*log(x/M), with absolute error boundable
5571 in terms only of x/M.
5572
5573 Given positive integers x and M, return an integer approximation to
5574 M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference
5575 between the approximation and the exact result is at most 22. For
5576 L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In
5577 both cases these are upper bounds on the error; it will usually be
5578 much smaller."""
5579
5580 # The basic algorithm is the following: let log1p be the function
5581 # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use
5582 # the reduction
5583 #
5584 # log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
5585 #
5586 # repeatedly until the argument to log1p is small (< 2**-L in
5587 # absolute value). For small y we can use the Taylor series
5588 # expansion
5589 #
5590 # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
5591 #
5592 # truncating at T such that y**T is small enough. The whole
5593 # computation is carried out in a form of fixed-point arithmetic,
5594 # with a real number z being represented by an integer
5595 # approximation to z*M. To avoid loss of precision, the y below
5596 # is actually an integer approximation to 2**R*y*M, where R is the
5597 # number of reductions performed so far.
5598
5599 y = x-M
5600 # argument reduction; R = number of reductions performed
5601 R = 0
5602 while (R <= L and abs(y) << L-R >= M or
5603 R > L and abs(y) >> R-L >= M):
5604 y = _div_nearest((M*y) << 1,
5605 M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
5606 R += 1
5607
5608 # Taylor series with T terms
5609 T = -int(-10*len(str(M))//(3*L))
5610 yshift = _rshift_nearest(y, R)
5611 w = _div_nearest(M, T)
5612 for k in range(T-1, 0, -1):
5613 w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
5614
5615 return _div_nearest(w*y, M)
5616
5617def _dlog10(c, e, p):
5618 """Given integers c, e and p with c > 0, p >= 0, compute an integer
5619 approximation to 10**p * log10(c*10**e), with an absolute error of
5620 at most 1. Assumes that c*10**e is not exactly 1."""
5621
5622 # increase precision by 2; compensate for this by dividing
5623 # final result by 100
5624 p += 2
5625
5626 # write c*10**e as d*10**f with either:
5627 # f >= 0 and 1 <= d <= 10, or
5628 # f <= 0 and 0.1 <= d <= 1.
5629 # Thus for c*10**e close to 1, f = 0
5630 l = len(str(c))
5631 f = e+l - (e+l >= 1)
5632
5633 if p > 0:
5634 M = 10**p
5635 k = e+p-f
5636 if k >= 0:
5637 c *= 10**k
5638 else:
5639 c = _div_nearest(c, 10**-k)
5640
5641 log_d = _ilog(c, M) # error < 5 + 22 = 27
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005642 log_10 = _log10_digits(p) # error < 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005643 log_d = _div_nearest(log_d*M, log_10)
5644 log_tenpower = f*M # exact
5645 else:
5646 log_d = 0 # error < 2.31
Neal Norwitz2f99b242008-08-24 05:48:10 +00005647 log_tenpower = _div_nearest(f, 10**-p) # error < 0.5
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005648
5649 return _div_nearest(log_tenpower+log_d, 100)
5650
5651def _dlog(c, e, p):
5652 """Given integers c, e and p with c > 0, compute an integer
5653 approximation to 10**p * log(c*10**e), with an absolute error of
5654 at most 1. Assumes that c*10**e is not exactly 1."""
5655
5656 # Increase precision by 2. The precision increase is compensated
5657 # for at the end with a division by 100.
5658 p += 2
5659
5660 # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
5661 # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e)
5662 # as 10**p * log(d) + 10**p*f * log(10).
5663 l = len(str(c))
5664 f = e+l - (e+l >= 1)
5665
5666 # compute approximation to 10**p*log(d), with error < 27
5667 if p > 0:
5668 k = e+p-f
5669 if k >= 0:
5670 c *= 10**k
5671 else:
5672 c = _div_nearest(c, 10**-k) # error of <= 0.5 in c
5673
5674 # _ilog magnifies existing error in c by a factor of at most 10
5675 log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
5676 else:
5677 # p <= 0: just approximate the whole thing by 0; error < 2.31
5678 log_d = 0
5679
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005680 # compute approximation to f*10**p*log(10), with error < 11.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005681 if f:
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005682 extra = len(str(abs(f)))-1
5683 if p + extra >= 0:
5684 # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
5685 # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
5686 f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005687 else:
5688 f_log_ten = 0
5689 else:
5690 f_log_ten = 0
5691
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005692 # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005693 return _div_nearest(f_log_ten + log_d, 100)
5694
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005695class _Log10Memoize(object):
5696 """Class to compute, store, and allow retrieval of, digits of the
5697 constant log(10) = 2.302585.... This constant is needed by
5698 Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
5699 def __init__(self):
5700 self.digits = "23025850929940456840179914546843642076011014886"
5701
5702 def getdigits(self, p):
5703 """Given an integer p >= 0, return floor(10**p)*log(10).
5704
5705 For example, self.getdigits(3) returns 2302.
5706 """
5707 # digits are stored as a string, for quick conversion to
5708 # integer in the case that we've already computed enough
5709 # digits; the stored digits should always be correct
5710 # (truncated, not rounded to nearest).
5711 if p < 0:
5712 raise ValueError("p should be nonnegative")
5713
5714 if p >= len(self.digits):
5715 # compute p+3, p+6, p+9, ... digits; continue until at
5716 # least one of the extra digits is nonzero
5717 extra = 3
5718 while True:
5719 # compute p+extra digits, correct to within 1ulp
5720 M = 10**(p+extra+2)
5721 digits = str(_div_nearest(_ilog(10*M, M), 100))
5722 if digits[-extra:] != '0'*extra:
5723 break
5724 extra += 3
5725 # keep all reliable digits so far; remove trailing zeros
5726 # and next nonzero digit
5727 self.digits = digits.rstrip('0')[:-1]
5728 return int(self.digits[:p+1])
5729
5730_log10_digits = _Log10Memoize().getdigits
5731
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005732def _iexp(x, M, L=8):
5733 """Given integers x and M, M > 0, such that x/M is small in absolute
5734 value, compute an integer approximation to M*exp(x/M). For 0 <=
5735 x/M <= 2.4, the absolute error in the result is bounded by 60 (and
5736 is usually much smaller)."""
5737
5738 # Algorithm: to compute exp(z) for a real number z, first divide z
5739 # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then
5740 # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
5741 # series
5742 #
5743 # expm1(x) = x + x**2/2! + x**3/3! + ...
5744 #
5745 # Now use the identity
5746 #
5747 # expm1(2x) = expm1(x)*(expm1(x)+2)
5748 #
5749 # R times to compute the sequence expm1(z/2**R),
5750 # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
5751
5752 # Find R such that x/2**R/M <= 2**-L
5753 R = _nbits((x<<L)//M)
5754
5755 # Taylor series. (2**L)**T > M
5756 T = -int(-10*len(str(M))//(3*L))
5757 y = _div_nearest(x, T)
5758 Mshift = M<<R
5759 for i in range(T-1, 0, -1):
5760 y = _div_nearest(x*(Mshift + y), Mshift * i)
5761
5762 # Expansion
5763 for k in range(R-1, -1, -1):
5764 Mshift = M<<(k+2)
5765 y = _div_nearest(y*(y+Mshift), Mshift)
5766
5767 return M+y
5768
5769def _dexp(c, e, p):
5770 """Compute an approximation to exp(c*10**e), with p decimal places of
5771 precision.
5772
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005773 Returns integers d, f such that:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005774
5775 10**(p-1) <= d <= 10**p, and
5776 (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
5777
5778 In other words, d*10**f is an approximation to exp(c*10**e) with p
5779 digits of precision, and with an error in d of at most 1. This is
5780 almost, but not quite, the same as the error being < 1ulp: when d
5781 = 10**(p-1) the error could be up to 10 ulp."""
5782
5783 # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
5784 p += 2
5785
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005786 # compute log(10) with extra precision = adjusted exponent of c*10**e
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005787 extra = max(0, e + len(str(c)) - 1)
5788 q = p + extra
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005789
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005790 # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005791 # rounding down
5792 shift = e+q
5793 if shift >= 0:
5794 cshift = c*10**shift
5795 else:
5796 cshift = c//10**-shift
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005797 quot, rem = divmod(cshift, _log10_digits(q))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005798
5799 # reduce remainder back to original precision
5800 rem = _div_nearest(rem, 10**extra)
5801
5802 # error in result of _iexp < 120; error after division < 0.62
5803 return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
5804
5805def _dpower(xc, xe, yc, ye, p):
5806 """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
5807 y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that:
5808
5809 10**(p-1) <= c <= 10**p, and
5810 (c-1)*10**e < x**y < (c+1)*10**e
5811
5812 in other words, c*10**e is an approximation to x**y with p digits
5813 of precision, and with an error in c of at most 1. (This is
5814 almost, but not quite, the same as the error being < 1ulp: when c
5815 == 10**(p-1) we can only guarantee error < 10ulp.)
5816
5817 We assume that: x is positive and not equal to 1, and y is nonzero.
5818 """
5819
5820 # Find b such that 10**(b-1) <= |y| <= 10**b
5821 b = len(str(abs(yc))) + ye
5822
5823 # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
5824 lxc = _dlog(xc, xe, p+b+1)
5825
5826 # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
5827 shift = ye-b
5828 if shift >= 0:
5829 pc = lxc*yc*10**shift
5830 else:
5831 pc = _div_nearest(lxc*yc, 10**-shift)
5832
5833 if pc == 0:
5834 # we prefer a result that isn't exactly 1; this makes it
5835 # easier to compute a correctly rounded result in __pow__
5836 if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
5837 coeff, exp = 10**(p-1)+1, 1-p
5838 else:
5839 coeff, exp = 10**p-1, -p
5840 else:
5841 coeff, exp = _dexp(pc, -(p+1), p+1)
5842 coeff = _div_nearest(coeff, 10)
5843 exp += 1
5844
5845 return coeff, exp
5846
5847def _log10_lb(c, correction = {
5848 '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
5849 '6': 23, '7': 16, '8': 10, '9': 5}):
5850 """Compute a lower bound for 100*log10(c) for a positive integer c."""
5851 if c <= 0:
5852 raise ValueError("The argument to _log10_lb should be nonnegative.")
5853 str_c = str(c)
5854 return 100*len(str_c) - correction[str_c[0]]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005855
Guido van Rossumd8faa362007-04-27 19:54:29 +00005856##### Helper Functions ####################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005857
Mark Dickinsonac256ab2010-04-03 11:08:14 +00005858def _convert_other(other, raiseit=False, allow_float=False):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005859 """Convert other to Decimal.
5860
5861 Verifies that it's ok to use in an implicit construction.
Mark Dickinsonac256ab2010-04-03 11:08:14 +00005862 If allow_float is true, allow conversion from float; this
5863 is used in the comparison methods (__eq__ and friends).
5864
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005865 """
5866 if isinstance(other, Decimal):
5867 return other
Walter Dörwaldaa97f042007-05-03 21:05:51 +00005868 if isinstance(other, int):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005869 return Decimal(other)
Mark Dickinsonac256ab2010-04-03 11:08:14 +00005870 if allow_float and isinstance(other, float):
5871 return Decimal.from_float(other)
5872
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005873 if raiseit:
5874 raise TypeError("Unable to convert %s to Decimal" % other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00005875 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005876
Mark Dickinson08ade6f2010-06-11 10:44:52 +00005877def _convert_for_comparison(self, other, equality_op=False):
5878 """Given a Decimal instance self and a Python object other, return
Mark Dickinson1c164a62010-06-11 16:49:20 +00005879 a pair (s, o) of Decimal instances such that "s op o" is
Mark Dickinson08ade6f2010-06-11 10:44:52 +00005880 equivalent to "self op other" for any of the 6 comparison
5881 operators "op".
5882
5883 """
5884 if isinstance(other, Decimal):
5885 return self, other
5886
5887 # Comparison with a Rational instance (also includes integers):
5888 # self op n/d <=> self*d op n (for n and d integers, d positive).
5889 # A NaN or infinity can be left unchanged without affecting the
5890 # comparison result.
5891 if isinstance(other, _numbers.Rational):
5892 if not self._is_special:
5893 self = _dec_from_triple(self._sign,
5894 str(int(self._int) * other.denominator),
5895 self._exp)
5896 return self, Decimal(other.numerator)
5897
5898 # Comparisons with float and complex types. == and != comparisons
5899 # with complex numbers should succeed, returning either True or False
5900 # as appropriate. Other comparisons return NotImplemented.
5901 if equality_op and isinstance(other, _numbers.Complex) and other.imag == 0:
5902 other = other.real
5903 if isinstance(other, float):
5904 return self, Decimal.from_float(other)
5905 return NotImplemented, NotImplemented
5906
5907
Guido van Rossumd8faa362007-04-27 19:54:29 +00005908##### Setup Specific Contexts ############################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005909
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005910# The default context prototype used by Context()
Raymond Hettingerfed52962004-07-14 15:41:57 +00005911# Is mutable, so that new contexts can have different default values
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005912
5913DefaultContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005914 prec=28, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005915 traps=[DivisionByZero, Overflow, InvalidOperation],
5916 flags=[],
Raymond Hettinger99148e72004-07-14 19:56:56 +00005917 Emax=999999999,
5918 Emin=-999999999,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00005919 capitals=1,
5920 clamp=0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005921)
5922
5923# Pre-made alternate contexts offered by the specification
5924# Don't change these; the user should be able to select these
5925# contexts and be able to reproduce results from other implementations
5926# of the spec.
5927
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005928BasicContext = Context(
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005929 prec=9, rounding=ROUND_HALF_UP,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005930 traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
5931 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005932)
5933
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005934ExtendedContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005935 prec=9, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005936 traps=[],
5937 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005938)
5939
5940
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005941##### crud for parsing strings #############################################
Christian Heimes23daade02008-02-25 12:39:23 +00005942#
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005943# Regular expression used for parsing numeric strings. Additional
5944# comments:
5945#
5946# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
5947# whitespace. But note that the specification disallows whitespace in
5948# a numeric string.
5949#
5950# 2. For finite numbers (not infinities and NaNs) the body of the
5951# number between the optional sign and the optional exponent must have
5952# at least one decimal digit, possibly after the decimal point. The
Mark Dickinson345adc42009-08-02 10:14:23 +00005953# lookahead expression '(?=\d|\.\d)' checks this.
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005954
5955import re
Benjamin Peterson41181742008-07-02 20:22:54 +00005956_parser = re.compile(r""" # A numeric string consists of:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005957# \s*
Benjamin Peterson41181742008-07-02 20:22:54 +00005958 (?P<sign>[-+])? # an optional sign, followed by either...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005959 (
Mark Dickinson345adc42009-08-02 10:14:23 +00005960 (?=\d|\.\d) # ...a number (with at least one digit)
5961 (?P<int>\d*) # having a (possibly empty) integer part
5962 (\.(?P<frac>\d*))? # followed by an optional fractional part
5963 (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005964 |
Benjamin Peterson41181742008-07-02 20:22:54 +00005965 Inf(inity)? # ...an infinity, or...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005966 |
Benjamin Peterson41181742008-07-02 20:22:54 +00005967 (?P<signal>s)? # ...an (optionally signaling)
5968 NaN # NaN
Mark Dickinson345adc42009-08-02 10:14:23 +00005969 (?P<diag>\d*) # with (possibly empty) diagnostic info.
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005970 )
5971# \s*
Christian Heimesa62da1d2008-01-12 19:39:10 +00005972 \Z
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005973""", re.VERBOSE | re.IGNORECASE).match
5974
Christian Heimescbf3b5c2007-12-03 21:02:03 +00005975_all_zeros = re.compile('0*$').match
5976_exact_half = re.compile('50*$').match
Christian Heimesf16baeb2008-02-29 14:57:44 +00005977
5978##### PEP3101 support functions ##############################################
Mark Dickinson79f52032009-03-17 23:12:51 +00005979# The functions in this section have little to do with the Decimal
5980# class, and could potentially be reused or adapted for other pure
Christian Heimesf16baeb2008-02-29 14:57:44 +00005981# Python numeric classes that want to implement __format__
5982#
5983# A format specifier for Decimal looks like:
5984#
Eric Smith984bb582010-11-25 16:08:06 +00005985# [[fill]align][sign][#][0][minimumwidth][,][.precision][type]
Christian Heimesf16baeb2008-02-29 14:57:44 +00005986
5987_parse_format_specifier_regex = re.compile(r"""\A
5988(?:
5989 (?P<fill>.)?
5990 (?P<align>[<>=^])
5991)?
5992(?P<sign>[-+ ])?
Eric Smith984bb582010-11-25 16:08:06 +00005993(?P<alt>\#)?
Christian Heimesf16baeb2008-02-29 14:57:44 +00005994(?P<zeropad>0)?
5995(?P<minimumwidth>(?!0)\d+)?
Mark Dickinson79f52032009-03-17 23:12:51 +00005996(?P<thousands_sep>,)?
Christian Heimesf16baeb2008-02-29 14:57:44 +00005997(?:\.(?P<precision>0|(?!0)\d+))?
Mark Dickinson79f52032009-03-17 23:12:51 +00005998(?P<type>[eEfFgGn%])?
Christian Heimesf16baeb2008-02-29 14:57:44 +00005999\Z
6000""", re.VERBOSE)
6001
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00006002del re
6003
Mark Dickinson79f52032009-03-17 23:12:51 +00006004# The locale module is only needed for the 'n' format specifier. The
6005# rest of the PEP 3101 code functions quite happily without it, so we
6006# don't care too much if locale isn't present.
6007try:
6008 import locale as _locale
6009except ImportError:
6010 pass
6011
6012def _parse_format_specifier(format_spec, _localeconv=None):
Christian Heimesf16baeb2008-02-29 14:57:44 +00006013 """Parse and validate a format specifier.
6014
6015 Turns a standard numeric format specifier into a dict, with the
6016 following entries:
6017
6018 fill: fill character to pad field to minimum width
6019 align: alignment type, either '<', '>', '=' or '^'
6020 sign: either '+', '-' or ' '
6021 minimumwidth: nonnegative integer giving minimum width
Mark Dickinson79f52032009-03-17 23:12:51 +00006022 zeropad: boolean, indicating whether to pad with zeros
6023 thousands_sep: string to use as thousands separator, or ''
6024 grouping: grouping for thousands separators, in format
6025 used by localeconv
6026 decimal_point: string to use for decimal point
Christian Heimesf16baeb2008-02-29 14:57:44 +00006027 precision: nonnegative integer giving precision, or None
6028 type: one of the characters 'eEfFgG%', or None
Christian Heimesf16baeb2008-02-29 14:57:44 +00006029
6030 """
6031 m = _parse_format_specifier_regex.match(format_spec)
6032 if m is None:
6033 raise ValueError("Invalid format specifier: " + format_spec)
6034
6035 # get the dictionary
6036 format_dict = m.groupdict()
6037
Mark Dickinson79f52032009-03-17 23:12:51 +00006038 # zeropad; defaults for fill and alignment. If zero padding
6039 # is requested, the fill and align fields should be absent.
Christian Heimesf16baeb2008-02-29 14:57:44 +00006040 fill = format_dict['fill']
6041 align = format_dict['align']
Mark Dickinson79f52032009-03-17 23:12:51 +00006042 format_dict['zeropad'] = (format_dict['zeropad'] is not None)
6043 if format_dict['zeropad']:
6044 if fill is not None:
Christian Heimesf16baeb2008-02-29 14:57:44 +00006045 raise ValueError("Fill character conflicts with '0'"
6046 " in format specifier: " + format_spec)
Mark Dickinson79f52032009-03-17 23:12:51 +00006047 if align is not None:
Christian Heimesf16baeb2008-02-29 14:57:44 +00006048 raise ValueError("Alignment conflicts with '0' in "
6049 "format specifier: " + format_spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00006050 format_dict['fill'] = fill or ' '
Mark Dickinson46ab5d02009-09-08 20:22:46 +00006051 # PEP 3101 originally specified that the default alignment should
6052 # be left; it was later agreed that right-aligned makes more sense
6053 # for numeric types. See http://bugs.python.org/issue6857.
6054 format_dict['align'] = align or '>'
Christian Heimesf16baeb2008-02-29 14:57:44 +00006055
Mark Dickinson79f52032009-03-17 23:12:51 +00006056 # default sign handling: '-' for negative, '' for positive
Christian Heimesf16baeb2008-02-29 14:57:44 +00006057 if format_dict['sign'] is None:
6058 format_dict['sign'] = '-'
6059
Christian Heimesf16baeb2008-02-29 14:57:44 +00006060 # minimumwidth defaults to 0; precision remains None if not given
6061 format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
6062 if format_dict['precision'] is not None:
6063 format_dict['precision'] = int(format_dict['precision'])
6064
6065 # if format type is 'g' or 'G' then a precision of 0 makes little
6066 # sense; convert it to 1. Same if format type is unspecified.
6067 if format_dict['precision'] == 0:
Mark Dickinson7718d2b2009-09-07 16:21:56 +00006068 if format_dict['type'] is None or format_dict['type'] in 'gG':
Christian Heimesf16baeb2008-02-29 14:57:44 +00006069 format_dict['precision'] = 1
6070
Mark Dickinson79f52032009-03-17 23:12:51 +00006071 # determine thousands separator, grouping, and decimal separator, and
6072 # add appropriate entries to format_dict
6073 if format_dict['type'] == 'n':
6074 # apart from separators, 'n' behaves just like 'g'
6075 format_dict['type'] = 'g'
6076 if _localeconv is None:
6077 _localeconv = _locale.localeconv()
6078 if format_dict['thousands_sep'] is not None:
6079 raise ValueError("Explicit thousands separator conflicts with "
6080 "'n' type in format specifier: " + format_spec)
6081 format_dict['thousands_sep'] = _localeconv['thousands_sep']
6082 format_dict['grouping'] = _localeconv['grouping']
6083 format_dict['decimal_point'] = _localeconv['decimal_point']
6084 else:
6085 if format_dict['thousands_sep'] is None:
6086 format_dict['thousands_sep'] = ''
6087 format_dict['grouping'] = [3, 0]
6088 format_dict['decimal_point'] = '.'
Christian Heimesf16baeb2008-02-29 14:57:44 +00006089
6090 return format_dict
6091
Mark Dickinson79f52032009-03-17 23:12:51 +00006092def _format_align(sign, body, spec):
6093 """Given an unpadded, non-aligned numeric string 'body' and sign
Ezio Melotti42da6632011-03-15 05:18:48 +02006094 string 'sign', add padding and alignment conforming to the given
Mark Dickinson79f52032009-03-17 23:12:51 +00006095 format specifier dictionary 'spec' (as produced by
6096 parse_format_specifier).
Christian Heimesf16baeb2008-02-29 14:57:44 +00006097
6098 """
Christian Heimesf16baeb2008-02-29 14:57:44 +00006099 # how much extra space do we have to play with?
Mark Dickinson79f52032009-03-17 23:12:51 +00006100 minimumwidth = spec['minimumwidth']
6101 fill = spec['fill']
6102 padding = fill*(minimumwidth - len(sign) - len(body))
Christian Heimesf16baeb2008-02-29 14:57:44 +00006103
Mark Dickinson79f52032009-03-17 23:12:51 +00006104 align = spec['align']
Christian Heimesf16baeb2008-02-29 14:57:44 +00006105 if align == '<':
Christian Heimesf16baeb2008-02-29 14:57:44 +00006106 result = sign + body + padding
Mark Dickinsonad416342009-03-17 18:10:15 +00006107 elif align == '>':
6108 result = padding + sign + body
Christian Heimesf16baeb2008-02-29 14:57:44 +00006109 elif align == '=':
6110 result = sign + padding + body
Mark Dickinson79f52032009-03-17 23:12:51 +00006111 elif align == '^':
Christian Heimesf16baeb2008-02-29 14:57:44 +00006112 half = len(padding)//2
6113 result = padding[:half] + sign + body + padding[half:]
Mark Dickinson79f52032009-03-17 23:12:51 +00006114 else:
6115 raise ValueError('Unrecognised alignment field')
Christian Heimesf16baeb2008-02-29 14:57:44 +00006116
Christian Heimesf16baeb2008-02-29 14:57:44 +00006117 return result
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00006118
Mark Dickinson79f52032009-03-17 23:12:51 +00006119def _group_lengths(grouping):
6120 """Convert a localeconv-style grouping into a (possibly infinite)
6121 iterable of integers representing group lengths.
6122
6123 """
6124 # The result from localeconv()['grouping'], and the input to this
6125 # function, should be a list of integers in one of the
6126 # following three forms:
6127 #
6128 # (1) an empty list, or
6129 # (2) nonempty list of positive integers + [0]
6130 # (3) list of positive integers + [locale.CHAR_MAX], or
6131
6132 from itertools import chain, repeat
6133 if not grouping:
6134 return []
6135 elif grouping[-1] == 0 and len(grouping) >= 2:
6136 return chain(grouping[:-1], repeat(grouping[-2]))
6137 elif grouping[-1] == _locale.CHAR_MAX:
6138 return grouping[:-1]
6139 else:
6140 raise ValueError('unrecognised format for grouping')
6141
6142def _insert_thousands_sep(digits, spec, min_width=1):
6143 """Insert thousands separators into a digit string.
6144
6145 spec is a dictionary whose keys should include 'thousands_sep' and
6146 'grouping'; typically it's the result of parsing the format
6147 specifier using _parse_format_specifier.
6148
6149 The min_width keyword argument gives the minimum length of the
6150 result, which will be padded on the left with zeros if necessary.
6151
6152 If necessary, the zero padding adds an extra '0' on the left to
6153 avoid a leading thousands separator. For example, inserting
6154 commas every three digits in '123456', with min_width=8, gives
6155 '0,123,456', even though that has length 9.
6156
6157 """
6158
6159 sep = spec['thousands_sep']
6160 grouping = spec['grouping']
6161
6162 groups = []
6163 for l in _group_lengths(grouping):
Mark Dickinson79f52032009-03-17 23:12:51 +00006164 if l <= 0:
6165 raise ValueError("group length should be positive")
6166 # max(..., 1) forces at least 1 digit to the left of a separator
6167 l = min(max(len(digits), min_width, 1), l)
6168 groups.append('0'*(l - len(digits)) + digits[-l:])
6169 digits = digits[:-l]
6170 min_width -= l
6171 if not digits and min_width <= 0:
6172 break
Mark Dickinson7303b592009-03-18 08:25:36 +00006173 min_width -= len(sep)
Mark Dickinson79f52032009-03-17 23:12:51 +00006174 else:
6175 l = max(len(digits), min_width, 1)
6176 groups.append('0'*(l - len(digits)) + digits[-l:])
6177 return sep.join(reversed(groups))
6178
6179def _format_sign(is_negative, spec):
6180 """Determine sign character."""
6181
6182 if is_negative:
6183 return '-'
6184 elif spec['sign'] in ' +':
6185 return spec['sign']
6186 else:
6187 return ''
6188
6189def _format_number(is_negative, intpart, fracpart, exp, spec):
6190 """Format a number, given the following data:
6191
6192 is_negative: true if the number is negative, else false
6193 intpart: string of digits that must appear before the decimal point
6194 fracpart: string of digits that must come after the point
6195 exp: exponent, as an integer
6196 spec: dictionary resulting from parsing the format specifier
6197
6198 This function uses the information in spec to:
6199 insert separators (decimal separator and thousands separators)
6200 format the sign
6201 format the exponent
6202 add trailing '%' for the '%' type
6203 zero-pad if necessary
6204 fill and align if necessary
6205 """
6206
6207 sign = _format_sign(is_negative, spec)
6208
Eric Smith984bb582010-11-25 16:08:06 +00006209 if fracpart or spec['alt']:
Mark Dickinson79f52032009-03-17 23:12:51 +00006210 fracpart = spec['decimal_point'] + fracpart
6211
6212 if exp != 0 or spec['type'] in 'eE':
6213 echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
6214 fracpart += "{0}{1:+}".format(echar, exp)
6215 if spec['type'] == '%':
6216 fracpart += '%'
6217
6218 if spec['zeropad']:
6219 min_width = spec['minimumwidth'] - len(fracpart) - len(sign)
6220 else:
6221 min_width = 0
6222 intpart = _insert_thousands_sep(intpart, spec, min_width)
6223
6224 return _format_align(sign, intpart+fracpart, spec)
6225
6226
Guido van Rossumd8faa362007-04-27 19:54:29 +00006227##### Useful Constants (internal use only) ################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006228
Guido van Rossumd8faa362007-04-27 19:54:29 +00006229# Reusable defaults
Mark Dickinson627cf6a2009-01-03 12:11:47 +00006230_Infinity = Decimal('Inf')
6231_NegativeInfinity = Decimal('-Inf')
Mark Dickinsonf9236412009-01-02 23:23:21 +00006232_NaN = Decimal('NaN')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00006233_Zero = Decimal(0)
6234_One = Decimal(1)
6235_NegativeOne = Decimal(-1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006236
Mark Dickinson627cf6a2009-01-03 12:11:47 +00006237# _SignedInfinity[sign] is infinity w/ that sign
6238_SignedInfinity = (_Infinity, _NegativeInfinity)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006239
Mark Dickinsondc787d22010-05-23 13:33:13 +00006240# Constants related to the hash implementation; hash(x) is based
6241# on the reduction of x modulo _PyHASH_MODULUS
6242import sys
6243_PyHASH_MODULUS = sys.hash_info.modulus
6244# hash values to use for positive and negative infinities, and nans
6245_PyHASH_INF = sys.hash_info.inf
6246_PyHASH_NAN = sys.hash_info.nan
6247del sys
6248
6249# _PyHASH_10INV is the inverse of 10 modulo the prime _PyHASH_MODULUS
6250_PyHASH_10INV = pow(10, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006251
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006252
6253if __name__ == '__main__':
Raymond Hettinger6d7e26e2011-02-01 23:54:43 +00006254 import doctest, decimal
6255 doctest.testmod(decimal)