blob: e6b70cad16f7217197c054561a37fe052c33b4eb [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."""
1558 return float(str(self))
1559
1560 def __int__(self):
Brett Cannon46b08022005-03-01 03:12:26 +00001561 """Converts self to an int, truncating if necessary."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001562 if self._is_special:
1563 if self._isnan():
Mark Dickinson825fce32009-09-07 18:08:12 +00001564 raise ValueError("Cannot convert NaN to integer")
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001565 elif self._isinfinity():
Mark Dickinson825fce32009-09-07 18:08:12 +00001566 raise OverflowError("Cannot convert infinity to integer")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001567 s = (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001568 if self._exp >= 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001569 return s*int(self._int)*10**self._exp
Raymond Hettinger605ed022004-11-24 07:28:48 +00001570 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001571 return s*int(self._int[:self._exp] or '0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001572
Christian Heimes969fe572008-01-25 11:23:10 +00001573 __trunc__ = __int__
1574
Christian Heimes0bd4e112008-02-12 22:59:25 +00001575 def real(self):
1576 return self
Mark Dickinson315a20a2009-01-04 21:34:18 +00001577 real = property(real)
Christian Heimes0bd4e112008-02-12 22:59:25 +00001578
Christian Heimes0bd4e112008-02-12 22:59:25 +00001579 def imag(self):
1580 return Decimal(0)
Mark Dickinson315a20a2009-01-04 21:34:18 +00001581 imag = property(imag)
Christian Heimes0bd4e112008-02-12 22:59:25 +00001582
1583 def conjugate(self):
1584 return self
1585
1586 def __complex__(self):
1587 return complex(float(self))
1588
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001589 def _fix_nan(self, context):
1590 """Decapitate the payload of a NaN to fit the context"""
1591 payload = self._int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001592
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001593 # maximum length of payload is precision if clamp=0,
1594 # precision-1 if clamp=1.
1595 max_payload_len = context.prec - context.clamp
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001596 if len(payload) > max_payload_len:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001597 payload = payload[len(payload)-max_payload_len:].lstrip('0')
1598 return _dec_from_triple(self._sign, payload, self._exp, True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001599 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001600
Raymond Hettingerdab988d2004-10-09 07:10:44 +00001601 def _fix(self, context):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001602 """Round if it is necessary to keep self within prec precision.
1603
1604 Rounds and fixes the exponent. Does not raise on a sNaN.
1605
1606 Arguments:
1607 self - Decimal instance
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001608 context - context used.
1609 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001610
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001611 if self._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001612 if self._isnan():
1613 # decapitate payload if necessary
1614 return self._fix_nan(context)
1615 else:
1616 # self is +/-Infinity; return unaltered
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001617 return Decimal(self)
1618
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001619 # if self is zero then exponent should be between Etiny and
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001620 # Emax if clamp==0, and between Etiny and Etop if clamp==1.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001621 Etiny = context.Etiny()
1622 Etop = context.Etop()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001623 if not self:
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001624 exp_max = [context.Emax, Etop][context.clamp]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001625 new_exp = min(max(self._exp, Etiny), exp_max)
1626 if new_exp != self._exp:
1627 context._raise_error(Clamped)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001628 return _dec_from_triple(self._sign, '0', new_exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001629 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001630 return Decimal(self)
1631
1632 # exp_min is the smallest allowable exponent of the result,
1633 # equal to max(self.adjusted()-context.prec+1, Etiny)
1634 exp_min = len(self._int) + self._exp - context.prec
1635 if exp_min > Etop:
1636 # overflow: exp_min > Etop iff self.adjusted() > Emax
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001637 ans = context._raise_error(Overflow, 'above Emax', self._sign)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001638 context._raise_error(Inexact)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001639 context._raise_error(Rounded)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001640 return ans
1641
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001642 self_is_subnormal = exp_min < Etiny
1643 if self_is_subnormal:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001644 exp_min = Etiny
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001645
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001646 # round if self has too many digits
1647 if self._exp < exp_min:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001648 digits = len(self._int) + self._exp - exp_min
1649 if digits < 0:
1650 self = _dec_from_triple(self._sign, '1', exp_min-1)
1651 digits = 0
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001652 rounding_method = self._pick_rounding_function[context.rounding]
1653 changed = getattr(self, rounding_method)(digits)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001654 coeff = self._int[:digits] or '0'
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001655 if changed > 0:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001656 coeff = str(int(coeff)+1)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001657 if len(coeff) > context.prec:
1658 coeff = coeff[:-1]
1659 exp_min += 1
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001660
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001661 # check whether the rounding pushed the exponent out of range
1662 if exp_min > Etop:
1663 ans = context._raise_error(Overflow, 'above Emax', self._sign)
1664 else:
1665 ans = _dec_from_triple(self._sign, coeff, exp_min)
1666
1667 # raise the appropriate signals, taking care to respect
1668 # the precedence described in the specification
1669 if changed and self_is_subnormal:
1670 context._raise_error(Underflow)
1671 if self_is_subnormal:
1672 context._raise_error(Subnormal)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001673 if changed:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001674 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001675 context._raise_error(Rounded)
1676 if not ans:
1677 # raise Clamped on underflow to 0
1678 context._raise_error(Clamped)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001679 return ans
1680
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001681 if self_is_subnormal:
1682 context._raise_error(Subnormal)
1683
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001684 # fold down if clamp == 1 and self has too few digits
1685 if context.clamp == 1 and self._exp > Etop:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001686 context._raise_error(Clamped)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001687 self_padded = self._int + '0'*(self._exp - Etop)
1688 return _dec_from_triple(self._sign, self_padded, Etop)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001689
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001690 # here self was representable to begin with; return unchanged
1691 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001692
1693 _pick_rounding_function = {}
1694
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001695 # for each of the rounding functions below:
1696 # self is a finite, nonzero Decimal
1697 # prec is an integer satisfying 0 <= prec < len(self._int)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001698 #
1699 # each function returns either -1, 0, or 1, as follows:
1700 # 1 indicates that self should be rounded up (away from zero)
1701 # 0 indicates that self should be truncated, and that all the
1702 # digits to be truncated are zeros (so the value is unchanged)
1703 # -1 indicates that there are nonzero digits to be truncated
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001704
1705 def _round_down(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001706 """Also known as round-towards-0, truncate."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001707 if _all_zeros(self._int, prec):
1708 return 0
1709 else:
1710 return -1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001711
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001712 def _round_up(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001713 """Rounds away from 0."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001714 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001715
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001716 def _round_half_up(self, prec):
1717 """Rounds 5 up (away from 0)"""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001718 if self._int[prec] in '56789':
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001719 return 1
1720 elif _all_zeros(self._int, prec):
1721 return 0
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001722 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001723 return -1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001724
1725 def _round_half_down(self, prec):
1726 """Round 5 down"""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001727 if _exact_half(self._int, prec):
1728 return -1
1729 else:
1730 return self._round_half_up(prec)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001731
1732 def _round_half_even(self, prec):
1733 """Round 5 to even, rest to nearest."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001734 if _exact_half(self._int, prec) and \
1735 (prec == 0 or self._int[prec-1] in '02468'):
1736 return -1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001737 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001738 return self._round_half_up(prec)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001739
1740 def _round_ceiling(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001741 """Rounds up (not away from 0 if negative.)"""
1742 if self._sign:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001743 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001744 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001745 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001746
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001747 def _round_floor(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001748 """Rounds down (not towards 0 if negative)"""
1749 if not self._sign:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001750 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001751 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001752 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001753
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001754 def _round_05up(self, prec):
1755 """Round down unless digit prec-1 is 0 or 5."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001756 if prec and self._int[prec-1] not in '05':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001757 return self._round_down(prec)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001758 else:
1759 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001760
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001761 def __round__(self, n=None):
1762 """Round self to the nearest integer, or to a given precision.
1763
1764 If only one argument is supplied, round a finite Decimal
1765 instance self to the nearest integer. If self is infinite or
1766 a NaN then a Python exception is raised. If self is finite
1767 and lies exactly halfway between two integers then it is
1768 rounded to the integer with even last digit.
1769
1770 >>> round(Decimal('123.456'))
1771 123
1772 >>> round(Decimal('-456.789'))
1773 -457
1774 >>> round(Decimal('-3.0'))
1775 -3
1776 >>> round(Decimal('2.5'))
1777 2
1778 >>> round(Decimal('3.5'))
1779 4
1780 >>> round(Decimal('Inf'))
1781 Traceback (most recent call last):
1782 ...
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001783 OverflowError: cannot round an infinity
1784 >>> round(Decimal('NaN'))
1785 Traceback (most recent call last):
1786 ...
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001787 ValueError: cannot round a NaN
1788
1789 If a second argument n is supplied, self is rounded to n
1790 decimal places using the rounding mode for the current
1791 context.
1792
1793 For an integer n, round(self, -n) is exactly equivalent to
1794 self.quantize(Decimal('1En')).
1795
1796 >>> round(Decimal('123.456'), 0)
1797 Decimal('123')
1798 >>> round(Decimal('123.456'), 2)
1799 Decimal('123.46')
1800 >>> round(Decimal('123.456'), -2)
1801 Decimal('1E+2')
1802 >>> round(Decimal('-Infinity'), 37)
1803 Decimal('NaN')
1804 >>> round(Decimal('sNaN123'), 0)
1805 Decimal('NaN123')
1806
1807 """
1808 if n is not None:
1809 # two-argument form: use the equivalent quantize call
1810 if not isinstance(n, int):
1811 raise TypeError('Second argument to round should be integral')
1812 exp = _dec_from_triple(0, '1', -n)
1813 return self.quantize(exp)
1814
1815 # one-argument form
1816 if self._is_special:
1817 if self.is_nan():
1818 raise ValueError("cannot round a NaN")
1819 else:
1820 raise OverflowError("cannot round an infinity")
1821 return int(self._rescale(0, ROUND_HALF_EVEN))
1822
1823 def __floor__(self):
1824 """Return the floor of self, as an integer.
1825
1826 For a finite Decimal instance self, return the greatest
1827 integer n such that n <= self. If self is infinite or a NaN
1828 then a Python exception is raised.
1829
1830 """
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_FLOOR))
1837
1838 def __ceil__(self):
1839 """Return the ceiling of self, as an integer.
1840
1841 For a finite Decimal instance self, return the least integer n
1842 such that n >= self. If self is infinite or a NaN then a
1843 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_CEILING))
1852
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001853 def fma(self, other, third, context=None):
1854 """Fused multiply-add.
1855
1856 Returns self*other+third with no rounding of the intermediate
1857 product self*other.
1858
1859 self and other are multiplied together, with no rounding of
1860 the result. The third operand is then added to the result,
1861 and a single final rounding is performed.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001862 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001863
1864 other = _convert_other(other, raiseit=True)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001865
1866 # compute product; raise InvalidOperation if either operand is
1867 # a signaling NaN or if the product is zero times infinity.
1868 if self._is_special or other._is_special:
1869 if context is None:
1870 context = getcontext()
1871 if self._exp == 'N':
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001872 return context._raise_error(InvalidOperation, 'sNaN', self)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001873 if other._exp == 'N':
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001874 return context._raise_error(InvalidOperation, 'sNaN', other)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001875 if self._exp == 'n':
1876 product = self
1877 elif other._exp == 'n':
1878 product = other
1879 elif self._exp == 'F':
1880 if not other:
1881 return context._raise_error(InvalidOperation,
1882 'INF * 0 in fma')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001883 product = _SignedInfinity[self._sign ^ other._sign]
Christian Heimes8b0facf2007-12-04 19:30:01 +00001884 elif other._exp == 'F':
1885 if not self:
1886 return context._raise_error(InvalidOperation,
1887 '0 * INF in fma')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001888 product = _SignedInfinity[self._sign ^ other._sign]
Christian Heimes8b0facf2007-12-04 19:30:01 +00001889 else:
1890 product = _dec_from_triple(self._sign ^ other._sign,
1891 str(int(self._int) * int(other._int)),
1892 self._exp + other._exp)
1893
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001894 third = _convert_other(third, raiseit=True)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001895 return product.__add__(third, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001896
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001897 def _power_modulo(self, other, modulo, context=None):
1898 """Three argument version of __pow__"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001899
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001900 # if can't convert other and modulo to Decimal, raise
1901 # TypeError; there's no point returning NotImplemented (no
1902 # equivalent of __rpow__ for three argument pow)
1903 other = _convert_other(other, raiseit=True)
1904 modulo = _convert_other(modulo, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001905
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001906 if context is None:
1907 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001908
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001909 # deal with NaNs: if there are any sNaNs then first one wins,
1910 # (i.e. behaviour for NaNs is identical to that of fma)
1911 self_is_nan = self._isnan()
1912 other_is_nan = other._isnan()
1913 modulo_is_nan = modulo._isnan()
1914 if self_is_nan or other_is_nan or modulo_is_nan:
1915 if self_is_nan == 2:
1916 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001917 self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001918 if other_is_nan == 2:
1919 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001920 other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001921 if modulo_is_nan == 2:
1922 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001923 modulo)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001924 if self_is_nan:
1925 return self._fix_nan(context)
1926 if other_is_nan:
1927 return other._fix_nan(context)
1928 return modulo._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001929
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001930 # check inputs: we apply same restrictions as Python's pow()
1931 if not (self._isinteger() and
1932 other._isinteger() and
1933 modulo._isinteger()):
1934 return context._raise_error(InvalidOperation,
1935 'pow() 3rd argument not allowed '
1936 'unless all arguments are integers')
1937 if other < 0:
1938 return context._raise_error(InvalidOperation,
1939 'pow() 2nd argument cannot be '
1940 'negative when 3rd argument specified')
1941 if not modulo:
1942 return context._raise_error(InvalidOperation,
1943 'pow() 3rd argument cannot be 0')
1944
1945 # additional restriction for decimal: the modulus must be less
1946 # than 10**prec in absolute value
1947 if modulo.adjusted() >= context.prec:
1948 return context._raise_error(InvalidOperation,
1949 'insufficient precision: pow() 3rd '
1950 'argument must not have more than '
1951 'precision digits')
1952
1953 # define 0**0 == NaN, for consistency with two-argument pow
1954 # (even though it hurts!)
1955 if not other and not self:
1956 return context._raise_error(InvalidOperation,
1957 'at least one of pow() 1st argument '
1958 'and 2nd argument must be nonzero ;'
1959 '0**0 is not defined')
1960
1961 # compute sign of result
1962 if other._iseven():
1963 sign = 0
1964 else:
1965 sign = self._sign
1966
1967 # convert modulo to a Python integer, and self and other to
1968 # Decimal integers (i.e. force their exponents to be >= 0)
1969 modulo = abs(int(modulo))
1970 base = _WorkRep(self.to_integral_value())
1971 exponent = _WorkRep(other.to_integral_value())
1972
1973 # compute result using integer pow()
1974 base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
1975 for i in range(exponent.exp):
1976 base = pow(base, 10, modulo)
1977 base = pow(base, exponent.int, modulo)
1978
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001979 return _dec_from_triple(sign, str(base), 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001980
1981 def _power_exact(self, other, p):
1982 """Attempt to compute self**other exactly.
1983
1984 Given Decimals self and other and an integer p, attempt to
1985 compute an exact result for the power self**other, with p
1986 digits of precision. Return None if self**other is not
1987 exactly representable in p digits.
1988
1989 Assumes that elimination of special cases has already been
1990 performed: self and other must both be nonspecial; self must
1991 be positive and not numerically equal to 1; other must be
1992 nonzero. For efficiency, other._exp should not be too large,
1993 so that 10**abs(other._exp) is a feasible calculation."""
1994
1995 # In the comments below, we write x for the value of self and
1996 # y for the value of other. Write x = xc*10**xe and y =
1997 # yc*10**ye.
1998
1999 # The main purpose of this method is to identify the *failure*
2000 # of x**y to be exactly representable with as little effort as
2001 # possible. So we look for cheap and easy tests that
2002 # eliminate the possibility of x**y being exact. Only if all
2003 # these tests are passed do we go on to actually compute x**y.
2004
2005 # Here's the main idea. First normalize both x and y. We
2006 # express y as a rational m/n, with m and n relatively prime
2007 # and n>0. Then for x**y to be exactly representable (at
2008 # *any* precision), xc must be the nth power of a positive
2009 # integer and xe must be divisible by n. If m is negative
2010 # then additionally xc must be a power of either 2 or 5, hence
2011 # a power of 2**n or 5**n.
2012 #
2013 # There's a limit to how small |y| can be: if y=m/n as above
2014 # then:
2015 #
2016 # (1) if xc != 1 then for the result to be representable we
2017 # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So
2018 # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
2019 # 2**(1/|y|), hence xc**|y| < 2 and the result is not
2020 # representable.
2021 #
2022 # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if
2023 # |y| < 1/|xe| then the result is not representable.
2024 #
2025 # Note that since x is not equal to 1, at least one of (1) and
2026 # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
2027 # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
2028 #
2029 # There's also a limit to how large y can be, at least if it's
2030 # positive: the normalized result will have coefficient xc**y,
2031 # so if it's representable then xc**y < 10**p, and y <
2032 # p/log10(xc). Hence if y*log10(xc) >= p then the result is
2033 # not exactly representable.
2034
2035 # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
2036 # so |y| < 1/xe and the result is not representable.
2037 # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
2038 # < 1/nbits(xc).
2039
2040 x = _WorkRep(self)
2041 xc, xe = x.int, x.exp
2042 while xc % 10 == 0:
2043 xc //= 10
2044 xe += 1
2045
2046 y = _WorkRep(other)
2047 yc, ye = y.int, y.exp
2048 while yc % 10 == 0:
2049 yc //= 10
2050 ye += 1
2051
2052 # case where xc == 1: result is 10**(xe*y), with xe*y
2053 # required to be an integer
2054 if xc == 1:
Mark Dickinsona1236312010-07-08 19:03:34 +00002055 xe *= yc
2056 # result is now 10**(xe * 10**ye); xe * 10**ye must be integral
2057 while xe % 10 == 0:
2058 xe //= 10
2059 ye += 1
2060 if ye < 0:
2061 return None
2062 exponent = xe * 10**ye
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002063 if y.sign == 1:
2064 exponent = -exponent
2065 # if other is a nonnegative integer, use ideal exponent
2066 if other._isinteger() and other._sign == 0:
2067 ideal_exponent = self._exp*int(other)
2068 zeros = min(exponent-ideal_exponent, p-1)
2069 else:
2070 zeros = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002071 return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002072
2073 # case where y is negative: xc must be either a power
2074 # of 2 or a power of 5.
2075 if y.sign == 1:
2076 last_digit = xc % 10
2077 if last_digit in (2,4,6,8):
2078 # quick test for power of 2
2079 if xc & -xc != xc:
2080 return None
2081 # now xc is a power of 2; e is its exponent
2082 e = _nbits(xc)-1
2083 # find e*y and xe*y; both must be integers
2084 if ye >= 0:
2085 y_as_int = yc*10**ye
2086 e = e*y_as_int
2087 xe = xe*y_as_int
2088 else:
2089 ten_pow = 10**-ye
2090 e, remainder = divmod(e*yc, ten_pow)
2091 if remainder:
2092 return None
2093 xe, remainder = divmod(xe*yc, ten_pow)
2094 if remainder:
2095 return None
2096
2097 if e*65 >= p*93: # 93/65 > log(10)/log(5)
2098 return None
2099 xc = 5**e
2100
2101 elif last_digit == 5:
2102 # e >= log_5(xc) if xc is a power of 5; we have
2103 # equality all the way up to xc=5**2658
2104 e = _nbits(xc)*28//65
2105 xc, remainder = divmod(5**e, xc)
2106 if remainder:
2107 return None
2108 while xc % 5 == 0:
2109 xc //= 5
2110 e -= 1
2111 if ye >= 0:
2112 y_as_integer = yc*10**ye
2113 e = e*y_as_integer
2114 xe = xe*y_as_integer
2115 else:
2116 ten_pow = 10**-ye
2117 e, remainder = divmod(e*yc, ten_pow)
2118 if remainder:
2119 return None
2120 xe, remainder = divmod(xe*yc, ten_pow)
2121 if remainder:
2122 return None
2123 if e*3 >= p*10: # 10/3 > log(10)/log(2)
2124 return None
2125 xc = 2**e
2126 else:
2127 return None
2128
2129 if xc >= 10**p:
2130 return None
2131 xe = -e-xe
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002132 return _dec_from_triple(0, str(xc), xe)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002133
2134 # now y is positive; find m and n such that y = m/n
2135 if ye >= 0:
2136 m, n = yc*10**ye, 1
2137 else:
2138 if xe != 0 and len(str(abs(yc*xe))) <= -ye:
2139 return None
2140 xc_bits = _nbits(xc)
2141 if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
2142 return None
2143 m, n = yc, 10**(-ye)
2144 while m % 2 == n % 2 == 0:
2145 m //= 2
2146 n //= 2
2147 while m % 5 == n % 5 == 0:
2148 m //= 5
2149 n //= 5
2150
2151 # compute nth root of xc*10**xe
2152 if n > 1:
2153 # if 1 < xc < 2**n then xc isn't an nth power
2154 if xc != 1 and xc_bits <= n:
2155 return None
2156
2157 xe, rem = divmod(xe, n)
2158 if rem != 0:
2159 return None
2160
2161 # compute nth root of xc using Newton's method
2162 a = 1 << -(-_nbits(xc)//n) # initial estimate
2163 while True:
2164 q, r = divmod(xc, a**(n-1))
2165 if a <= q:
2166 break
2167 else:
2168 a = (a*(n-1) + q)//n
2169 if not (a == q and r == 0):
2170 return None
2171 xc = a
2172
2173 # now xc*10**xe is the nth root of the original xc*10**xe
2174 # compute mth power of xc*10**xe
2175
2176 # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
2177 # 10**p and the result is not representable.
2178 if xc > 1 and m > p*100//_log10_lb(xc):
2179 return None
2180 xc = xc**m
2181 xe *= m
2182 if xc > 10**p:
2183 return None
2184
2185 # by this point the result *is* exactly representable
2186 # adjust the exponent to get as close as possible to the ideal
2187 # exponent, if necessary
2188 str_xc = str(xc)
2189 if other._isinteger() and other._sign == 0:
2190 ideal_exponent = self._exp*int(other)
2191 zeros = min(xe-ideal_exponent, p-len(str_xc))
2192 else:
2193 zeros = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002194 return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002195
2196 def __pow__(self, other, modulo=None, context=None):
2197 """Return self ** other [ % modulo].
2198
2199 With two arguments, compute self**other.
2200
2201 With three arguments, compute (self**other) % modulo. For the
2202 three argument form, the following restrictions on the
2203 arguments hold:
2204
2205 - all three arguments must be integral
2206 - other must be nonnegative
2207 - either self or other (or both) must be nonzero
2208 - modulo must be nonzero and must have at most p digits,
2209 where p is the context precision.
2210
2211 If any of these restrictions is violated the InvalidOperation
2212 flag is raised.
2213
2214 The result of pow(self, other, modulo) is identical to the
2215 result that would be obtained by computing (self**other) %
2216 modulo with unbounded precision, but is computed more
2217 efficiently. It is always exact.
2218 """
2219
2220 if modulo is not None:
2221 return self._power_modulo(other, modulo, context)
2222
2223 other = _convert_other(other)
2224 if other is NotImplemented:
2225 return other
2226
2227 if context is None:
2228 context = getcontext()
2229
2230 # either argument is a NaN => result is NaN
2231 ans = self._check_nans(other, context)
2232 if ans:
2233 return ans
2234
2235 # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
2236 if not other:
2237 if not self:
2238 return context._raise_error(InvalidOperation, '0 ** 0')
2239 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002240 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002241
2242 # result has sign 1 iff self._sign is 1 and other is an odd integer
2243 result_sign = 0
2244 if self._sign == 1:
2245 if other._isinteger():
2246 if not other._iseven():
2247 result_sign = 1
2248 else:
2249 # -ve**noninteger = NaN
2250 # (-0)**noninteger = 0**noninteger
2251 if self:
2252 return context._raise_error(InvalidOperation,
2253 'x ** y with x negative and y not an integer')
2254 # negate self, without doing any unwanted rounding
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002255 self = self.copy_negate()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002256
2257 # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
2258 if not self:
2259 if other._sign == 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002260 return _dec_from_triple(result_sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002261 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002262 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002263
2264 # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002265 if self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002266 if other._sign == 0:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002267 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002268 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002269 return _dec_from_triple(result_sign, '0', 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002270
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002271 # 1**other = 1, but the choice of exponent and the flags
2272 # depend on the exponent of self, and on whether other is a
2273 # positive integer, a negative integer, or neither
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002274 if self == _One:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002275 if other._isinteger():
2276 # exp = max(self._exp*max(int(other), 0),
2277 # 1-context.prec) but evaluating int(other) directly
2278 # is dangerous until we know other is small (other
2279 # could be 1e999999999)
2280 if other._sign == 1:
2281 multiplier = 0
2282 elif other > context.prec:
2283 multiplier = context.prec
2284 else:
2285 multiplier = int(other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002286
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002287 exp = self._exp * multiplier
2288 if exp < 1-context.prec:
2289 exp = 1-context.prec
2290 context._raise_error(Rounded)
2291 else:
2292 context._raise_error(Inexact)
2293 context._raise_error(Rounded)
2294 exp = 1-context.prec
2295
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002296 return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002297
2298 # compute adjusted exponent of self
2299 self_adj = self.adjusted()
2300
2301 # self ** infinity is infinity if self > 1, 0 if self < 1
2302 # self ** -infinity is infinity if self < 1, 0 if self > 1
2303 if other._isinfinity():
2304 if (other._sign == 0) == (self_adj < 0):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002305 return _dec_from_triple(result_sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002306 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002307 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002308
2309 # from here on, the result always goes through the call
2310 # to _fix at the end of this function.
2311 ans = None
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002312 exact = False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002313
2314 # crude test to catch cases of extreme overflow/underflow. If
2315 # log10(self)*other >= 10**bound and bound >= len(str(Emax))
2316 # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
2317 # self**other >= 10**(Emax+1), so overflow occurs. The test
2318 # for underflow is similar.
2319 bound = self._log10_exp_bound() + other.adjusted()
2320 if (self_adj >= 0) == (other._sign == 0):
2321 # self > 1 and other +ve, or self < 1 and other -ve
2322 # possibility of overflow
2323 if bound >= len(str(context.Emax)):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002324 ans = _dec_from_triple(result_sign, '1', context.Emax+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002325 else:
2326 # self > 1 and other -ve, or self < 1 and other +ve
2327 # possibility of underflow to 0
2328 Etiny = context.Etiny()
2329 if bound >= len(str(-Etiny)):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002330 ans = _dec_from_triple(result_sign, '1', Etiny-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002331
2332 # try for an exact result with precision +1
2333 if ans is None:
2334 ans = self._power_exact(other, context.prec + 1)
Mark Dickinsone42f1bb2010-07-08 19:09:16 +00002335 if ans is not None:
2336 if result_sign == 1:
2337 ans = _dec_from_triple(1, ans._int, ans._exp)
2338 exact = True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002339
2340 # usual case: inexact result, x**y computed directly as exp(y*log(x))
2341 if ans is None:
2342 p = context.prec
2343 x = _WorkRep(self)
2344 xc, xe = x.int, x.exp
2345 y = _WorkRep(other)
2346 yc, ye = y.int, y.exp
2347 if y.sign == 1:
2348 yc = -yc
2349
2350 # compute correctly rounded result: start with precision +3,
2351 # then increase precision until result is unambiguously roundable
2352 extra = 3
2353 while True:
2354 coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
2355 if coeff % (5*10**(len(str(coeff))-p-1)):
2356 break
2357 extra += 3
2358
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002359 ans = _dec_from_triple(result_sign, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002360
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002361 # unlike exp, ln and log10, the power function respects the
2362 # rounding mode; no need to switch to ROUND_HALF_EVEN here
2363
2364 # There's a difficulty here when 'other' is not an integer and
2365 # the result is exact. In this case, the specification
2366 # requires that the Inexact flag be raised (in spite of
2367 # exactness), but since the result is exact _fix won't do this
2368 # for us. (Correspondingly, the Underflow signal should also
2369 # be raised for subnormal results.) We can't directly raise
2370 # these signals either before or after calling _fix, since
2371 # that would violate the precedence for signals. So we wrap
2372 # the ._fix call in a temporary context, and reraise
2373 # afterwards.
2374 if exact and not other._isinteger():
2375 # pad with zeros up to length context.prec+1 if necessary; this
2376 # ensures that the Rounded signal will be raised.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002377 if len(ans._int) <= context.prec:
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002378 expdiff = context.prec + 1 - len(ans._int)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002379 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
2380 ans._exp-expdiff)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002381
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002382 # create a copy of the current context, with cleared flags/traps
2383 newcontext = context.copy()
2384 newcontext.clear_flags()
2385 for exception in _signals:
2386 newcontext.traps[exception] = 0
2387
2388 # round in the new context
2389 ans = ans._fix(newcontext)
2390
2391 # raise Inexact, and if necessary, Underflow
2392 newcontext._raise_error(Inexact)
2393 if newcontext.flags[Subnormal]:
2394 newcontext._raise_error(Underflow)
2395
2396 # propagate signals to the original context; _fix could
2397 # have raised any of Overflow, Underflow, Subnormal,
2398 # Inexact, Rounded, Clamped. Overflow needs the correct
2399 # arguments. Note that the order of the exceptions is
2400 # important here.
2401 if newcontext.flags[Overflow]:
2402 context._raise_error(Overflow, 'above Emax', ans._sign)
2403 for exception in Underflow, Subnormal, Inexact, Rounded, Clamped:
2404 if newcontext.flags[exception]:
2405 context._raise_error(exception)
2406
2407 else:
2408 ans = ans._fix(context)
2409
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002410 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002411
2412 def __rpow__(self, other, context=None):
2413 """Swaps self/other and returns __pow__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002414 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00002415 if other is NotImplemented:
2416 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002417 return other.__pow__(self, context=context)
2418
2419 def normalize(self, context=None):
2420 """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002421
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002422 if context is None:
2423 context = getcontext()
2424
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002425 if self._is_special:
2426 ans = self._check_nans(context=context)
2427 if ans:
2428 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002429
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002430 dup = self._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002431 if dup._isinfinity():
2432 return dup
2433
2434 if not dup:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002435 return _dec_from_triple(dup._sign, '0', 0)
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00002436 exp_max = [context.Emax, context.Etop()][context.clamp]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002437 end = len(dup._int)
2438 exp = dup._exp
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002439 while dup._int[end-1] == '0' and exp < exp_max:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002440 exp += 1
2441 end -= 1
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002442 return _dec_from_triple(dup._sign, dup._int[:end], exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002443
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002444 def quantize(self, exp, rounding=None, context=None, watchexp=True):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002445 """Quantize self so its exponent is the same as that of exp.
2446
2447 Similar to self._rescale(exp._exp) but with error checking.
2448 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002449 exp = _convert_other(exp, raiseit=True)
2450
2451 if context is None:
2452 context = getcontext()
2453 if rounding is None:
2454 rounding = context.rounding
2455
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002456 if self._is_special or exp._is_special:
2457 ans = self._check_nans(exp, context)
2458 if ans:
2459 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002460
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002461 if exp._isinfinity() or self._isinfinity():
2462 if exp._isinfinity() and self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002463 return Decimal(self) # if both are inf, it is OK
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002464 return context._raise_error(InvalidOperation,
2465 'quantize with one INF')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002466
2467 # if we're not watching exponents, do a simple rescale
2468 if not watchexp:
2469 ans = self._rescale(exp._exp, rounding)
2470 # raise Inexact and Rounded where appropriate
2471 if ans._exp > self._exp:
2472 context._raise_error(Rounded)
2473 if ans != self:
2474 context._raise_error(Inexact)
2475 return ans
2476
2477 # exp._exp should be between Etiny and Emax
2478 if not (context.Etiny() <= exp._exp <= context.Emax):
2479 return context._raise_error(InvalidOperation,
2480 'target exponent out of bounds in quantize')
2481
2482 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002483 ans = _dec_from_triple(self._sign, '0', exp._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002484 return ans._fix(context)
2485
2486 self_adjusted = self.adjusted()
2487 if self_adjusted > context.Emax:
2488 return context._raise_error(InvalidOperation,
2489 'exponent of quantize result too large for current context')
2490 if self_adjusted - exp._exp + 1 > context.prec:
2491 return context._raise_error(InvalidOperation,
2492 'quantize result has too many digits for current context')
2493
2494 ans = self._rescale(exp._exp, rounding)
2495 if ans.adjusted() > context.Emax:
2496 return context._raise_error(InvalidOperation,
2497 'exponent of quantize result too large for current context')
2498 if len(ans._int) > context.prec:
2499 return context._raise_error(InvalidOperation,
2500 'quantize result has too many digits for current context')
2501
2502 # raise appropriate flags
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002503 if ans and ans.adjusted() < context.Emin:
2504 context._raise_error(Subnormal)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002505 if ans._exp > self._exp:
2506 if ans != self:
2507 context._raise_error(Inexact)
2508 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002509
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002510 # call to fix takes care of any necessary folddown, and
2511 # signals Clamped if necessary
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002512 ans = ans._fix(context)
2513 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002514
2515 def same_quantum(self, other):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002516 """Return True if self and other have the same exponent; otherwise
2517 return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002518
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002519 If either operand is a special value, the following rules are used:
2520 * return True if both operands are infinities
2521 * return True if both operands are NaNs
2522 * otherwise, return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002523 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002524 other = _convert_other(other, raiseit=True)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002525 if self._is_special or other._is_special:
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002526 return (self.is_nan() and other.is_nan() or
2527 self.is_infinite() and other.is_infinite())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002528 return self._exp == other._exp
2529
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002530 def _rescale(self, exp, rounding):
2531 """Rescale self so that the exponent is exp, either by padding with zeros
2532 or by truncating digits, using the given rounding mode.
2533
2534 Specials are returned without change. This operation is
2535 quiet: it raises no flags, and uses no information from the
2536 context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002537
2538 exp = exp to scale to (an integer)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002539 rounding = rounding mode
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002540 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002541 if self._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002542 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002543 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002544 return _dec_from_triple(self._sign, '0', exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002545
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002546 if self._exp >= exp:
2547 # pad answer with zeros if necessary
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002548 return _dec_from_triple(self._sign,
2549 self._int + '0'*(self._exp - exp), exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002550
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002551 # too many digits; round and lose data. If self.adjusted() <
2552 # exp-1, replace self by 10**(exp-1) before rounding
2553 digits = len(self._int) + self._exp - exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002554 if digits < 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002555 self = _dec_from_triple(self._sign, '1', exp-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002556 digits = 0
2557 this_function = getattr(self, self._pick_rounding_function[rounding])
Christian Heimescbf3b5c2007-12-03 21:02:03 +00002558 changed = this_function(digits)
2559 coeff = self._int[:digits] or '0'
2560 if changed == 1:
2561 coeff = str(int(coeff)+1)
2562 return _dec_from_triple(self._sign, coeff, exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002563
Christian Heimesf16baeb2008-02-29 14:57:44 +00002564 def _round(self, places, rounding):
2565 """Round a nonzero, nonspecial Decimal to a fixed number of
2566 significant figures, using the given rounding mode.
2567
2568 Infinities, NaNs and zeros are returned unaltered.
2569
2570 This operation is quiet: it raises no flags, and uses no
2571 information from the context.
2572
2573 """
2574 if places <= 0:
2575 raise ValueError("argument should be at least 1 in _round")
2576 if self._is_special or not self:
2577 return Decimal(self)
2578 ans = self._rescale(self.adjusted()+1-places, rounding)
2579 # it can happen that the rescale alters the adjusted exponent;
2580 # for example when rounding 99.97 to 3 significant figures.
2581 # When this happens we end up with an extra 0 at the end of
2582 # the number; a second rescale fixes this.
2583 if ans.adjusted() != self.adjusted():
2584 ans = ans._rescale(ans.adjusted()+1-places, rounding)
2585 return ans
2586
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002587 def to_integral_exact(self, rounding=None, context=None):
2588 """Rounds to a nearby integer.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002589
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002590 If no rounding mode is specified, take the rounding mode from
2591 the context. This method raises the Rounded and Inexact flags
2592 when appropriate.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002593
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002594 See also: to_integral_value, which does exactly the same as
2595 this method except that it doesn't raise Inexact or Rounded.
2596 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002597 if self._is_special:
2598 ans = self._check_nans(context=context)
2599 if ans:
2600 return ans
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002601 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002602 if self._exp >= 0:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002603 return Decimal(self)
2604 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002605 return _dec_from_triple(self._sign, '0', 0)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002606 if context is None:
2607 context = getcontext()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002608 if rounding is None:
2609 rounding = context.rounding
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002610 ans = self._rescale(0, rounding)
2611 if ans != self:
2612 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002613 context._raise_error(Rounded)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002614 return ans
2615
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002616 def to_integral_value(self, rounding=None, context=None):
2617 """Rounds to the nearest integer, without raising inexact, rounded."""
2618 if context is None:
2619 context = getcontext()
2620 if rounding is None:
2621 rounding = context.rounding
2622 if self._is_special:
2623 ans = self._check_nans(context=context)
2624 if ans:
2625 return ans
2626 return Decimal(self)
2627 if self._exp >= 0:
2628 return Decimal(self)
2629 else:
2630 return self._rescale(0, rounding)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002631
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002632 # the method name changed, but we provide also the old one, for compatibility
2633 to_integral = to_integral_value
2634
2635 def sqrt(self, context=None):
2636 """Return the square root of self."""
Christian Heimes0348fb62008-03-26 12:55:56 +00002637 if context is None:
2638 context = getcontext()
2639
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002640 if self._is_special:
2641 ans = self._check_nans(context=context)
2642 if ans:
2643 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002644
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002645 if self._isinfinity() and self._sign == 0:
2646 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002647
2648 if not self:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002649 # exponent = self._exp // 2. sqrt(-0) = -0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002650 ans = _dec_from_triple(self._sign, '0', self._exp // 2)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002651 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002652
2653 if self._sign == 1:
2654 return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
2655
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002656 # At this point self represents a positive number. Let p be
2657 # the desired precision and express self in the form c*100**e
2658 # with c a positive real number and e an integer, c and e
2659 # being chosen so that 100**(p-1) <= c < 100**p. Then the
2660 # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
2661 # <= sqrt(c) < 10**p, so the closest representable Decimal at
2662 # precision p is n*10**e where n = round_half_even(sqrt(c)),
2663 # the closest integer to sqrt(c) with the even integer chosen
2664 # in the case of a tie.
2665 #
2666 # To ensure correct rounding in all cases, we use the
2667 # following trick: we compute the square root to an extra
2668 # place (precision p+1 instead of precision p), rounding down.
2669 # Then, if the result is inexact and its last digit is 0 or 5,
2670 # we increase the last digit to 1 or 6 respectively; if it's
2671 # exact we leave the last digit alone. Now the final round to
2672 # p places (or fewer in the case of underflow) will round
2673 # correctly and raise the appropriate flags.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002674
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002675 # use an extra digit of precision
2676 prec = context.prec+1
2677
2678 # write argument in the form c*100**e where e = self._exp//2
2679 # is the 'ideal' exponent, to be used if the square root is
2680 # exactly representable. l is the number of 'digits' of c in
2681 # base 100, so that 100**(l-1) <= c < 100**l.
2682 op = _WorkRep(self)
2683 e = op.exp >> 1
2684 if op.exp & 1:
2685 c = op.int * 10
2686 l = (len(self._int) >> 1) + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002687 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002688 c = op.int
2689 l = len(self._int)+1 >> 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002690
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002691 # rescale so that c has exactly prec base 100 'digits'
2692 shift = prec-l
2693 if shift >= 0:
2694 c *= 100**shift
2695 exact = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002696 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002697 c, remainder = divmod(c, 100**-shift)
2698 exact = not remainder
2699 e -= shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002700
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002701 # find n = floor(sqrt(c)) using Newton's method
2702 n = 10**prec
2703 while True:
2704 q = c//n
2705 if n <= q:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002706 break
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002707 else:
2708 n = n + q >> 1
2709 exact = exact and n*n == c
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002710
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002711 if exact:
2712 # result is exact; rescale to use ideal exponent e
2713 if shift >= 0:
2714 # assert n % 10**shift == 0
2715 n //= 10**shift
2716 else:
2717 n *= 10**-shift
2718 e += shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002719 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002720 # result is not exact; fix last digit as described above
2721 if n % 5 == 0:
2722 n += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002723
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002724 ans = _dec_from_triple(0, str(n), e)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002725
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002726 # round, and fit to current context
2727 context = context._shallow_copy()
2728 rounding = context._set_rounding(ROUND_HALF_EVEN)
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002729 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002730 context.rounding = rounding
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002731
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002732 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002733
2734 def max(self, other, context=None):
2735 """Returns the larger value.
2736
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002737 Like max(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002738 NaN (and signals if one is sNaN). Also rounds.
2739 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002740 other = _convert_other(other, raiseit=True)
2741
2742 if context is None:
2743 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002744
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002745 if self._is_special or other._is_special:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002746 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002747 # number is always returned
2748 sn = self._isnan()
2749 on = other._isnan()
2750 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00002751 if on == 1 and sn == 0:
2752 return self._fix(context)
2753 if sn == 1 and on == 0:
2754 return other._fix(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002755 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002756
Christian Heimes77c02eb2008-02-09 02:18:51 +00002757 c = self._cmp(other)
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002758 if c == 0:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002759 # If both operands are finite and equal in numerical value
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002760 # then an ordering is applied:
2761 #
Guido van Rossumd8faa362007-04-27 19:54:29 +00002762 # If the signs differ then max returns the operand with the
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002763 # positive sign and min returns the operand with the negative sign
2764 #
Guido van Rossumd8faa362007-04-27 19:54:29 +00002765 # If the signs are the same then the exponent is used to select
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002766 # the result. This is exactly the ordering used in compare_total.
2767 c = self.compare_total(other)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002768
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002769 if c == -1:
2770 ans = other
2771 else:
2772 ans = self
2773
Christian Heimes2c181612007-12-17 20:04:13 +00002774 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002775
2776 def min(self, other, context=None):
2777 """Returns the smaller value.
2778
Guido van Rossumd8faa362007-04-27 19:54:29 +00002779 Like min(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002780 NaN (and signals if one is sNaN). Also rounds.
2781 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002782 other = _convert_other(other, raiseit=True)
2783
2784 if context is None:
2785 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002786
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002787 if self._is_special or other._is_special:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002788 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002789 # number is always returned
2790 sn = self._isnan()
2791 on = other._isnan()
2792 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00002793 if on == 1 and sn == 0:
2794 return self._fix(context)
2795 if sn == 1 and on == 0:
2796 return other._fix(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002797 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002798
Christian Heimes77c02eb2008-02-09 02:18:51 +00002799 c = self._cmp(other)
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002800 if c == 0:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002801 c = self.compare_total(other)
2802
2803 if c == -1:
2804 ans = self
2805 else:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002806 ans = other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002807
Christian Heimes2c181612007-12-17 20:04:13 +00002808 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002809
2810 def _isinteger(self):
2811 """Returns whether self is an integer"""
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002812 if self._is_special:
2813 return False
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002814 if self._exp >= 0:
2815 return True
2816 rest = self._int[self._exp:]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002817 return rest == '0'*len(rest)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002818
2819 def _iseven(self):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002820 """Returns True if self is even. Assumes self is an integer."""
2821 if not self or self._exp > 0:
2822 return True
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002823 return self._int[-1+self._exp] in '02468'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002824
2825 def adjusted(self):
2826 """Return the adjusted exponent of self"""
2827 try:
2828 return self._exp + len(self._int) - 1
Guido van Rossumd8faa362007-04-27 19:54:29 +00002829 # If NaN or Infinity, self._exp is string
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002830 except TypeError:
2831 return 0
2832
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002833 def canonical(self, context=None):
2834 """Returns the same Decimal object.
2835
2836 As we do not have different encodings for the same number, the
2837 received object already is in its canonical form.
2838 """
2839 return self
2840
2841 def compare_signal(self, other, context=None):
2842 """Compares self to the other operand numerically.
2843
2844 It's pretty much like compare(), but all NaNs signal, with signaling
2845 NaNs taking precedence over quiet NaNs.
2846 """
Christian Heimes77c02eb2008-02-09 02:18:51 +00002847 other = _convert_other(other, raiseit = True)
2848 ans = self._compare_check_nans(other, context)
2849 if ans:
2850 return ans
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002851 return self.compare(other, context=context)
2852
2853 def compare_total(self, other):
2854 """Compares self to other using the abstract representations.
2855
2856 This is not like the standard compare, which use their numerical
2857 value. Note that a total ordering is defined for all possible abstract
2858 representations.
2859 """
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00002860 other = _convert_other(other, raiseit=True)
2861
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002862 # if one is negative and the other is positive, it's easy
2863 if self._sign and not other._sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002864 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002865 if not self._sign and other._sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002866 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002867 sign = self._sign
2868
2869 # let's handle both NaN types
2870 self_nan = self._isnan()
2871 other_nan = other._isnan()
2872 if self_nan or other_nan:
2873 if self_nan == other_nan:
Mark Dickinsond314e1b2009-08-28 13:39:53 +00002874 # compare payloads as though they're integers
2875 self_key = len(self._int), self._int
2876 other_key = len(other._int), other._int
2877 if self_key < other_key:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002878 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002879 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002880 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002881 return _NegativeOne
Mark Dickinsond314e1b2009-08-28 13:39:53 +00002882 if self_key > other_key:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002883 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002884 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002885 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002886 return _One
2887 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002888
2889 if sign:
2890 if self_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002891 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002892 if other_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002893 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002894 if self_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002895 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002896 if other_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002897 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002898 else:
2899 if self_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002900 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002901 if other_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002902 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002903 if self_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002904 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002905 if other_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002906 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002907
2908 if self < other:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002909 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002910 if self > other:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002911 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002912
2913 if self._exp < other._exp:
2914 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002915 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002916 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002917 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002918 if self._exp > other._exp:
2919 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002920 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002921 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002922 return _One
2923 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002924
2925
2926 def compare_total_mag(self, other):
2927 """Compares self to other using abstract repr., ignoring sign.
2928
2929 Like compare_total, but with operand's sign ignored and assumed to be 0.
2930 """
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00002931 other = _convert_other(other, raiseit=True)
2932
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002933 s = self.copy_abs()
2934 o = other.copy_abs()
2935 return s.compare_total(o)
2936
2937 def copy_abs(self):
2938 """Returns a copy with the sign set to 0. """
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002939 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002940
2941 def copy_negate(self):
2942 """Returns a copy with the sign inverted."""
2943 if self._sign:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002944 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002945 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002946 return _dec_from_triple(1, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002947
2948 def copy_sign(self, other):
2949 """Returns self with the sign of other."""
Mark Dickinson84230a12010-02-18 14:49:50 +00002950 other = _convert_other(other, raiseit=True)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002951 return _dec_from_triple(other._sign, self._int,
2952 self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002953
2954 def exp(self, context=None):
2955 """Returns e ** self."""
2956
2957 if context is None:
2958 context = getcontext()
2959
2960 # exp(NaN) = NaN
2961 ans = self._check_nans(context=context)
2962 if ans:
2963 return ans
2964
2965 # exp(-Infinity) = 0
2966 if self._isinfinity() == -1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002967 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002968
2969 # exp(0) = 1
2970 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002971 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002972
2973 # exp(Infinity) = Infinity
2974 if self._isinfinity() == 1:
2975 return Decimal(self)
2976
2977 # the result is now guaranteed to be inexact (the true
2978 # mathematical result is transcendental). There's no need to
2979 # raise Rounded and Inexact here---they'll always be raised as
2980 # a result of the call to _fix.
2981 p = context.prec
2982 adj = self.adjusted()
2983
2984 # we only need to do any computation for quite a small range
2985 # of adjusted exponents---for example, -29 <= adj <= 10 for
2986 # the default context. For smaller exponent the result is
2987 # indistinguishable from 1 at the given precision, while for
2988 # larger exponent the result either overflows or underflows.
2989 if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
2990 # overflow
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002991 ans = _dec_from_triple(0, '1', context.Emax+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002992 elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
2993 # underflow to 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002994 ans = _dec_from_triple(0, '1', context.Etiny()-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002995 elif self._sign == 0 and adj < -p:
2996 # p+1 digits; final round will raise correct flags
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002997 ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002998 elif self._sign == 1 and adj < -p-1:
2999 # p+1 digits; final round will raise correct flags
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003000 ans = _dec_from_triple(0, '9'*(p+1), -p-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003001 # general case
3002 else:
3003 op = _WorkRep(self)
3004 c, e = op.int, op.exp
3005 if op.sign == 1:
3006 c = -c
3007
3008 # compute correctly rounded result: increase precision by
3009 # 3 digits at a time until we get an unambiguously
3010 # roundable result
3011 extra = 3
3012 while True:
3013 coeff, exp = _dexp(c, e, p+extra)
3014 if coeff % (5*10**(len(str(coeff))-p-1)):
3015 break
3016 extra += 3
3017
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003018 ans = _dec_from_triple(0, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003019
3020 # at this stage, ans should round correctly with *any*
3021 # rounding mode, not just with ROUND_HALF_EVEN
3022 context = context._shallow_copy()
3023 rounding = context._set_rounding(ROUND_HALF_EVEN)
3024 ans = ans._fix(context)
3025 context.rounding = rounding
3026
3027 return ans
3028
3029 def is_canonical(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003030 """Return True if self is canonical; otherwise return False.
3031
3032 Currently, the encoding of a Decimal instance is always
3033 canonical, so this method returns True for any Decimal.
3034 """
3035 return True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003036
3037 def is_finite(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003038 """Return True if self is finite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003039
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003040 A Decimal instance is considered finite if it is neither
3041 infinite nor a NaN.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003042 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003043 return not self._is_special
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003044
3045 def is_infinite(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003046 """Return True if self is infinite; otherwise return False."""
3047 return self._exp == 'F'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003048
3049 def is_nan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003050 """Return True if self is a qNaN or sNaN; otherwise return False."""
3051 return self._exp in ('n', 'N')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003052
3053 def is_normal(self, context=None):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003054 """Return True if self is a normal number; otherwise return False."""
3055 if self._is_special or not self:
3056 return False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003057 if context is None:
3058 context = getcontext()
Mark Dickinson06bb6742009-10-20 13:38:04 +00003059 return context.Emin <= self.adjusted()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003060
3061 def is_qnan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003062 """Return True if self is a quiet NaN; otherwise return False."""
3063 return self._exp == 'n'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003064
3065 def is_signed(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003066 """Return True if self is negative; otherwise return False."""
3067 return self._sign == 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003068
3069 def is_snan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003070 """Return True if self is a signaling NaN; otherwise return False."""
3071 return self._exp == 'N'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003072
3073 def is_subnormal(self, context=None):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003074 """Return True if self is subnormal; otherwise return False."""
3075 if self._is_special or not self:
3076 return False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003077 if context is None:
3078 context = getcontext()
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003079 return self.adjusted() < context.Emin
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003080
3081 def is_zero(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003082 """Return True if self is a zero; otherwise return False."""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003083 return not self._is_special and self._int == '0'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003084
3085 def _ln_exp_bound(self):
3086 """Compute a lower bound for the adjusted exponent of self.ln().
3087 In other words, compute r such that self.ln() >= 10**r. Assumes
3088 that self is finite and positive and that self != 1.
3089 """
3090
3091 # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
3092 adj = self._exp + len(self._int) - 1
3093 if adj >= 1:
3094 # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
3095 return len(str(adj*23//10)) - 1
3096 if adj <= -2:
3097 # argument <= 0.1
3098 return len(str((-1-adj)*23//10)) - 1
3099 op = _WorkRep(self)
3100 c, e = op.int, op.exp
3101 if adj == 0:
3102 # 1 < self < 10
3103 num = str(c-10**-e)
3104 den = str(c)
3105 return len(num) - len(den) - (num < den)
3106 # adj == -1, 0.1 <= self < 1
3107 return e + len(str(10**-e - c)) - 1
3108
3109
3110 def ln(self, context=None):
3111 """Returns the natural (base e) logarithm of self."""
3112
3113 if context is None:
3114 context = getcontext()
3115
3116 # ln(NaN) = NaN
3117 ans = self._check_nans(context=context)
3118 if ans:
3119 return ans
3120
3121 # ln(0.0) == -Infinity
3122 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003123 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003124
3125 # ln(Infinity) = Infinity
3126 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003127 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003128
3129 # ln(1.0) == 0.0
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003130 if self == _One:
3131 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003132
3133 # ln(negative) raises InvalidOperation
3134 if self._sign == 1:
3135 return context._raise_error(InvalidOperation,
3136 'ln of a negative value')
3137
3138 # result is irrational, so necessarily inexact
3139 op = _WorkRep(self)
3140 c, e = op.int, op.exp
3141 p = context.prec
3142
3143 # correctly rounded result: repeatedly increase precision by 3
3144 # until we get an unambiguously roundable result
3145 places = p - self._ln_exp_bound() + 2 # at least p+3 places
3146 while True:
3147 coeff = _dlog(c, e, places)
3148 # assert len(str(abs(coeff)))-p >= 1
3149 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3150 break
3151 places += 3
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003152 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003153
3154 context = context._shallow_copy()
3155 rounding = context._set_rounding(ROUND_HALF_EVEN)
3156 ans = ans._fix(context)
3157 context.rounding = rounding
3158 return ans
3159
3160 def _log10_exp_bound(self):
3161 """Compute a lower bound for the adjusted exponent of self.log10().
3162 In other words, find r such that self.log10() >= 10**r.
3163 Assumes that self is finite and positive and that self != 1.
3164 """
3165
3166 # For x >= 10 or x < 0.1 we only need a bound on the integer
3167 # part of log10(self), and this comes directly from the
3168 # exponent of x. For 0.1 <= x <= 10 we use the inequalities
3169 # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
3170 # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0
3171
3172 adj = self._exp + len(self._int) - 1
3173 if adj >= 1:
3174 # self >= 10
3175 return len(str(adj))-1
3176 if adj <= -2:
3177 # self < 0.1
3178 return len(str(-1-adj))-1
3179 op = _WorkRep(self)
3180 c, e = op.int, op.exp
3181 if adj == 0:
3182 # 1 < self < 10
3183 num = str(c-10**-e)
3184 den = str(231*c)
3185 return len(num) - len(den) - (num < den) + 2
3186 # adj == -1, 0.1 <= self < 1
3187 num = str(10**-e-c)
3188 return len(num) + e - (num < "231") - 1
3189
3190 def log10(self, context=None):
3191 """Returns the base 10 logarithm of self."""
3192
3193 if context is None:
3194 context = getcontext()
3195
3196 # log10(NaN) = NaN
3197 ans = self._check_nans(context=context)
3198 if ans:
3199 return ans
3200
3201 # log10(0.0) == -Infinity
3202 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003203 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003204
3205 # log10(Infinity) = Infinity
3206 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003207 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003208
3209 # log10(negative or -Infinity) raises InvalidOperation
3210 if self._sign == 1:
3211 return context._raise_error(InvalidOperation,
3212 'log10 of a negative value')
3213
3214 # log10(10**n) = n
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003215 if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003216 # answer may need rounding
3217 ans = Decimal(self._exp + len(self._int) - 1)
3218 else:
3219 # result is irrational, so necessarily inexact
3220 op = _WorkRep(self)
3221 c, e = op.int, op.exp
3222 p = context.prec
3223
3224 # correctly rounded result: repeatedly increase precision
3225 # until result is unambiguously roundable
3226 places = p-self._log10_exp_bound()+2
3227 while True:
3228 coeff = _dlog10(c, e, places)
3229 # assert len(str(abs(coeff)))-p >= 1
3230 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3231 break
3232 places += 3
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003233 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003234
3235 context = context._shallow_copy()
3236 rounding = context._set_rounding(ROUND_HALF_EVEN)
3237 ans = ans._fix(context)
3238 context.rounding = rounding
3239 return ans
3240
3241 def logb(self, context=None):
3242 """ Returns the exponent of the magnitude of self's MSD.
3243
3244 The result is the integer which is the exponent of the magnitude
3245 of the most significant digit of self (as though it were truncated
3246 to a single digit while maintaining the value of that digit and
3247 without limiting the resulting exponent).
3248 """
3249 # logb(NaN) = NaN
3250 ans = self._check_nans(context=context)
3251 if ans:
3252 return ans
3253
3254 if context is None:
3255 context = getcontext()
3256
3257 # logb(+/-Inf) = +Inf
3258 if self._isinfinity():
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003259 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003260
3261 # logb(0) = -Inf, DivisionByZero
3262 if not self:
3263 return context._raise_error(DivisionByZero, 'logb(0)', 1)
3264
3265 # otherwise, simply return the adjusted exponent of self, as a
3266 # Decimal. Note that no attempt is made to fit the result
3267 # into the current context.
Mark Dickinson56df8872009-10-07 19:23:50 +00003268 ans = Decimal(self.adjusted())
3269 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003270
3271 def _islogical(self):
3272 """Return True if self is a logical operand.
3273
Christian Heimes679db4a2008-01-18 09:56:22 +00003274 For being logical, it must be a finite number with a sign of 0,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003275 an exponent of 0, and a coefficient whose digits must all be
3276 either 0 or 1.
3277 """
3278 if self._sign != 0 or self._exp != 0:
3279 return False
3280 for dig in self._int:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003281 if dig not in '01':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003282 return False
3283 return True
3284
3285 def _fill_logical(self, context, opa, opb):
3286 dif = context.prec - len(opa)
3287 if dif > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003288 opa = '0'*dif + opa
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003289 elif dif < 0:
3290 opa = opa[-context.prec:]
3291 dif = context.prec - len(opb)
3292 if dif > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003293 opb = '0'*dif + opb
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003294 elif dif < 0:
3295 opb = opb[-context.prec:]
3296 return opa, opb
3297
3298 def logical_and(self, other, context=None):
3299 """Applies an 'and' operation between self and other's digits."""
3300 if context is None:
3301 context = getcontext()
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003302
3303 other = _convert_other(other, raiseit=True)
3304
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003305 if not self._islogical() or not other._islogical():
3306 return context._raise_error(InvalidOperation)
3307
3308 # fill to context.prec
3309 (opa, opb) = self._fill_logical(context, self._int, other._int)
3310
3311 # make the operation, and clean starting zeroes
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003312 result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
3313 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003314
3315 def logical_invert(self, context=None):
3316 """Invert all its digits."""
3317 if context is None:
3318 context = getcontext()
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003319 return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
3320 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003321
3322 def logical_or(self, other, context=None):
3323 """Applies an 'or' operation between self and other's digits."""
3324 if context is None:
3325 context = getcontext()
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003326
3327 other = _convert_other(other, raiseit=True)
3328
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003329 if not self._islogical() or not other._islogical():
3330 return context._raise_error(InvalidOperation)
3331
3332 # fill to context.prec
3333 (opa, opb) = self._fill_logical(context, self._int, other._int)
3334
3335 # make the operation, and clean starting zeroes
Mark Dickinson315a20a2009-01-04 21:34:18 +00003336 result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)])
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003337 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003338
3339 def logical_xor(self, other, context=None):
3340 """Applies an 'xor' operation between self and other's digits."""
3341 if context is None:
3342 context = getcontext()
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003343
3344 other = _convert_other(other, raiseit=True)
3345
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003346 if not self._islogical() or not other._islogical():
3347 return context._raise_error(InvalidOperation)
3348
3349 # fill to context.prec
3350 (opa, opb) = self._fill_logical(context, self._int, other._int)
3351
3352 # make the operation, and clean starting zeroes
Mark Dickinson315a20a2009-01-04 21:34:18 +00003353 result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)])
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003354 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003355
3356 def max_mag(self, other, context=None):
3357 """Compares the values numerically with their sign ignored."""
3358 other = _convert_other(other, raiseit=True)
3359
3360 if context is None:
3361 context = getcontext()
3362
3363 if self._is_special or other._is_special:
3364 # If one operand is a quiet NaN and the other is number, then the
3365 # number is always returned
3366 sn = self._isnan()
3367 on = other._isnan()
3368 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00003369 if on == 1 and sn == 0:
3370 return self._fix(context)
3371 if sn == 1 and on == 0:
3372 return other._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003373 return self._check_nans(other, context)
3374
Christian Heimes77c02eb2008-02-09 02:18:51 +00003375 c = self.copy_abs()._cmp(other.copy_abs())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003376 if c == 0:
3377 c = self.compare_total(other)
3378
3379 if c == -1:
3380 ans = other
3381 else:
3382 ans = self
3383
Christian Heimes2c181612007-12-17 20:04:13 +00003384 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003385
3386 def min_mag(self, other, context=None):
3387 """Compares the values numerically with their sign ignored."""
3388 other = _convert_other(other, raiseit=True)
3389
3390 if context is None:
3391 context = getcontext()
3392
3393 if self._is_special or other._is_special:
3394 # If one operand is a quiet NaN and the other is number, then the
3395 # number is always returned
3396 sn = self._isnan()
3397 on = other._isnan()
3398 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00003399 if on == 1 and sn == 0:
3400 return self._fix(context)
3401 if sn == 1 and on == 0:
3402 return other._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003403 return self._check_nans(other, context)
3404
Christian Heimes77c02eb2008-02-09 02:18:51 +00003405 c = self.copy_abs()._cmp(other.copy_abs())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003406 if c == 0:
3407 c = self.compare_total(other)
3408
3409 if c == -1:
3410 ans = self
3411 else:
3412 ans = other
3413
Christian Heimes2c181612007-12-17 20:04:13 +00003414 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003415
3416 def next_minus(self, context=None):
3417 """Returns the largest representable number smaller than itself."""
3418 if context is None:
3419 context = getcontext()
3420
3421 ans = self._check_nans(context=context)
3422 if ans:
3423 return ans
3424
3425 if self._isinfinity() == -1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003426 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003427 if self._isinfinity() == 1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003428 return _dec_from_triple(0, '9'*context.prec, context.Etop())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003429
3430 context = context.copy()
3431 context._set_rounding(ROUND_FLOOR)
3432 context._ignore_all_flags()
3433 new_self = self._fix(context)
3434 if new_self != self:
3435 return new_self
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003436 return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
3437 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003438
3439 def next_plus(self, context=None):
3440 """Returns the smallest representable number larger than itself."""
3441 if context is None:
3442 context = getcontext()
3443
3444 ans = self._check_nans(context=context)
3445 if ans:
3446 return ans
3447
3448 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003449 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003450 if self._isinfinity() == -1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003451 return _dec_from_triple(1, '9'*context.prec, context.Etop())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003452
3453 context = context.copy()
3454 context._set_rounding(ROUND_CEILING)
3455 context._ignore_all_flags()
3456 new_self = self._fix(context)
3457 if new_self != self:
3458 return new_self
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003459 return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
3460 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003461
3462 def next_toward(self, other, context=None):
3463 """Returns the number closest to self, in the direction towards other.
3464
3465 The result is the closest representable number to self
3466 (excluding self) that is in the direction towards other,
3467 unless both have the same value. If the two operands are
3468 numerically equal, then the result is a copy of self with the
3469 sign set to be the same as the sign of other.
3470 """
3471 other = _convert_other(other, raiseit=True)
3472
3473 if context is None:
3474 context = getcontext()
3475
3476 ans = self._check_nans(other, context)
3477 if ans:
3478 return ans
3479
Christian Heimes77c02eb2008-02-09 02:18:51 +00003480 comparison = self._cmp(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003481 if comparison == 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003482 return self.copy_sign(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003483
3484 if comparison == -1:
3485 ans = self.next_plus(context)
3486 else: # comparison == 1
3487 ans = self.next_minus(context)
3488
3489 # decide which flags to raise using value of ans
3490 if ans._isinfinity():
3491 context._raise_error(Overflow,
3492 'Infinite result from next_toward',
3493 ans._sign)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003494 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00003495 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003496 elif ans.adjusted() < context.Emin:
3497 context._raise_error(Underflow)
3498 context._raise_error(Subnormal)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003499 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00003500 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003501 # if precision == 1 then we don't raise Clamped for a
3502 # result 0E-Etiny.
3503 if not ans:
3504 context._raise_error(Clamped)
3505
3506 return ans
3507
3508 def number_class(self, context=None):
3509 """Returns an indication of the class of self.
3510
3511 The class is one of the following strings:
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003512 sNaN
3513 NaN
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003514 -Infinity
3515 -Normal
3516 -Subnormal
3517 -Zero
3518 +Zero
3519 +Subnormal
3520 +Normal
3521 +Infinity
3522 """
3523 if self.is_snan():
3524 return "sNaN"
3525 if self.is_qnan():
3526 return "NaN"
3527 inf = self._isinfinity()
3528 if inf == 1:
3529 return "+Infinity"
3530 if inf == -1:
3531 return "-Infinity"
3532 if self.is_zero():
3533 if self._sign:
3534 return "-Zero"
3535 else:
3536 return "+Zero"
3537 if context is None:
3538 context = getcontext()
3539 if self.is_subnormal(context=context):
3540 if self._sign:
3541 return "-Subnormal"
3542 else:
3543 return "+Subnormal"
3544 # just a normal, regular, boring number, :)
3545 if self._sign:
3546 return "-Normal"
3547 else:
3548 return "+Normal"
3549
3550 def radix(self):
3551 """Just returns 10, as this is Decimal, :)"""
3552 return Decimal(10)
3553
3554 def rotate(self, other, context=None):
3555 """Returns a rotated copy of self, value-of-other times."""
3556 if context is None:
3557 context = getcontext()
3558
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003559 other = _convert_other(other, raiseit=True)
3560
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003561 ans = self._check_nans(other, context)
3562 if ans:
3563 return ans
3564
3565 if other._exp != 0:
3566 return context._raise_error(InvalidOperation)
3567 if not (-context.prec <= int(other) <= context.prec):
3568 return context._raise_error(InvalidOperation)
3569
3570 if self._isinfinity():
3571 return Decimal(self)
3572
3573 # get values, pad if necessary
3574 torot = int(other)
3575 rotdig = self._int
3576 topad = context.prec - len(rotdig)
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003577 if topad > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003578 rotdig = '0'*topad + rotdig
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003579 elif topad < 0:
3580 rotdig = rotdig[-topad:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003581
3582 # let's rotate!
3583 rotated = rotdig[torot:] + rotdig[:torot]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003584 return _dec_from_triple(self._sign,
3585 rotated.lstrip('0') or '0', self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003586
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003587 def scaleb(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003588 """Returns self operand after adding the second value to its exp."""
3589 if context is None:
3590 context = getcontext()
3591
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003592 other = _convert_other(other, raiseit=True)
3593
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003594 ans = self._check_nans(other, context)
3595 if ans:
3596 return ans
3597
3598 if other._exp != 0:
3599 return context._raise_error(InvalidOperation)
3600 liminf = -2 * (context.Emax + context.prec)
3601 limsup = 2 * (context.Emax + context.prec)
3602 if not (liminf <= int(other) <= limsup):
3603 return context._raise_error(InvalidOperation)
3604
3605 if self._isinfinity():
3606 return Decimal(self)
3607
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003608 d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003609 d = d._fix(context)
3610 return d
3611
3612 def shift(self, other, context=None):
3613 """Returns a shifted copy of self, value-of-other times."""
3614 if context is None:
3615 context = getcontext()
3616
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003617 other = _convert_other(other, raiseit=True)
3618
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003619 ans = self._check_nans(other, context)
3620 if ans:
3621 return ans
3622
3623 if other._exp != 0:
3624 return context._raise_error(InvalidOperation)
3625 if not (-context.prec <= int(other) <= context.prec):
3626 return context._raise_error(InvalidOperation)
3627
3628 if self._isinfinity():
3629 return Decimal(self)
3630
3631 # get values, pad if necessary
3632 torot = int(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003633 rotdig = self._int
3634 topad = context.prec - len(rotdig)
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003635 if topad > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003636 rotdig = '0'*topad + rotdig
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003637 elif topad < 0:
3638 rotdig = rotdig[-topad:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003639
3640 # let's shift!
3641 if torot < 0:
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003642 shifted = rotdig[:torot]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003643 else:
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003644 shifted = rotdig + '0'*torot
3645 shifted = shifted[-context.prec:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003646
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003647 return _dec_from_triple(self._sign,
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003648 shifted.lstrip('0') or '0', self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003649
Guido van Rossumd8faa362007-04-27 19:54:29 +00003650 # Support for pickling, copy, and deepcopy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003651 def __reduce__(self):
3652 return (self.__class__, (str(self),))
3653
3654 def __copy__(self):
Benjamin Petersond69fe2a2010-02-03 02:59:43 +00003655 if type(self) is Decimal:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003656 return self # I'm immutable; therefore I am my own clone
3657 return self.__class__(str(self))
3658
3659 def __deepcopy__(self, memo):
Benjamin Petersond69fe2a2010-02-03 02:59:43 +00003660 if type(self) is Decimal:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003661 return self # My components are also immutable
3662 return self.__class__(str(self))
3663
Mark Dickinson79f52032009-03-17 23:12:51 +00003664 # PEP 3101 support. the _localeconv keyword argument should be
3665 # considered private: it's provided for ease of testing only.
3666 def __format__(self, specifier, context=None, _localeconv=None):
Christian Heimesf16baeb2008-02-29 14:57:44 +00003667 """Format a Decimal instance according to the given specifier.
3668
3669 The specifier should be a standard format specifier, with the
3670 form described in PEP 3101. Formatting types 'e', 'E', 'f',
Mark Dickinson79f52032009-03-17 23:12:51 +00003671 'F', 'g', 'G', 'n' and '%' are supported. If the formatting
3672 type is omitted it defaults to 'g' or 'G', depending on the
3673 value of context.capitals.
Christian Heimesf16baeb2008-02-29 14:57:44 +00003674 """
3675
3676 # Note: PEP 3101 says that if the type is not present then
3677 # there should be at least one digit after the decimal point.
3678 # We take the liberty of ignoring this requirement for
3679 # Decimal---it's presumably there to make sure that
3680 # format(float, '') behaves similarly to str(float).
3681 if context is None:
3682 context = getcontext()
3683
Mark Dickinson79f52032009-03-17 23:12:51 +00003684 spec = _parse_format_specifier(specifier, _localeconv=_localeconv)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003685
Mark Dickinson79f52032009-03-17 23:12:51 +00003686 # special values don't care about the type or precision
Christian Heimesf16baeb2008-02-29 14:57:44 +00003687 if self._is_special:
Mark Dickinson79f52032009-03-17 23:12:51 +00003688 sign = _format_sign(self._sign, spec)
3689 body = str(self.copy_abs())
3690 return _format_align(sign, body, spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003691
3692 # a type of None defaults to 'g' or 'G', depending on context
Christian Heimesf16baeb2008-02-29 14:57:44 +00003693 if spec['type'] is None:
3694 spec['type'] = ['g', 'G'][context.capitals]
Mark Dickinson79f52032009-03-17 23:12:51 +00003695
3696 # if type is '%', adjust exponent of self accordingly
3697 if spec['type'] == '%':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003698 self = _dec_from_triple(self._sign, self._int, self._exp+2)
3699
3700 # round if necessary, taking rounding mode from the context
3701 rounding = context.rounding
3702 precision = spec['precision']
3703 if precision is not None:
3704 if spec['type'] in 'eE':
3705 self = self._round(precision+1, rounding)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003706 elif spec['type'] in 'fF%':
3707 self = self._rescale(-precision, rounding)
Mark Dickinson79f52032009-03-17 23:12:51 +00003708 elif spec['type'] in 'gG' and len(self._int) > precision:
3709 self = self._round(precision, rounding)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003710 # special case: zeros with a positive exponent can't be
3711 # represented in fixed point; rescale them to 0e0.
Mark Dickinson79f52032009-03-17 23:12:51 +00003712 if not self and self._exp > 0 and spec['type'] in 'fF%':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003713 self = self._rescale(0, rounding)
3714
3715 # figure out placement of the decimal point
3716 leftdigits = self._exp + len(self._int)
Mark Dickinson79f52032009-03-17 23:12:51 +00003717 if spec['type'] in 'eE':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003718 if not self and precision is not None:
3719 dotplace = 1 - precision
3720 else:
3721 dotplace = 1
Mark Dickinson79f52032009-03-17 23:12:51 +00003722 elif spec['type'] in 'fF%':
3723 dotplace = leftdigits
Christian Heimesf16baeb2008-02-29 14:57:44 +00003724 elif spec['type'] in 'gG':
3725 if self._exp <= 0 and leftdigits > -6:
3726 dotplace = leftdigits
3727 else:
3728 dotplace = 1
3729
Mark Dickinson79f52032009-03-17 23:12:51 +00003730 # find digits before and after decimal point, and get exponent
3731 if dotplace < 0:
3732 intpart = '0'
3733 fracpart = '0'*(-dotplace) + self._int
3734 elif dotplace > len(self._int):
3735 intpart = self._int + '0'*(dotplace-len(self._int))
3736 fracpart = ''
Christian Heimesf16baeb2008-02-29 14:57:44 +00003737 else:
Mark Dickinson79f52032009-03-17 23:12:51 +00003738 intpart = self._int[:dotplace] or '0'
3739 fracpart = self._int[dotplace:]
3740 exp = leftdigits-dotplace
Christian Heimesf16baeb2008-02-29 14:57:44 +00003741
Mark Dickinson79f52032009-03-17 23:12:51 +00003742 # done with the decimal-specific stuff; hand over the rest
3743 # of the formatting to the _format_number function
3744 return _format_number(self._sign, intpart, fracpart, exp, spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003745
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003746def _dec_from_triple(sign, coefficient, exponent, special=False):
3747 """Create a decimal instance directly, without any validation,
3748 normalization (e.g. removal of leading zeros) or argument
3749 conversion.
3750
3751 This function is for *internal use only*.
3752 """
3753
3754 self = object.__new__(Decimal)
3755 self._sign = sign
3756 self._int = coefficient
3757 self._exp = exponent
3758 self._is_special = special
3759
3760 return self
3761
Raymond Hettinger82417ca2009-02-03 03:54:28 +00003762# Register Decimal as a kind of Number (an abstract base class).
3763# However, do not register it as Real (because Decimals are not
3764# interoperable with floats).
3765_numbers.Number.register(Decimal)
3766
3767
Guido van Rossumd8faa362007-04-27 19:54:29 +00003768##### Context class #######################################################
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003769
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003770
3771# get rounding method function:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003772rounding_functions = [name for name in Decimal.__dict__.keys()
3773 if name.startswith('_round_')]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003774for name in rounding_functions:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003775 # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003776 globalname = name[1:].upper()
3777 val = globals()[globalname]
3778 Decimal._pick_rounding_function[val] = name
3779
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003780del name, val, globalname, rounding_functions
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003781
Thomas Wouters89f507f2006-12-13 04:49:30 +00003782class _ContextManager(object):
3783 """Context manager class to support localcontext().
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003784
Thomas Wouters89f507f2006-12-13 04:49:30 +00003785 Sets a copy of the supplied context in __enter__() and restores
3786 the previous decimal context in __exit__()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003787 """
3788 def __init__(self, new_context):
Thomas Wouters89f507f2006-12-13 04:49:30 +00003789 self.new_context = new_context.copy()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003790 def __enter__(self):
3791 self.saved_context = getcontext()
3792 setcontext(self.new_context)
3793 return self.new_context
3794 def __exit__(self, t, v, tb):
3795 setcontext(self.saved_context)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003796
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003797class Context(object):
3798 """Contains the context for a Decimal instance.
3799
3800 Contains:
3801 prec - precision (for use in rounding, division, square roots..)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003802 rounding - rounding type (how you round)
Raymond Hettingerbf440692004-07-10 14:14:37 +00003803 traps - If traps[exception] = 1, then the exception is
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003804 raised when it is caused. Otherwise, a value is
3805 substituted in.
Raymond Hettinger86173da2008-02-01 20:38:12 +00003806 flags - When an exception is caused, flags[exception] is set.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003807 (Whether or not the trap_enabler is set)
3808 Should be reset by user of Decimal instance.
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003809 Emin - Minimum exponent
3810 Emax - Maximum exponent
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003811 capitals - If 1, 1*10^1 is printed as 1E+1.
3812 If 0, printed as 1e1
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003813 clamp - If 1, change exponents if too high (Default 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003814 """
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003815
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003816 def __init__(self, prec=None, rounding=None,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003817 traps=None, flags=None,
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003818 Emin=None, Emax=None,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003819 capitals=None, clamp=None,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003820 _ignored_flags=None):
Mark Dickinson0dd8f782010-07-08 21:15:36 +00003821 # Set defaults; for everything except flags and _ignored_flags,
3822 # inherit from DefaultContext.
3823 try:
3824 dc = DefaultContext
3825 except NameError:
3826 pass
3827
3828 self.prec = prec if prec is not None else dc.prec
3829 self.rounding = rounding if rounding is not None else dc.rounding
3830 self.Emin = Emin if Emin is not None else dc.Emin
3831 self.Emax = Emax if Emax is not None else dc.Emax
3832 self.capitals = capitals if capitals is not None else dc.capitals
3833 self.clamp = clamp if clamp is not None else dc.clamp
3834
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003835 if _ignored_flags is None:
Mark Dickinson0dd8f782010-07-08 21:15:36 +00003836 self._ignored_flags = []
3837 else:
3838 self._ignored_flags = _ignored_flags
3839
3840 if traps is None:
3841 self.traps = dc.traps.copy()
3842 elif not isinstance(traps, dict):
3843 self.traps = dict((s, int(s in traps)) for s in _signals)
3844 else:
3845 self.traps = traps
3846
3847 if flags is None:
3848 self.flags = dict.fromkeys(_signals, 0)
3849 elif not isinstance(flags, dict):
3850 self.flags = dict((s, int(s in flags)) for s in _signals)
3851 else:
3852 self.flags = flags
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003853
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003854 def __repr__(self):
Raymond Hettingerbf440692004-07-10 14:14:37 +00003855 """Show the current context."""
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003856 s = []
Guido van Rossumd8faa362007-04-27 19:54:29 +00003857 s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003858 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d, '
3859 'clamp=%(clamp)d'
Guido van Rossumd8faa362007-04-27 19:54:29 +00003860 % vars(self))
3861 names = [f.__name__ for f, v in self.flags.items() if v]
3862 s.append('flags=[' + ', '.join(names) + ']')
3863 names = [t.__name__ for t, v in self.traps.items() if v]
3864 s.append('traps=[' + ', '.join(names) + ']')
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003865 return ', '.join(s) + ')'
3866
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003867 def clear_flags(self):
3868 """Reset all flags to zero"""
3869 for flag in self.flags:
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003870 self.flags[flag] = 0
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003871
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003872 def _shallow_copy(self):
3873 """Returns a shallow copy from self."""
Christian Heimes2c181612007-12-17 20:04:13 +00003874 nc = Context(self.prec, self.rounding, self.traps,
3875 self.flags, self.Emin, self.Emax,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003876 self.capitals, self.clamp, self._ignored_flags)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003877 return nc
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003878
3879 def copy(self):
3880 """Returns a deep copy from self."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00003881 nc = Context(self.prec, self.rounding, self.traps.copy(),
Christian Heimes2c181612007-12-17 20:04:13 +00003882 self.flags.copy(), self.Emin, self.Emax,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003883 self.capitals, self.clamp, self._ignored_flags)
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003884 return nc
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003885 __copy__ = copy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003886
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003887 # _clamp is provided for backwards compatibility with third-party
3888 # code. May be removed in Python >= 3.3.
3889 def _get_clamp(self):
3890 "_clamp mirrors the clamp attribute. Its use is deprecated."
3891 import warnings
3892 warnings.warn('Use of the _clamp attribute is deprecated. '
3893 'Please use clamp instead.',
3894 DeprecationWarning)
3895 return self.clamp
3896
3897 def _set_clamp(self, clamp):
3898 "_clamp mirrors the clamp attribute. Its use is deprecated."
3899 import warnings
3900 warnings.warn('Use of the _clamp attribute is deprecated. '
3901 'Please use clamp instead.',
3902 DeprecationWarning)
3903 self.clamp = clamp
3904
3905 # don't bother with _del_clamp; no sane 3rd party code should
3906 # be deleting the _clamp attribute
3907 _clamp = property(_get_clamp, _set_clamp)
3908
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003909 def _raise_error(self, condition, explanation = None, *args):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003910 """Handles an error
3911
3912 If the flag is in _ignored_flags, returns the default response.
Raymond Hettinger86173da2008-02-01 20:38:12 +00003913 Otherwise, it sets the flag, then, if the corresponding
Stefan Krah2eb4a072010-05-19 15:52:31 +00003914 trap_enabler is set, it reraises the exception. Otherwise, it returns
Raymond Hettinger86173da2008-02-01 20:38:12 +00003915 the default value after setting the flag.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003916 """
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003917 error = _condition_map.get(condition, condition)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003918 if error in self._ignored_flags:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003919 # Don't touch the flag
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003920 return error().handle(self, *args)
3921
Raymond Hettinger86173da2008-02-01 20:38:12 +00003922 self.flags[error] = 1
Raymond Hettingerbf440692004-07-10 14:14:37 +00003923 if not self.traps[error]:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003924 # The errors define how to handle themselves.
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003925 return condition().handle(self, *args)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003926
3927 # Errors should only be risked on copies of the context
Guido van Rossumd8faa362007-04-27 19:54:29 +00003928 # self._ignored_flags = []
Collin Winterce36ad82007-08-30 01:19:48 +00003929 raise error(explanation)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003930
3931 def _ignore_all_flags(self):
3932 """Ignore all flags, if they are raised"""
Raymond Hettingerfed52962004-07-14 15:41:57 +00003933 return self._ignore_flags(*_signals)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003934
3935 def _ignore_flags(self, *flags):
3936 """Ignore the flags, if they are raised"""
3937 # Do not mutate-- This way, copies of a context leave the original
3938 # alone.
3939 self._ignored_flags = (self._ignored_flags + list(flags))
3940 return list(flags)
3941
3942 def _regard_flags(self, *flags):
3943 """Stop ignoring the flags, if they are raised"""
3944 if flags and isinstance(flags[0], (tuple,list)):
3945 flags = flags[0]
3946 for flag in flags:
3947 self._ignored_flags.remove(flag)
3948
Nick Coghland1abd252008-07-15 15:46:38 +00003949 # We inherit object.__hash__, so we must deny this explicitly
3950 __hash__ = None
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003951
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003952 def Etiny(self):
3953 """Returns Etiny (= Emin - prec + 1)"""
3954 return int(self.Emin - self.prec + 1)
3955
3956 def Etop(self):
Raymond Hettingere0f15812004-07-05 05:36:39 +00003957 """Returns maximum exponent (= Emax - prec + 1)"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003958 return int(self.Emax - self.prec + 1)
3959
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003960 def _set_rounding(self, type):
3961 """Sets the rounding type.
3962
3963 Sets the rounding type, and returns the current (previous)
3964 rounding type. Often used like:
3965
3966 context = context.copy()
3967 # so you don't change the calling context
3968 # if an error occurs in the middle.
3969 rounding = context._set_rounding(ROUND_UP)
3970 val = self.__sub__(other, context=context)
3971 context._set_rounding(rounding)
3972
3973 This will make it round up for that operation.
3974 """
3975 rounding = self.rounding
3976 self.rounding= type
3977 return rounding
3978
Raymond Hettingerfed52962004-07-14 15:41:57 +00003979 def create_decimal(self, num='0'):
Christian Heimesa62da1d2008-01-12 19:39:10 +00003980 """Creates a new Decimal instance but using self as context.
3981
3982 This method implements the to-number operation of the
3983 IBM Decimal specification."""
3984
3985 if isinstance(num, str) and num != num.strip():
3986 return self._raise_error(ConversionSyntax,
3987 "no trailing or leading whitespace is "
3988 "permitted.")
3989
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003990 d = Decimal(num, context=self)
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003991 if d._isnan() and len(d._int) > self.prec - self.clamp:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003992 return self._raise_error(ConversionSyntax,
3993 "diagnostic info too long in NaN")
Raymond Hettingerdab988d2004-10-09 07:10:44 +00003994 return d._fix(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003995
Raymond Hettinger771ed762009-01-03 19:20:32 +00003996 def create_decimal_from_float(self, f):
3997 """Creates a new Decimal instance from a float but rounding using self
3998 as the context.
3999
4000 >>> context = Context(prec=5, rounding=ROUND_DOWN)
4001 >>> context.create_decimal_from_float(3.1415926535897932)
4002 Decimal('3.1415')
4003 >>> context = Context(prec=5, traps=[Inexact])
4004 >>> context.create_decimal_from_float(3.1415926535897932)
4005 Traceback (most recent call last):
4006 ...
4007 decimal.Inexact: None
4008
4009 """
4010 d = Decimal.from_float(f) # An exact conversion
4011 return d._fix(self) # Apply the context rounding
4012
Guido van Rossumd8faa362007-04-27 19:54:29 +00004013 # Methods
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004014 def abs(self, a):
4015 """Returns the absolute value of the operand.
4016
4017 If the operand is negative, the result is the same as using the minus
Guido van Rossumd8faa362007-04-27 19:54:29 +00004018 operation on the operand. Otherwise, the result is the same as using
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004019 the plus operation on the operand.
4020
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004021 >>> ExtendedContext.abs(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004022 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004023 >>> ExtendedContext.abs(Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004024 Decimal('100')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004025 >>> ExtendedContext.abs(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004026 Decimal('101.5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004027 >>> ExtendedContext.abs(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004028 Decimal('101.5')
Mark Dickinson84230a12010-02-18 14:49:50 +00004029 >>> ExtendedContext.abs(-1)
4030 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004031 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004032 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004033 return a.__abs__(context=self)
4034
4035 def add(self, a, b):
4036 """Return the sum of the two operands.
4037
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004038 >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004039 Decimal('19.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004040 >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004041 Decimal('1.02E+4')
Mark Dickinson84230a12010-02-18 14:49:50 +00004042 >>> ExtendedContext.add(1, Decimal(2))
4043 Decimal('3')
4044 >>> ExtendedContext.add(Decimal(8), 5)
4045 Decimal('13')
4046 >>> ExtendedContext.add(5, 5)
4047 Decimal('10')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004048 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004049 a = _convert_other(a, raiseit=True)
4050 r = a.__add__(b, context=self)
4051 if r is NotImplemented:
4052 raise TypeError("Unable to convert %s to Decimal" % b)
4053 else:
4054 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004055
4056 def _apply(self, a):
Raymond Hettingerdab988d2004-10-09 07:10:44 +00004057 return str(a._fix(self))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004058
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004059 def canonical(self, a):
4060 """Returns the same Decimal object.
4061
4062 As we do not have different encodings for the same number, the
4063 received object already is in its canonical form.
4064
4065 >>> ExtendedContext.canonical(Decimal('2.50'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004066 Decimal('2.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004067 """
4068 return a.canonical(context=self)
4069
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004070 def compare(self, a, b):
4071 """Compares values numerically.
4072
4073 If the signs of the operands differ, a value representing each operand
4074 ('-1' if the operand is less than zero, '0' if the operand is zero or
4075 negative zero, or '1' if the operand is greater than zero) is used in
4076 place of that operand for the comparison instead of the actual
4077 operand.
4078
4079 The comparison is then effected by subtracting the second operand from
4080 the first and then returning a value according to the result of the
4081 subtraction: '-1' if the result is less than zero, '0' if the result is
4082 zero or negative zero, or '1' if the result is greater than zero.
4083
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004084 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004085 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004086 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004087 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004088 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004089 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004090 >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004091 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004092 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004093 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004094 >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004095 Decimal('-1')
Mark Dickinson84230a12010-02-18 14:49:50 +00004096 >>> ExtendedContext.compare(1, 2)
4097 Decimal('-1')
4098 >>> ExtendedContext.compare(Decimal(1), 2)
4099 Decimal('-1')
4100 >>> ExtendedContext.compare(1, Decimal(2))
4101 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004102 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004103 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004104 return a.compare(b, context=self)
4105
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004106 def compare_signal(self, a, b):
4107 """Compares the values of the two operands numerically.
4108
4109 It's pretty much like compare(), but all NaNs signal, with signaling
4110 NaNs taking precedence over quiet NaNs.
4111
4112 >>> c = ExtendedContext
4113 >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004114 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004115 >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004116 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004117 >>> c.flags[InvalidOperation] = 0
4118 >>> print(c.flags[InvalidOperation])
4119 0
4120 >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004121 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004122 >>> print(c.flags[InvalidOperation])
4123 1
4124 >>> c.flags[InvalidOperation] = 0
4125 >>> print(c.flags[InvalidOperation])
4126 0
4127 >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004128 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004129 >>> print(c.flags[InvalidOperation])
4130 1
Mark Dickinson84230a12010-02-18 14:49:50 +00004131 >>> c.compare_signal(-1, 2)
4132 Decimal('-1')
4133 >>> c.compare_signal(Decimal(-1), 2)
4134 Decimal('-1')
4135 >>> c.compare_signal(-1, Decimal(2))
4136 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004137 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004138 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004139 return a.compare_signal(b, context=self)
4140
4141 def compare_total(self, a, b):
4142 """Compares two operands using their abstract representation.
4143
4144 This is not like the standard compare, which use their numerical
4145 value. Note that a total ordering is defined for all possible abstract
4146 representations.
4147
4148 >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004149 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004150 >>> ExtendedContext.compare_total(Decimal('-127'), Decimal('12'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004151 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004152 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004153 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004154 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004155 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004156 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('12.300'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004157 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004158 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004159 Decimal('-1')
Mark Dickinson84230a12010-02-18 14:49:50 +00004160 >>> ExtendedContext.compare_total(1, 2)
4161 Decimal('-1')
4162 >>> ExtendedContext.compare_total(Decimal(1), 2)
4163 Decimal('-1')
4164 >>> ExtendedContext.compare_total(1, Decimal(2))
4165 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004166 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004167 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004168 return a.compare_total(b)
4169
4170 def compare_total_mag(self, a, b):
4171 """Compares two operands using their abstract representation ignoring sign.
4172
4173 Like compare_total, but with operand's sign ignored and assumed to be 0.
4174 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004175 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004176 return a.compare_total_mag(b)
4177
4178 def copy_abs(self, a):
4179 """Returns a copy of the operand with the sign set to 0.
4180
4181 >>> ExtendedContext.copy_abs(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004182 Decimal('2.1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004183 >>> ExtendedContext.copy_abs(Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004184 Decimal('100')
Mark Dickinson84230a12010-02-18 14:49:50 +00004185 >>> ExtendedContext.copy_abs(-1)
4186 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004187 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004188 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004189 return a.copy_abs()
4190
4191 def copy_decimal(self, a):
Mark Dickinson84230a12010-02-18 14:49:50 +00004192 """Returns a copy of the decimal object.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004193
4194 >>> ExtendedContext.copy_decimal(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004195 Decimal('2.1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004196 >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004197 Decimal('-1.00')
Mark Dickinson84230a12010-02-18 14:49:50 +00004198 >>> ExtendedContext.copy_decimal(1)
4199 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004200 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004201 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004202 return Decimal(a)
4203
4204 def copy_negate(self, a):
4205 """Returns a copy of the operand with the sign inverted.
4206
4207 >>> ExtendedContext.copy_negate(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004208 Decimal('-101.5')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004209 >>> ExtendedContext.copy_negate(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004210 Decimal('101.5')
Mark Dickinson84230a12010-02-18 14:49:50 +00004211 >>> ExtendedContext.copy_negate(1)
4212 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004213 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004214 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004215 return a.copy_negate()
4216
4217 def copy_sign(self, a, b):
4218 """Copies the second operand's sign to the first one.
4219
4220 In detail, it returns a copy of the first operand with the sign
4221 equal to the sign of the second operand.
4222
4223 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004224 Decimal('1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004225 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004226 Decimal('1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004227 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004228 Decimal('-1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004229 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004230 Decimal('-1.50')
Mark Dickinson84230a12010-02-18 14:49:50 +00004231 >>> ExtendedContext.copy_sign(1, -2)
4232 Decimal('-1')
4233 >>> ExtendedContext.copy_sign(Decimal(1), -2)
4234 Decimal('-1')
4235 >>> ExtendedContext.copy_sign(1, Decimal(-2))
4236 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004237 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004238 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004239 return a.copy_sign(b)
4240
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004241 def divide(self, a, b):
4242 """Decimal division in a specified context.
4243
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004244 >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004245 Decimal('0.333333333')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004246 >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004247 Decimal('0.666666667')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004248 >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004249 Decimal('2.5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004250 >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004251 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004252 >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004253 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004254 >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004255 Decimal('4.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004256 >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004257 Decimal('1.20')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004258 >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004259 Decimal('10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004260 >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004261 Decimal('1000')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004262 >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004263 Decimal('1.20E+6')
Mark Dickinson84230a12010-02-18 14:49:50 +00004264 >>> ExtendedContext.divide(5, 5)
4265 Decimal('1')
4266 >>> ExtendedContext.divide(Decimal(5), 5)
4267 Decimal('1')
4268 >>> ExtendedContext.divide(5, Decimal(5))
4269 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004270 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004271 a = _convert_other(a, raiseit=True)
4272 r = a.__truediv__(b, context=self)
4273 if r is NotImplemented:
4274 raise TypeError("Unable to convert %s to Decimal" % b)
4275 else:
4276 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004277
4278 def divide_int(self, a, b):
4279 """Divides two numbers and returns the integer part of the result.
4280
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004281 >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004282 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004283 >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004284 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004285 >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004286 Decimal('3')
Mark Dickinson84230a12010-02-18 14:49:50 +00004287 >>> ExtendedContext.divide_int(10, 3)
4288 Decimal('3')
4289 >>> ExtendedContext.divide_int(Decimal(10), 3)
4290 Decimal('3')
4291 >>> ExtendedContext.divide_int(10, Decimal(3))
4292 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004293 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004294 a = _convert_other(a, raiseit=True)
4295 r = a.__floordiv__(b, context=self)
4296 if r is NotImplemented:
4297 raise TypeError("Unable to convert %s to Decimal" % b)
4298 else:
4299 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004300
4301 def divmod(self, a, b):
Mark Dickinson84230a12010-02-18 14:49:50 +00004302 """Return (a // b, a % b).
Mark Dickinsonc53796e2010-01-06 16:22:15 +00004303
4304 >>> ExtendedContext.divmod(Decimal(8), Decimal(3))
4305 (Decimal('2'), Decimal('2'))
4306 >>> ExtendedContext.divmod(Decimal(8), Decimal(4))
4307 (Decimal('2'), Decimal('0'))
Mark Dickinson84230a12010-02-18 14:49:50 +00004308 >>> ExtendedContext.divmod(8, 4)
4309 (Decimal('2'), Decimal('0'))
4310 >>> ExtendedContext.divmod(Decimal(8), 4)
4311 (Decimal('2'), Decimal('0'))
4312 >>> ExtendedContext.divmod(8, Decimal(4))
4313 (Decimal('2'), Decimal('0'))
Mark Dickinsonc53796e2010-01-06 16:22:15 +00004314 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004315 a = _convert_other(a, raiseit=True)
4316 r = a.__divmod__(b, context=self)
4317 if r is NotImplemented:
4318 raise TypeError("Unable to convert %s to Decimal" % b)
4319 else:
4320 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004321
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004322 def exp(self, a):
4323 """Returns e ** a.
4324
4325 >>> c = ExtendedContext.copy()
4326 >>> c.Emin = -999
4327 >>> c.Emax = 999
4328 >>> c.exp(Decimal('-Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004329 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004330 >>> c.exp(Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004331 Decimal('0.367879441')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004332 >>> c.exp(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004333 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004334 >>> c.exp(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004335 Decimal('2.71828183')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004336 >>> c.exp(Decimal('0.693147181'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004337 Decimal('2.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004338 >>> c.exp(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004339 Decimal('Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004340 >>> c.exp(10)
4341 Decimal('22026.4658')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004342 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004343 a =_convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004344 return a.exp(context=self)
4345
4346 def fma(self, a, b, c):
4347 """Returns a multiplied by b, plus c.
4348
4349 The first two operands are multiplied together, using multiply,
4350 the third operand is then added to the result of that
4351 multiplication, using add, all with only one final rounding.
4352
4353 >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004354 Decimal('22')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004355 >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004356 Decimal('-8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004357 >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004358 Decimal('1.38435736E+12')
Mark Dickinson84230a12010-02-18 14:49:50 +00004359 >>> ExtendedContext.fma(1, 3, 4)
4360 Decimal('7')
4361 >>> ExtendedContext.fma(1, Decimal(3), 4)
4362 Decimal('7')
4363 >>> ExtendedContext.fma(1, 3, Decimal(4))
4364 Decimal('7')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004365 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004366 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004367 return a.fma(b, c, context=self)
4368
4369 def is_canonical(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004370 """Return True if the operand is canonical; otherwise return False.
4371
4372 Currently, the encoding of a Decimal instance is always
4373 canonical, so this method returns True for any Decimal.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004374
4375 >>> ExtendedContext.is_canonical(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004376 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004377 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004378 return a.is_canonical()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004379
4380 def is_finite(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004381 """Return True if the operand is finite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004382
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004383 A Decimal instance is considered finite if it is neither
4384 infinite nor a NaN.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004385
4386 >>> ExtendedContext.is_finite(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004387 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004388 >>> ExtendedContext.is_finite(Decimal('-0.3'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004389 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004390 >>> ExtendedContext.is_finite(Decimal('0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004391 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004392 >>> ExtendedContext.is_finite(Decimal('Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004393 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004394 >>> ExtendedContext.is_finite(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004395 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004396 >>> ExtendedContext.is_finite(1)
4397 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004398 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004399 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004400 return a.is_finite()
4401
4402 def is_infinite(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004403 """Return True if the operand is infinite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004404
4405 >>> ExtendedContext.is_infinite(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004406 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004407 >>> ExtendedContext.is_infinite(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004408 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004409 >>> ExtendedContext.is_infinite(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004410 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004411 >>> ExtendedContext.is_infinite(1)
4412 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004413 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004414 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004415 return a.is_infinite()
4416
4417 def is_nan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004418 """Return True if the operand is a qNaN or sNaN;
4419 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004420
4421 >>> ExtendedContext.is_nan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004422 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004423 >>> ExtendedContext.is_nan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004424 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004425 >>> ExtendedContext.is_nan(Decimal('-sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004426 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004427 >>> ExtendedContext.is_nan(1)
4428 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004429 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004430 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004431 return a.is_nan()
4432
4433 def is_normal(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004434 """Return True if the operand is a normal number;
4435 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004436
4437 >>> c = ExtendedContext.copy()
4438 >>> c.Emin = -999
4439 >>> c.Emax = 999
4440 >>> c.is_normal(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004441 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004442 >>> c.is_normal(Decimal('0.1E-999'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004443 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004444 >>> c.is_normal(Decimal('0.00'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004445 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004446 >>> c.is_normal(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004447 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004448 >>> c.is_normal(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004449 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004450 >>> c.is_normal(1)
4451 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004452 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004453 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004454 return a.is_normal(context=self)
4455
4456 def is_qnan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004457 """Return True if the operand is a quiet NaN; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004458
4459 >>> ExtendedContext.is_qnan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004460 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004461 >>> ExtendedContext.is_qnan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004462 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004463 >>> ExtendedContext.is_qnan(Decimal('sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004464 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004465 >>> ExtendedContext.is_qnan(1)
4466 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004467 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004468 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004469 return a.is_qnan()
4470
4471 def is_signed(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004472 """Return True if the operand is negative; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004473
4474 >>> ExtendedContext.is_signed(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004475 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004476 >>> ExtendedContext.is_signed(Decimal('-12'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004477 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004478 >>> ExtendedContext.is_signed(Decimal('-0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004479 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004480 >>> ExtendedContext.is_signed(8)
4481 False
4482 >>> ExtendedContext.is_signed(-8)
4483 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004484 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004485 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004486 return a.is_signed()
4487
4488 def is_snan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004489 """Return True if the operand is a signaling NaN;
4490 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004491
4492 >>> ExtendedContext.is_snan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004493 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004494 >>> ExtendedContext.is_snan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004495 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004496 >>> ExtendedContext.is_snan(Decimal('sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004497 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004498 >>> ExtendedContext.is_snan(1)
4499 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004500 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004501 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004502 return a.is_snan()
4503
4504 def is_subnormal(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004505 """Return True if the operand is subnormal; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004506
4507 >>> c = ExtendedContext.copy()
4508 >>> c.Emin = -999
4509 >>> c.Emax = 999
4510 >>> c.is_subnormal(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004511 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004512 >>> c.is_subnormal(Decimal('0.1E-999'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004513 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004514 >>> c.is_subnormal(Decimal('0.00'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004515 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004516 >>> c.is_subnormal(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004517 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004518 >>> c.is_subnormal(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004519 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004520 >>> c.is_subnormal(1)
4521 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004522 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004523 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004524 return a.is_subnormal(context=self)
4525
4526 def is_zero(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004527 """Return True if the operand is a zero; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004528
4529 >>> ExtendedContext.is_zero(Decimal('0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004530 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004531 >>> ExtendedContext.is_zero(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004532 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004533 >>> ExtendedContext.is_zero(Decimal('-0E+2'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004534 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004535 >>> ExtendedContext.is_zero(1)
4536 False
4537 >>> ExtendedContext.is_zero(0)
4538 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004539 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004540 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004541 return a.is_zero()
4542
4543 def ln(self, a):
4544 """Returns the natural (base e) logarithm of the operand.
4545
4546 >>> c = ExtendedContext.copy()
4547 >>> c.Emin = -999
4548 >>> c.Emax = 999
4549 >>> c.ln(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004550 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004551 >>> c.ln(Decimal('1.000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004552 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004553 >>> c.ln(Decimal('2.71828183'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004554 Decimal('1.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004555 >>> c.ln(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004556 Decimal('2.30258509')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004557 >>> c.ln(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004558 Decimal('Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004559 >>> c.ln(1)
4560 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004561 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004562 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004563 return a.ln(context=self)
4564
4565 def log10(self, a):
4566 """Returns the base 10 logarithm of the operand.
4567
4568 >>> c = ExtendedContext.copy()
4569 >>> c.Emin = -999
4570 >>> c.Emax = 999
4571 >>> c.log10(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004572 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004573 >>> c.log10(Decimal('0.001'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004574 Decimal('-3')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004575 >>> c.log10(Decimal('1.000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004576 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004577 >>> c.log10(Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004578 Decimal('0.301029996')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004579 >>> c.log10(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004580 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004581 >>> c.log10(Decimal('70'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004582 Decimal('1.84509804')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004583 >>> c.log10(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004584 Decimal('Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004585 >>> c.log10(0)
4586 Decimal('-Infinity')
4587 >>> c.log10(1)
4588 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004589 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004590 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004591 return a.log10(context=self)
4592
4593 def logb(self, a):
4594 """ Returns the exponent of the magnitude of the operand's MSD.
4595
4596 The result is the integer which is the exponent of the magnitude
4597 of the most significant digit of the operand (as though the
4598 operand were truncated to a single digit while maintaining the
4599 value of that digit and without limiting the resulting exponent).
4600
4601 >>> ExtendedContext.logb(Decimal('250'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004602 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004603 >>> ExtendedContext.logb(Decimal('2.50'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004604 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004605 >>> ExtendedContext.logb(Decimal('0.03'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004606 Decimal('-2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004607 >>> ExtendedContext.logb(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004608 Decimal('-Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004609 >>> ExtendedContext.logb(1)
4610 Decimal('0')
4611 >>> ExtendedContext.logb(10)
4612 Decimal('1')
4613 >>> ExtendedContext.logb(100)
4614 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004615 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004616 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004617 return a.logb(context=self)
4618
4619 def logical_and(self, a, b):
4620 """Applies the logical operation 'and' between each operand's digits.
4621
4622 The operands must be both logical numbers.
4623
4624 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004625 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004626 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004627 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004628 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004629 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004630 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004631 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004632 >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004633 Decimal('1000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004634 >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004635 Decimal('10')
Mark Dickinson84230a12010-02-18 14:49:50 +00004636 >>> ExtendedContext.logical_and(110, 1101)
4637 Decimal('100')
4638 >>> ExtendedContext.logical_and(Decimal(110), 1101)
4639 Decimal('100')
4640 >>> ExtendedContext.logical_and(110, Decimal(1101))
4641 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004642 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004643 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004644 return a.logical_and(b, context=self)
4645
4646 def logical_invert(self, a):
4647 """Invert all the digits in the operand.
4648
4649 The operand must be a logical number.
4650
4651 >>> ExtendedContext.logical_invert(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004652 Decimal('111111111')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004653 >>> ExtendedContext.logical_invert(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004654 Decimal('111111110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004655 >>> ExtendedContext.logical_invert(Decimal('111111111'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004656 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004657 >>> ExtendedContext.logical_invert(Decimal('101010101'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004658 Decimal('10101010')
Mark Dickinson84230a12010-02-18 14:49:50 +00004659 >>> ExtendedContext.logical_invert(1101)
4660 Decimal('111110010')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004661 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004662 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004663 return a.logical_invert(context=self)
4664
4665 def logical_or(self, a, b):
4666 """Applies the logical operation 'or' between each operand's digits.
4667
4668 The operands must be both logical numbers.
4669
4670 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004671 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004672 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004673 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004674 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004675 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004676 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004677 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004678 >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004679 Decimal('1110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004680 >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004681 Decimal('1110')
Mark Dickinson84230a12010-02-18 14:49:50 +00004682 >>> ExtendedContext.logical_or(110, 1101)
4683 Decimal('1111')
4684 >>> ExtendedContext.logical_or(Decimal(110), 1101)
4685 Decimal('1111')
4686 >>> ExtendedContext.logical_or(110, Decimal(1101))
4687 Decimal('1111')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004688 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004689 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004690 return a.logical_or(b, context=self)
4691
4692 def logical_xor(self, a, b):
4693 """Applies the logical operation 'xor' between each operand's digits.
4694
4695 The operands must be both logical numbers.
4696
4697 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004698 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004699 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004700 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004701 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004702 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004703 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004704 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004705 >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004706 Decimal('110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004707 >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004708 Decimal('1101')
Mark Dickinson84230a12010-02-18 14:49:50 +00004709 >>> ExtendedContext.logical_xor(110, 1101)
4710 Decimal('1011')
4711 >>> ExtendedContext.logical_xor(Decimal(110), 1101)
4712 Decimal('1011')
4713 >>> ExtendedContext.logical_xor(110, Decimal(1101))
4714 Decimal('1011')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004715 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004716 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004717 return a.logical_xor(b, context=self)
4718
Mark Dickinson84230a12010-02-18 14:49:50 +00004719 def max(self, a, b):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004720 """max compares two values numerically and returns the maximum.
4721
4722 If either operand is a NaN then the general rules apply.
Christian Heimes679db4a2008-01-18 09:56:22 +00004723 Otherwise, the operands are compared as though by the compare
Guido van Rossumd8faa362007-04-27 19:54:29 +00004724 operation. If they are numerically equal then the left-hand operand
4725 is chosen as the result. Otherwise the maximum (closer to positive
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004726 infinity) of the two operands is chosen as the result.
4727
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004728 >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004729 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004730 >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004731 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004732 >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004733 Decimal('1')
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004734 >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004735 Decimal('7')
Mark Dickinson84230a12010-02-18 14:49:50 +00004736 >>> ExtendedContext.max(1, 2)
4737 Decimal('2')
4738 >>> ExtendedContext.max(Decimal(1), 2)
4739 Decimal('2')
4740 >>> ExtendedContext.max(1, Decimal(2))
4741 Decimal('2')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004742 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004743 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004744 return a.max(b, context=self)
4745
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004746 def max_mag(self, a, b):
Mark Dickinson84230a12010-02-18 14:49:50 +00004747 """Compares the values numerically with their sign ignored.
4748
4749 >>> ExtendedContext.max_mag(Decimal('7'), Decimal('NaN'))
4750 Decimal('7')
4751 >>> ExtendedContext.max_mag(Decimal('7'), Decimal('-10'))
4752 Decimal('-10')
4753 >>> ExtendedContext.max_mag(1, -2)
4754 Decimal('-2')
4755 >>> ExtendedContext.max_mag(Decimal(1), -2)
4756 Decimal('-2')
4757 >>> ExtendedContext.max_mag(1, Decimal(-2))
4758 Decimal('-2')
4759 """
4760 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004761 return a.max_mag(b, context=self)
4762
Mark Dickinson84230a12010-02-18 14:49:50 +00004763 def min(self, a, b):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004764 """min compares two values numerically and returns the minimum.
4765
4766 If either operand is a NaN then the general rules apply.
Christian Heimes679db4a2008-01-18 09:56:22 +00004767 Otherwise, the operands are compared as though by the compare
Guido van Rossumd8faa362007-04-27 19:54:29 +00004768 operation. If they are numerically equal then the left-hand operand
4769 is chosen as the result. Otherwise the minimum (closer to negative
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004770 infinity) of the two operands is chosen as the result.
4771
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004772 >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004773 Decimal('2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004774 >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004775 Decimal('-10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004776 >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004777 Decimal('1.0')
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004778 >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004779 Decimal('7')
Mark Dickinson84230a12010-02-18 14:49:50 +00004780 >>> ExtendedContext.min(1, 2)
4781 Decimal('1')
4782 >>> ExtendedContext.min(Decimal(1), 2)
4783 Decimal('1')
4784 >>> ExtendedContext.min(1, Decimal(29))
4785 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004786 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004787 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004788 return a.min(b, context=self)
4789
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004790 def min_mag(self, a, b):
Mark Dickinson84230a12010-02-18 14:49:50 +00004791 """Compares the values numerically with their sign ignored.
4792
4793 >>> ExtendedContext.min_mag(Decimal('3'), Decimal('-2'))
4794 Decimal('-2')
4795 >>> ExtendedContext.min_mag(Decimal('-3'), Decimal('NaN'))
4796 Decimal('-3')
4797 >>> ExtendedContext.min_mag(1, -2)
4798 Decimal('1')
4799 >>> ExtendedContext.min_mag(Decimal(1), -2)
4800 Decimal('1')
4801 >>> ExtendedContext.min_mag(1, Decimal(-2))
4802 Decimal('1')
4803 """
4804 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004805 return a.min_mag(b, context=self)
4806
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004807 def minus(self, a):
4808 """Minus corresponds to unary prefix minus in Python.
4809
4810 The operation is evaluated using the same rules as subtract; the
4811 operation minus(a) is calculated as subtract('0', a) where the '0'
4812 has the same exponent as the operand.
4813
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004814 >>> ExtendedContext.minus(Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004815 Decimal('-1.3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004816 >>> ExtendedContext.minus(Decimal('-1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004817 Decimal('1.3')
Mark Dickinson84230a12010-02-18 14:49:50 +00004818 >>> ExtendedContext.minus(1)
4819 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004820 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004821 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004822 return a.__neg__(context=self)
4823
4824 def multiply(self, a, b):
4825 """multiply multiplies two operands.
4826
4827 If either operand is a special value then the general rules apply.
Mark Dickinson84230a12010-02-18 14:49:50 +00004828 Otherwise, the operands are multiplied together
4829 ('long multiplication'), resulting in a number which may be as long as
4830 the sum of the lengths of the two operands.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004831
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004832 >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004833 Decimal('3.60')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004834 >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004835 Decimal('21')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004836 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004837 Decimal('0.72')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004838 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004839 Decimal('-0.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004840 >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004841 Decimal('4.28135971E+11')
Mark Dickinson84230a12010-02-18 14:49:50 +00004842 >>> ExtendedContext.multiply(7, 7)
4843 Decimal('49')
4844 >>> ExtendedContext.multiply(Decimal(7), 7)
4845 Decimal('49')
4846 >>> ExtendedContext.multiply(7, Decimal(7))
4847 Decimal('49')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004848 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004849 a = _convert_other(a, raiseit=True)
4850 r = a.__mul__(b, context=self)
4851 if r is NotImplemented:
4852 raise TypeError("Unable to convert %s to Decimal" % b)
4853 else:
4854 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004855
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004856 def next_minus(self, a):
4857 """Returns the largest representable number smaller than a.
4858
4859 >>> c = ExtendedContext.copy()
4860 >>> c.Emin = -999
4861 >>> c.Emax = 999
4862 >>> ExtendedContext.next_minus(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004863 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004864 >>> c.next_minus(Decimal('1E-1007'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004865 Decimal('0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004866 >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004867 Decimal('-1.00000004')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004868 >>> c.next_minus(Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004869 Decimal('9.99999999E+999')
Mark Dickinson84230a12010-02-18 14:49:50 +00004870 >>> c.next_minus(1)
4871 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004872 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004873 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004874 return a.next_minus(context=self)
4875
4876 def next_plus(self, a):
4877 """Returns the smallest representable number larger than a.
4878
4879 >>> c = ExtendedContext.copy()
4880 >>> c.Emin = -999
4881 >>> c.Emax = 999
4882 >>> ExtendedContext.next_plus(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004883 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004884 >>> c.next_plus(Decimal('-1E-1007'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004885 Decimal('-0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004886 >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004887 Decimal('-1.00000002')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004888 >>> c.next_plus(Decimal('-Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004889 Decimal('-9.99999999E+999')
Mark Dickinson84230a12010-02-18 14:49:50 +00004890 >>> c.next_plus(1)
4891 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004892 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004893 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004894 return a.next_plus(context=self)
4895
4896 def next_toward(self, a, b):
4897 """Returns the number closest to a, in direction towards b.
4898
4899 The result is the closest representable number from the first
4900 operand (but not the first operand) that is in the direction
4901 towards the second operand, unless the operands have the same
4902 value.
4903
4904 >>> c = ExtendedContext.copy()
4905 >>> c.Emin = -999
4906 >>> c.Emax = 999
4907 >>> c.next_toward(Decimal('1'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004908 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004909 >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004910 Decimal('-0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004911 >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004912 Decimal('-1.00000002')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004913 >>> c.next_toward(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004914 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004915 >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004916 Decimal('0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004917 >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004918 Decimal('-1.00000004')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004919 >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004920 Decimal('-0.00')
Mark Dickinson84230a12010-02-18 14:49:50 +00004921 >>> c.next_toward(0, 1)
4922 Decimal('1E-1007')
4923 >>> c.next_toward(Decimal(0), 1)
4924 Decimal('1E-1007')
4925 >>> c.next_toward(0, Decimal(1))
4926 Decimal('1E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004927 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004928 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004929 return a.next_toward(b, context=self)
4930
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004931 def normalize(self, a):
Raymond Hettingere0f15812004-07-05 05:36:39 +00004932 """normalize reduces an operand to its simplest form.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004933
4934 Essentially a plus operation with all trailing zeros removed from the
4935 result.
4936
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004937 >>> ExtendedContext.normalize(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004938 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004939 >>> ExtendedContext.normalize(Decimal('-2.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004940 Decimal('-2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004941 >>> ExtendedContext.normalize(Decimal('1.200'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004942 Decimal('1.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004943 >>> ExtendedContext.normalize(Decimal('-120'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004944 Decimal('-1.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004945 >>> ExtendedContext.normalize(Decimal('120.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004946 Decimal('1.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004947 >>> ExtendedContext.normalize(Decimal('0.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004948 Decimal('0')
Mark Dickinson84230a12010-02-18 14:49:50 +00004949 >>> ExtendedContext.normalize(6)
4950 Decimal('6')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004951 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004952 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004953 return a.normalize(context=self)
4954
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004955 def number_class(self, a):
4956 """Returns an indication of the class of the operand.
4957
4958 The class is one of the following strings:
4959 -sNaN
4960 -NaN
4961 -Infinity
4962 -Normal
4963 -Subnormal
4964 -Zero
4965 +Zero
4966 +Subnormal
4967 +Normal
4968 +Infinity
4969
4970 >>> c = Context(ExtendedContext)
4971 >>> c.Emin = -999
4972 >>> c.Emax = 999
4973 >>> c.number_class(Decimal('Infinity'))
4974 '+Infinity'
4975 >>> c.number_class(Decimal('1E-10'))
4976 '+Normal'
4977 >>> c.number_class(Decimal('2.50'))
4978 '+Normal'
4979 >>> c.number_class(Decimal('0.1E-999'))
4980 '+Subnormal'
4981 >>> c.number_class(Decimal('0'))
4982 '+Zero'
4983 >>> c.number_class(Decimal('-0'))
4984 '-Zero'
4985 >>> c.number_class(Decimal('-0.1E-999'))
4986 '-Subnormal'
4987 >>> c.number_class(Decimal('-1E-10'))
4988 '-Normal'
4989 >>> c.number_class(Decimal('-2.50'))
4990 '-Normal'
4991 >>> c.number_class(Decimal('-Infinity'))
4992 '-Infinity'
4993 >>> c.number_class(Decimal('NaN'))
4994 'NaN'
4995 >>> c.number_class(Decimal('-NaN'))
4996 'NaN'
4997 >>> c.number_class(Decimal('sNaN'))
4998 'sNaN'
Mark Dickinson84230a12010-02-18 14:49:50 +00004999 >>> c.number_class(123)
5000 '+Normal'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005001 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005002 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005003 return a.number_class(context=self)
5004
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005005 def plus(self, a):
5006 """Plus corresponds to unary prefix plus in Python.
5007
5008 The operation is evaluated using the same rules as add; the
5009 operation plus(a) is calculated as add('0', a) where the '0'
5010 has the same exponent as the operand.
5011
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005012 >>> ExtendedContext.plus(Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005013 Decimal('1.3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005014 >>> ExtendedContext.plus(Decimal('-1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005015 Decimal('-1.3')
Mark Dickinson84230a12010-02-18 14:49:50 +00005016 >>> ExtendedContext.plus(-1)
5017 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005018 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005019 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005020 return a.__pos__(context=self)
5021
5022 def power(self, a, b, modulo=None):
5023 """Raises a to the power of b, to modulo if given.
5024
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005025 With two arguments, compute a**b. If a is negative then b
5026 must be integral. The result will be inexact unless b is
5027 integral and the result is finite and can be expressed exactly
5028 in 'precision' digits.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005029
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005030 With three arguments, compute (a**b) % modulo. For the
5031 three argument form, the following restrictions on the
5032 arguments hold:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005033
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005034 - all three arguments must be integral
5035 - b must be nonnegative
5036 - at least one of a or b must be nonzero
5037 - modulo must be nonzero and have at most 'precision' digits
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005038
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005039 The result of pow(a, b, modulo) is identical to the result
5040 that would be obtained by computing (a**b) % modulo with
5041 unbounded precision, but is computed more efficiently. It is
5042 always exact.
5043
5044 >>> c = ExtendedContext.copy()
5045 >>> c.Emin = -999
5046 >>> c.Emax = 999
5047 >>> c.power(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005048 Decimal('8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005049 >>> c.power(Decimal('-2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005050 Decimal('-8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005051 >>> c.power(Decimal('2'), Decimal('-3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005052 Decimal('0.125')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005053 >>> c.power(Decimal('1.7'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005054 Decimal('69.7575744')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005055 >>> c.power(Decimal('10'), Decimal('0.301029996'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005056 Decimal('2.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005057 >>> c.power(Decimal('Infinity'), Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005058 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005059 >>> c.power(Decimal('Infinity'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005060 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005061 >>> c.power(Decimal('Infinity'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005062 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005063 >>> c.power(Decimal('-Infinity'), Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005064 Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005065 >>> c.power(Decimal('-Infinity'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005066 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005067 >>> c.power(Decimal('-Infinity'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005068 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005069 >>> c.power(Decimal('-Infinity'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005070 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005071 >>> c.power(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005072 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005073
5074 >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005075 Decimal('11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005076 >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005077 Decimal('-11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005078 >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005079 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005080 >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005081 Decimal('11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005082 >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005083 Decimal('11729830')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005084 >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005085 Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005086 >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005087 Decimal('1')
Mark Dickinson84230a12010-02-18 14:49:50 +00005088 >>> ExtendedContext.power(7, 7)
5089 Decimal('823543')
5090 >>> ExtendedContext.power(Decimal(7), 7)
5091 Decimal('823543')
5092 >>> ExtendedContext.power(7, Decimal(7), 2)
5093 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005094 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005095 a = _convert_other(a, raiseit=True)
5096 r = a.__pow__(b, modulo, context=self)
5097 if r is NotImplemented:
5098 raise TypeError("Unable to convert %s to Decimal" % b)
5099 else:
5100 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005101
5102 def quantize(self, a, b):
Guido van Rossumd8faa362007-04-27 19:54:29 +00005103 """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005104
5105 The coefficient of the result is derived from that of the left-hand
Guido van Rossumd8faa362007-04-27 19:54:29 +00005106 operand. It may be rounded using the current rounding setting (if the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005107 exponent is being increased), multiplied by a positive power of ten (if
5108 the exponent is being decreased), or is unchanged (if the exponent is
5109 already equal to that of the right-hand operand).
5110
5111 Unlike other operations, if the length of the coefficient after the
5112 quantize operation would be greater than precision then an Invalid
Guido van Rossumd8faa362007-04-27 19:54:29 +00005113 operation condition is raised. This guarantees that, unless there is
5114 an error condition, the exponent of the result of a quantize is always
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005115 equal to that of the right-hand operand.
5116
5117 Also unlike other operations, quantize will never raise Underflow, even
5118 if the result is subnormal and inexact.
5119
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005120 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005121 Decimal('2.170')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005122 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005123 Decimal('2.17')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005124 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005125 Decimal('2.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005126 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005127 Decimal('2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005128 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005129 Decimal('0E+1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005130 >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005131 Decimal('-Infinity')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005132 >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005133 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005134 >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005135 Decimal('-0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005136 >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005137 Decimal('-0E+5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005138 >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005139 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005140 >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005141 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005142 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005143 Decimal('217.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005144 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005145 Decimal('217')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005146 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005147 Decimal('2.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005148 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005149 Decimal('2E+2')
Mark Dickinson84230a12010-02-18 14:49:50 +00005150 >>> ExtendedContext.quantize(1, 2)
5151 Decimal('1')
5152 >>> ExtendedContext.quantize(Decimal(1), 2)
5153 Decimal('1')
5154 >>> ExtendedContext.quantize(1, Decimal(2))
5155 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005156 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005157 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005158 return a.quantize(b, context=self)
5159
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005160 def radix(self):
5161 """Just returns 10, as this is Decimal, :)
5162
5163 >>> ExtendedContext.radix()
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005164 Decimal('10')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005165 """
5166 return Decimal(10)
5167
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005168 def remainder(self, a, b):
5169 """Returns the remainder from integer division.
5170
5171 The result is the residue of the dividend after the operation of
Guido van Rossumd8faa362007-04-27 19:54:29 +00005172 calculating integer division as described for divide-integer, rounded
5173 to precision digits if necessary. The sign of the result, if
5174 non-zero, is the same as that of the original dividend.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005175
5176 This operation will fail under the same conditions as integer division
5177 (that is, if integer division on the same two operands would fail, the
5178 remainder cannot be calculated).
5179
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005180 >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005181 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005182 >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005183 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005184 >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005185 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005186 >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005187 Decimal('0.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005188 >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005189 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005190 >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005191 Decimal('1.0')
Mark Dickinson84230a12010-02-18 14:49:50 +00005192 >>> ExtendedContext.remainder(22, 6)
5193 Decimal('4')
5194 >>> ExtendedContext.remainder(Decimal(22), 6)
5195 Decimal('4')
5196 >>> ExtendedContext.remainder(22, Decimal(6))
5197 Decimal('4')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005198 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005199 a = _convert_other(a, raiseit=True)
5200 r = a.__mod__(b, context=self)
5201 if r is NotImplemented:
5202 raise TypeError("Unable to convert %s to Decimal" % b)
5203 else:
5204 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005205
5206 def remainder_near(self, a, b):
5207 """Returns to be "a - b * n", where n is the integer nearest the exact
5208 value of "x / b" (if two integers are equally near then the even one
Guido van Rossumd8faa362007-04-27 19:54:29 +00005209 is chosen). If the result is equal to 0 then its sign will be the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005210 sign of a.
5211
5212 This operation will fail under the same conditions as integer division
5213 (that is, if integer division on the same two operands would fail, the
5214 remainder cannot be calculated).
5215
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005216 >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005217 Decimal('-0.9')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005218 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005219 Decimal('-2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005220 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005221 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005222 >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005223 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005224 >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005225 Decimal('0.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005226 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005227 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005228 >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005229 Decimal('-0.3')
Mark Dickinson84230a12010-02-18 14:49:50 +00005230 >>> ExtendedContext.remainder_near(3, 11)
5231 Decimal('3')
5232 >>> ExtendedContext.remainder_near(Decimal(3), 11)
5233 Decimal('3')
5234 >>> ExtendedContext.remainder_near(3, Decimal(11))
5235 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005236 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005237 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005238 return a.remainder_near(b, context=self)
5239
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005240 def rotate(self, a, b):
5241 """Returns a rotated copy of a, b times.
5242
5243 The coefficient of the result is a rotated copy of the digits in
5244 the coefficient of the first operand. The number of places of
5245 rotation is taken from the absolute value of the second operand,
5246 with the rotation being to the left if the second operand is
5247 positive or to the right otherwise.
5248
5249 >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005250 Decimal('400000003')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005251 >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005252 Decimal('12')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005253 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005254 Decimal('891234567')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005255 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005256 Decimal('123456789')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005257 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005258 Decimal('345678912')
Mark Dickinson84230a12010-02-18 14:49:50 +00005259 >>> ExtendedContext.rotate(1333333, 1)
5260 Decimal('13333330')
5261 >>> ExtendedContext.rotate(Decimal(1333333), 1)
5262 Decimal('13333330')
5263 >>> ExtendedContext.rotate(1333333, Decimal(1))
5264 Decimal('13333330')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005265 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005266 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005267 return a.rotate(b, context=self)
5268
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005269 def same_quantum(self, a, b):
5270 """Returns True if the two operands have the same exponent.
5271
5272 The result is never affected by either the sign or the coefficient of
5273 either operand.
5274
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005275 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005276 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005277 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005278 True
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005279 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005280 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005281 >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005282 True
Mark Dickinson84230a12010-02-18 14:49:50 +00005283 >>> ExtendedContext.same_quantum(10000, -1)
5284 True
5285 >>> ExtendedContext.same_quantum(Decimal(10000), -1)
5286 True
5287 >>> ExtendedContext.same_quantum(10000, Decimal(-1))
5288 True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005289 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005290 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005291 return a.same_quantum(b)
5292
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005293 def scaleb (self, a, b):
5294 """Returns the first operand after adding the second value its exp.
5295
5296 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005297 Decimal('0.0750')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005298 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005299 Decimal('7.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005300 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005301 Decimal('7.50E+3')
Mark Dickinson84230a12010-02-18 14:49:50 +00005302 >>> ExtendedContext.scaleb(1, 4)
5303 Decimal('1E+4')
5304 >>> ExtendedContext.scaleb(Decimal(1), 4)
5305 Decimal('1E+4')
5306 >>> ExtendedContext.scaleb(1, Decimal(4))
5307 Decimal('1E+4')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005308 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005309 a = _convert_other(a, raiseit=True)
5310 return a.scaleb(b, context=self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005311
5312 def shift(self, a, b):
5313 """Returns a shifted copy of a, b times.
5314
5315 The coefficient of the result is a shifted copy of the digits
5316 in the coefficient of the first operand. The number of places
5317 to shift is taken from the absolute value of the second operand,
5318 with the shift being to the left if the second operand is
5319 positive or to the right otherwise. Digits shifted into the
5320 coefficient are zeros.
5321
5322 >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005323 Decimal('400000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005324 >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005325 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005326 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005327 Decimal('1234567')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005328 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005329 Decimal('123456789')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005330 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005331 Decimal('345678900')
Mark Dickinson84230a12010-02-18 14:49:50 +00005332 >>> ExtendedContext.shift(88888888, 2)
5333 Decimal('888888800')
5334 >>> ExtendedContext.shift(Decimal(88888888), 2)
5335 Decimal('888888800')
5336 >>> ExtendedContext.shift(88888888, Decimal(2))
5337 Decimal('888888800')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005338 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005339 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005340 return a.shift(b, context=self)
5341
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005342 def sqrt(self, a):
Guido van Rossumd8faa362007-04-27 19:54:29 +00005343 """Square root of a non-negative number to context precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005344
5345 If the result must be inexact, it is rounded using the round-half-even
5346 algorithm.
5347
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005348 >>> ExtendedContext.sqrt(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005349 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005350 >>> ExtendedContext.sqrt(Decimal('-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005351 Decimal('-0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005352 >>> ExtendedContext.sqrt(Decimal('0.39'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005353 Decimal('0.624499800')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005354 >>> ExtendedContext.sqrt(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005355 Decimal('10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005356 >>> ExtendedContext.sqrt(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005357 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005358 >>> ExtendedContext.sqrt(Decimal('1.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005359 Decimal('1.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005360 >>> ExtendedContext.sqrt(Decimal('1.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005361 Decimal('1.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005362 >>> ExtendedContext.sqrt(Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005363 Decimal('2.64575131')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005364 >>> ExtendedContext.sqrt(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005365 Decimal('3.16227766')
Mark Dickinson84230a12010-02-18 14:49:50 +00005366 >>> ExtendedContext.sqrt(2)
5367 Decimal('1.41421356')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005368 >>> ExtendedContext.prec
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005369 9
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005370 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005371 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005372 return a.sqrt(context=self)
5373
5374 def subtract(self, a, b):
Georg Brandlf33d01d2005-08-22 19:35:18 +00005375 """Return the difference between the two operands.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005376
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005377 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005378 Decimal('0.23')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005379 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005380 Decimal('0.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005381 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005382 Decimal('-0.77')
Mark Dickinson84230a12010-02-18 14:49:50 +00005383 >>> ExtendedContext.subtract(8, 5)
5384 Decimal('3')
5385 >>> ExtendedContext.subtract(Decimal(8), 5)
5386 Decimal('3')
5387 >>> ExtendedContext.subtract(8, Decimal(5))
5388 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005389 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005390 a = _convert_other(a, raiseit=True)
5391 r = a.__sub__(b, context=self)
5392 if r is NotImplemented:
5393 raise TypeError("Unable to convert %s to Decimal" % b)
5394 else:
5395 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005396
5397 def to_eng_string(self, a):
5398 """Converts a number to a string, using scientific notation.
5399
5400 The operation is not affected by the context.
5401 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005402 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005403 return a.to_eng_string(context=self)
5404
5405 def to_sci_string(self, a):
5406 """Converts a number to a string, using scientific notation.
5407
5408 The operation is not affected by the context.
5409 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005410 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005411 return a.__str__(context=self)
5412
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005413 def to_integral_exact(self, a):
5414 """Rounds to an integer.
5415
5416 When the operand has a negative exponent, the result is the same
5417 as using the quantize() operation using the given operand as the
5418 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
5419 of the operand as the precision setting; Inexact and Rounded flags
5420 are allowed in this operation. The rounding mode is taken from the
5421 context.
5422
5423 >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005424 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005425 >>> ExtendedContext.to_integral_exact(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005426 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005427 >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005428 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005429 >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005430 Decimal('102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005431 >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005432 Decimal('-102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005433 >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005434 Decimal('1.0E+6')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005435 >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005436 Decimal('7.89E+77')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005437 >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005438 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005439 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005440 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005441 return a.to_integral_exact(context=self)
5442
5443 def to_integral_value(self, a):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005444 """Rounds to an integer.
5445
5446 When the operand has a negative exponent, the result is the same
5447 as using the quantize() operation using the given operand as the
5448 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
5449 of the operand as the precision setting, except that no flags will
Guido van Rossumd8faa362007-04-27 19:54:29 +00005450 be set. The rounding mode is taken from the context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005451
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005452 >>> ExtendedContext.to_integral_value(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005453 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005454 >>> ExtendedContext.to_integral_value(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005455 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005456 >>> ExtendedContext.to_integral_value(Decimal('100.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005457 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005458 >>> ExtendedContext.to_integral_value(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005459 Decimal('102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005460 >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005461 Decimal('-102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005462 >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005463 Decimal('1.0E+6')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005464 >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005465 Decimal('7.89E+77')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005466 >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005467 Decimal('-Infinity')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005468 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005469 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005470 return a.to_integral_value(context=self)
5471
5472 # the method name changed, but we provide also the old one, for compatibility
5473 to_integral = to_integral_value
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005474
5475class _WorkRep(object):
5476 __slots__ = ('sign','int','exp')
Raymond Hettinger17931de2004-10-27 06:21:46 +00005477 # sign: 0 or 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005478 # int: int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005479 # exp: None, int, or string
5480
5481 def __init__(self, value=None):
5482 if value is None:
5483 self.sign = None
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005484 self.int = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005485 self.exp = None
Raymond Hettinger17931de2004-10-27 06:21:46 +00005486 elif isinstance(value, Decimal):
5487 self.sign = value._sign
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005488 self.int = int(value._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005489 self.exp = value._exp
Raymond Hettinger17931de2004-10-27 06:21:46 +00005490 else:
5491 # assert isinstance(value, tuple)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005492 self.sign = value[0]
5493 self.int = value[1]
5494 self.exp = value[2]
5495
5496 def __repr__(self):
5497 return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
5498
5499 __str__ = __repr__
5500
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005501
5502
Christian Heimes2c181612007-12-17 20:04:13 +00005503def _normalize(op1, op2, prec = 0):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005504 """Normalizes op1, op2 to have the same exp and length of coefficient.
5505
5506 Done during addition.
5507 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005508 if op1.exp < op2.exp:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005509 tmp = op2
5510 other = op1
5511 else:
5512 tmp = op1
5513 other = op2
5514
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005515 # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
5516 # Then adding 10**exp to tmp has the same effect (after rounding)
5517 # as adding any positive quantity smaller than 10**exp; similarly
5518 # for subtraction. So if other is smaller than 10**exp we replace
5519 # it with 10**exp. This avoids tmp.exp - other.exp getting too large.
Christian Heimes2c181612007-12-17 20:04:13 +00005520 tmp_len = len(str(tmp.int))
5521 other_len = len(str(other.int))
5522 exp = tmp.exp + min(-1, tmp_len - prec - 2)
5523 if other_len + other.exp - 1 < exp:
5524 other.int = 1
5525 other.exp = exp
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005526
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005527 tmp.int *= 10 ** (tmp.exp - other.exp)
5528 tmp.exp = other.exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005529 return op1, op2
5530
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005531##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005532
Raymond Hettingerdb213a22010-11-27 08:09:40 +00005533_nbits = int.bit_length
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005534
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005535def _sqrt_nearest(n, a):
5536 """Closest integer to the square root of the positive integer n. a is
5537 an initial approximation to the square root. Any positive integer
5538 will do for a, but the closer a is to the square root of n the
5539 faster convergence will be.
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005540
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005541 """
5542 if n <= 0 or a <= 0:
5543 raise ValueError("Both arguments to _sqrt_nearest should be positive.")
5544
5545 b=0
5546 while a != b:
5547 b, a = a, a--n//a>>1
5548 return a
5549
5550def _rshift_nearest(x, shift):
5551 """Given an integer x and a nonnegative integer shift, return closest
5552 integer to x / 2**shift; use round-to-even in case of a tie.
5553
5554 """
5555 b, q = 1 << shift, x >> shift
5556 return q + (2*(x & (b-1)) + (q&1) > b)
5557
5558def _div_nearest(a, b):
5559 """Closest integer to a/b, a and b positive integers; rounds to even
5560 in the case of a tie.
5561
5562 """
5563 q, r = divmod(a, b)
5564 return q + (2*r + (q&1) > b)
5565
5566def _ilog(x, M, L = 8):
5567 """Integer approximation to M*log(x/M), with absolute error boundable
5568 in terms only of x/M.
5569
5570 Given positive integers x and M, return an integer approximation to
5571 M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference
5572 between the approximation and the exact result is at most 22. For
5573 L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In
5574 both cases these are upper bounds on the error; it will usually be
5575 much smaller."""
5576
5577 # The basic algorithm is the following: let log1p be the function
5578 # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use
5579 # the reduction
5580 #
5581 # log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
5582 #
5583 # repeatedly until the argument to log1p is small (< 2**-L in
5584 # absolute value). For small y we can use the Taylor series
5585 # expansion
5586 #
5587 # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
5588 #
5589 # truncating at T such that y**T is small enough. The whole
5590 # computation is carried out in a form of fixed-point arithmetic,
5591 # with a real number z being represented by an integer
5592 # approximation to z*M. To avoid loss of precision, the y below
5593 # is actually an integer approximation to 2**R*y*M, where R is the
5594 # number of reductions performed so far.
5595
5596 y = x-M
5597 # argument reduction; R = number of reductions performed
5598 R = 0
5599 while (R <= L and abs(y) << L-R >= M or
5600 R > L and abs(y) >> R-L >= M):
5601 y = _div_nearest((M*y) << 1,
5602 M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
5603 R += 1
5604
5605 # Taylor series with T terms
5606 T = -int(-10*len(str(M))//(3*L))
5607 yshift = _rshift_nearest(y, R)
5608 w = _div_nearest(M, T)
5609 for k in range(T-1, 0, -1):
5610 w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
5611
5612 return _div_nearest(w*y, M)
5613
5614def _dlog10(c, e, p):
5615 """Given integers c, e and p with c > 0, p >= 0, compute an integer
5616 approximation to 10**p * log10(c*10**e), with an absolute error of
5617 at most 1. Assumes that c*10**e is not exactly 1."""
5618
5619 # increase precision by 2; compensate for this by dividing
5620 # final result by 100
5621 p += 2
5622
5623 # write c*10**e as d*10**f with either:
5624 # f >= 0 and 1 <= d <= 10, or
5625 # f <= 0 and 0.1 <= d <= 1.
5626 # Thus for c*10**e close to 1, f = 0
5627 l = len(str(c))
5628 f = e+l - (e+l >= 1)
5629
5630 if p > 0:
5631 M = 10**p
5632 k = e+p-f
5633 if k >= 0:
5634 c *= 10**k
5635 else:
5636 c = _div_nearest(c, 10**-k)
5637
5638 log_d = _ilog(c, M) # error < 5 + 22 = 27
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005639 log_10 = _log10_digits(p) # error < 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005640 log_d = _div_nearest(log_d*M, log_10)
5641 log_tenpower = f*M # exact
5642 else:
5643 log_d = 0 # error < 2.31
Neal Norwitz2f99b242008-08-24 05:48:10 +00005644 log_tenpower = _div_nearest(f, 10**-p) # error < 0.5
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005645
5646 return _div_nearest(log_tenpower+log_d, 100)
5647
5648def _dlog(c, e, p):
5649 """Given integers c, e and p with c > 0, compute an integer
5650 approximation to 10**p * log(c*10**e), with an absolute error of
5651 at most 1. Assumes that c*10**e is not exactly 1."""
5652
5653 # Increase precision by 2. The precision increase is compensated
5654 # for at the end with a division by 100.
5655 p += 2
5656
5657 # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
5658 # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e)
5659 # as 10**p * log(d) + 10**p*f * log(10).
5660 l = len(str(c))
5661 f = e+l - (e+l >= 1)
5662
5663 # compute approximation to 10**p*log(d), with error < 27
5664 if p > 0:
5665 k = e+p-f
5666 if k >= 0:
5667 c *= 10**k
5668 else:
5669 c = _div_nearest(c, 10**-k) # error of <= 0.5 in c
5670
5671 # _ilog magnifies existing error in c by a factor of at most 10
5672 log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
5673 else:
5674 # p <= 0: just approximate the whole thing by 0; error < 2.31
5675 log_d = 0
5676
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005677 # compute approximation to f*10**p*log(10), with error < 11.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005678 if f:
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005679 extra = len(str(abs(f)))-1
5680 if p + extra >= 0:
5681 # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
5682 # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
5683 f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005684 else:
5685 f_log_ten = 0
5686 else:
5687 f_log_ten = 0
5688
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005689 # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005690 return _div_nearest(f_log_ten + log_d, 100)
5691
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005692class _Log10Memoize(object):
5693 """Class to compute, store, and allow retrieval of, digits of the
5694 constant log(10) = 2.302585.... This constant is needed by
5695 Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
5696 def __init__(self):
5697 self.digits = "23025850929940456840179914546843642076011014886"
5698
5699 def getdigits(self, p):
5700 """Given an integer p >= 0, return floor(10**p)*log(10).
5701
5702 For example, self.getdigits(3) returns 2302.
5703 """
5704 # digits are stored as a string, for quick conversion to
5705 # integer in the case that we've already computed enough
5706 # digits; the stored digits should always be correct
5707 # (truncated, not rounded to nearest).
5708 if p < 0:
5709 raise ValueError("p should be nonnegative")
5710
5711 if p >= len(self.digits):
5712 # compute p+3, p+6, p+9, ... digits; continue until at
5713 # least one of the extra digits is nonzero
5714 extra = 3
5715 while True:
5716 # compute p+extra digits, correct to within 1ulp
5717 M = 10**(p+extra+2)
5718 digits = str(_div_nearest(_ilog(10*M, M), 100))
5719 if digits[-extra:] != '0'*extra:
5720 break
5721 extra += 3
5722 # keep all reliable digits so far; remove trailing zeros
5723 # and next nonzero digit
5724 self.digits = digits.rstrip('0')[:-1]
5725 return int(self.digits[:p+1])
5726
5727_log10_digits = _Log10Memoize().getdigits
5728
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005729def _iexp(x, M, L=8):
5730 """Given integers x and M, M > 0, such that x/M is small in absolute
5731 value, compute an integer approximation to M*exp(x/M). For 0 <=
5732 x/M <= 2.4, the absolute error in the result is bounded by 60 (and
5733 is usually much smaller)."""
5734
5735 # Algorithm: to compute exp(z) for a real number z, first divide z
5736 # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then
5737 # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
5738 # series
5739 #
5740 # expm1(x) = x + x**2/2! + x**3/3! + ...
5741 #
5742 # Now use the identity
5743 #
5744 # expm1(2x) = expm1(x)*(expm1(x)+2)
5745 #
5746 # R times to compute the sequence expm1(z/2**R),
5747 # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
5748
5749 # Find R such that x/2**R/M <= 2**-L
5750 R = _nbits((x<<L)//M)
5751
5752 # Taylor series. (2**L)**T > M
5753 T = -int(-10*len(str(M))//(3*L))
5754 y = _div_nearest(x, T)
5755 Mshift = M<<R
5756 for i in range(T-1, 0, -1):
5757 y = _div_nearest(x*(Mshift + y), Mshift * i)
5758
5759 # Expansion
5760 for k in range(R-1, -1, -1):
5761 Mshift = M<<(k+2)
5762 y = _div_nearest(y*(y+Mshift), Mshift)
5763
5764 return M+y
5765
5766def _dexp(c, e, p):
5767 """Compute an approximation to exp(c*10**e), with p decimal places of
5768 precision.
5769
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005770 Returns integers d, f such that:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005771
5772 10**(p-1) <= d <= 10**p, and
5773 (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
5774
5775 In other words, d*10**f is an approximation to exp(c*10**e) with p
5776 digits of precision, and with an error in d of at most 1. This is
5777 almost, but not quite, the same as the error being < 1ulp: when d
5778 = 10**(p-1) the error could be up to 10 ulp."""
5779
5780 # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
5781 p += 2
5782
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005783 # compute log(10) with extra precision = adjusted exponent of c*10**e
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005784 extra = max(0, e + len(str(c)) - 1)
5785 q = p + extra
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005786
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005787 # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005788 # rounding down
5789 shift = e+q
5790 if shift >= 0:
5791 cshift = c*10**shift
5792 else:
5793 cshift = c//10**-shift
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005794 quot, rem = divmod(cshift, _log10_digits(q))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005795
5796 # reduce remainder back to original precision
5797 rem = _div_nearest(rem, 10**extra)
5798
5799 # error in result of _iexp < 120; error after division < 0.62
5800 return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
5801
5802def _dpower(xc, xe, yc, ye, p):
5803 """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
5804 y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that:
5805
5806 10**(p-1) <= c <= 10**p, and
5807 (c-1)*10**e < x**y < (c+1)*10**e
5808
5809 in other words, c*10**e is an approximation to x**y with p digits
5810 of precision, and with an error in c of at most 1. (This is
5811 almost, but not quite, the same as the error being < 1ulp: when c
5812 == 10**(p-1) we can only guarantee error < 10ulp.)
5813
5814 We assume that: x is positive and not equal to 1, and y is nonzero.
5815 """
5816
5817 # Find b such that 10**(b-1) <= |y| <= 10**b
5818 b = len(str(abs(yc))) + ye
5819
5820 # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
5821 lxc = _dlog(xc, xe, p+b+1)
5822
5823 # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
5824 shift = ye-b
5825 if shift >= 0:
5826 pc = lxc*yc*10**shift
5827 else:
5828 pc = _div_nearest(lxc*yc, 10**-shift)
5829
5830 if pc == 0:
5831 # we prefer a result that isn't exactly 1; this makes it
5832 # easier to compute a correctly rounded result in __pow__
5833 if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
5834 coeff, exp = 10**(p-1)+1, 1-p
5835 else:
5836 coeff, exp = 10**p-1, -p
5837 else:
5838 coeff, exp = _dexp(pc, -(p+1), p+1)
5839 coeff = _div_nearest(coeff, 10)
5840 exp += 1
5841
5842 return coeff, exp
5843
5844def _log10_lb(c, correction = {
5845 '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
5846 '6': 23, '7': 16, '8': 10, '9': 5}):
5847 """Compute a lower bound for 100*log10(c) for a positive integer c."""
5848 if c <= 0:
5849 raise ValueError("The argument to _log10_lb should be nonnegative.")
5850 str_c = str(c)
5851 return 100*len(str_c) - correction[str_c[0]]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005852
Guido van Rossumd8faa362007-04-27 19:54:29 +00005853##### Helper Functions ####################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005854
Mark Dickinsonac256ab2010-04-03 11:08:14 +00005855def _convert_other(other, raiseit=False, allow_float=False):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005856 """Convert other to Decimal.
5857
5858 Verifies that it's ok to use in an implicit construction.
Mark Dickinsonac256ab2010-04-03 11:08:14 +00005859 If allow_float is true, allow conversion from float; this
5860 is used in the comparison methods (__eq__ and friends).
5861
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005862 """
5863 if isinstance(other, Decimal):
5864 return other
Walter Dörwaldaa97f042007-05-03 21:05:51 +00005865 if isinstance(other, int):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005866 return Decimal(other)
Mark Dickinsonac256ab2010-04-03 11:08:14 +00005867 if allow_float and isinstance(other, float):
5868 return Decimal.from_float(other)
5869
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005870 if raiseit:
5871 raise TypeError("Unable to convert %s to Decimal" % other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00005872 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005873
Mark Dickinson08ade6f2010-06-11 10:44:52 +00005874def _convert_for_comparison(self, other, equality_op=False):
5875 """Given a Decimal instance self and a Python object other, return
Mark Dickinson1c164a62010-06-11 16:49:20 +00005876 a pair (s, o) of Decimal instances such that "s op o" is
Mark Dickinson08ade6f2010-06-11 10:44:52 +00005877 equivalent to "self op other" for any of the 6 comparison
5878 operators "op".
5879
5880 """
5881 if isinstance(other, Decimal):
5882 return self, other
5883
5884 # Comparison with a Rational instance (also includes integers):
5885 # self op n/d <=> self*d op n (for n and d integers, d positive).
5886 # A NaN or infinity can be left unchanged without affecting the
5887 # comparison result.
5888 if isinstance(other, _numbers.Rational):
5889 if not self._is_special:
5890 self = _dec_from_triple(self._sign,
5891 str(int(self._int) * other.denominator),
5892 self._exp)
5893 return self, Decimal(other.numerator)
5894
5895 # Comparisons with float and complex types. == and != comparisons
5896 # with complex numbers should succeed, returning either True or False
5897 # as appropriate. Other comparisons return NotImplemented.
5898 if equality_op and isinstance(other, _numbers.Complex) and other.imag == 0:
5899 other = other.real
5900 if isinstance(other, float):
5901 return self, Decimal.from_float(other)
5902 return NotImplemented, NotImplemented
5903
5904
Guido van Rossumd8faa362007-04-27 19:54:29 +00005905##### Setup Specific Contexts ############################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005906
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005907# The default context prototype used by Context()
Raymond Hettingerfed52962004-07-14 15:41:57 +00005908# Is mutable, so that new contexts can have different default values
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005909
5910DefaultContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005911 prec=28, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005912 traps=[DivisionByZero, Overflow, InvalidOperation],
5913 flags=[],
Raymond Hettinger99148e72004-07-14 19:56:56 +00005914 Emax=999999999,
5915 Emin=-999999999,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00005916 capitals=1,
5917 clamp=0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005918)
5919
5920# Pre-made alternate contexts offered by the specification
5921# Don't change these; the user should be able to select these
5922# contexts and be able to reproduce results from other implementations
5923# of the spec.
5924
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005925BasicContext = Context(
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005926 prec=9, rounding=ROUND_HALF_UP,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005927 traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
5928 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005929)
5930
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005931ExtendedContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005932 prec=9, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005933 traps=[],
5934 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005935)
5936
5937
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005938##### crud for parsing strings #############################################
Christian Heimes23daade02008-02-25 12:39:23 +00005939#
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005940# Regular expression used for parsing numeric strings. Additional
5941# comments:
5942#
5943# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
5944# whitespace. But note that the specification disallows whitespace in
5945# a numeric string.
5946#
5947# 2. For finite numbers (not infinities and NaNs) the body of the
5948# number between the optional sign and the optional exponent must have
5949# at least one decimal digit, possibly after the decimal point. The
Mark Dickinson345adc42009-08-02 10:14:23 +00005950# lookahead expression '(?=\d|\.\d)' checks this.
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005951
5952import re
Benjamin Peterson41181742008-07-02 20:22:54 +00005953_parser = re.compile(r""" # A numeric string consists of:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005954# \s*
Benjamin Peterson41181742008-07-02 20:22:54 +00005955 (?P<sign>[-+])? # an optional sign, followed by either...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005956 (
Mark Dickinson345adc42009-08-02 10:14:23 +00005957 (?=\d|\.\d) # ...a number (with at least one digit)
5958 (?P<int>\d*) # having a (possibly empty) integer part
5959 (\.(?P<frac>\d*))? # followed by an optional fractional part
5960 (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005961 |
Benjamin Peterson41181742008-07-02 20:22:54 +00005962 Inf(inity)? # ...an infinity, or...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005963 |
Benjamin Peterson41181742008-07-02 20:22:54 +00005964 (?P<signal>s)? # ...an (optionally signaling)
5965 NaN # NaN
Mark Dickinson345adc42009-08-02 10:14:23 +00005966 (?P<diag>\d*) # with (possibly empty) diagnostic info.
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005967 )
5968# \s*
Christian Heimesa62da1d2008-01-12 19:39:10 +00005969 \Z
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005970""", re.VERBOSE | re.IGNORECASE).match
5971
Christian Heimescbf3b5c2007-12-03 21:02:03 +00005972_all_zeros = re.compile('0*$').match
5973_exact_half = re.compile('50*$').match
Christian Heimesf16baeb2008-02-29 14:57:44 +00005974
5975##### PEP3101 support functions ##############################################
Mark Dickinson79f52032009-03-17 23:12:51 +00005976# The functions in this section have little to do with the Decimal
5977# class, and could potentially be reused or adapted for other pure
Christian Heimesf16baeb2008-02-29 14:57:44 +00005978# Python numeric classes that want to implement __format__
5979#
5980# A format specifier for Decimal looks like:
5981#
Eric Smith984bb582010-11-25 16:08:06 +00005982# [[fill]align][sign][#][0][minimumwidth][,][.precision][type]
Christian Heimesf16baeb2008-02-29 14:57:44 +00005983
5984_parse_format_specifier_regex = re.compile(r"""\A
5985(?:
5986 (?P<fill>.)?
5987 (?P<align>[<>=^])
5988)?
5989(?P<sign>[-+ ])?
Eric Smith984bb582010-11-25 16:08:06 +00005990(?P<alt>\#)?
Christian Heimesf16baeb2008-02-29 14:57:44 +00005991(?P<zeropad>0)?
5992(?P<minimumwidth>(?!0)\d+)?
Mark Dickinson79f52032009-03-17 23:12:51 +00005993(?P<thousands_sep>,)?
Christian Heimesf16baeb2008-02-29 14:57:44 +00005994(?:\.(?P<precision>0|(?!0)\d+))?
Mark Dickinson79f52032009-03-17 23:12:51 +00005995(?P<type>[eEfFgGn%])?
Christian Heimesf16baeb2008-02-29 14:57:44 +00005996\Z
5997""", re.VERBOSE)
5998
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005999del re
6000
Mark Dickinson79f52032009-03-17 23:12:51 +00006001# The locale module is only needed for the 'n' format specifier. The
6002# rest of the PEP 3101 code functions quite happily without it, so we
6003# don't care too much if locale isn't present.
6004try:
6005 import locale as _locale
6006except ImportError:
6007 pass
6008
6009def _parse_format_specifier(format_spec, _localeconv=None):
Christian Heimesf16baeb2008-02-29 14:57:44 +00006010 """Parse and validate a format specifier.
6011
6012 Turns a standard numeric format specifier into a dict, with the
6013 following entries:
6014
6015 fill: fill character to pad field to minimum width
6016 align: alignment type, either '<', '>', '=' or '^'
6017 sign: either '+', '-' or ' '
6018 minimumwidth: nonnegative integer giving minimum width
Mark Dickinson79f52032009-03-17 23:12:51 +00006019 zeropad: boolean, indicating whether to pad with zeros
6020 thousands_sep: string to use as thousands separator, or ''
6021 grouping: grouping for thousands separators, in format
6022 used by localeconv
6023 decimal_point: string to use for decimal point
Christian Heimesf16baeb2008-02-29 14:57:44 +00006024 precision: nonnegative integer giving precision, or None
6025 type: one of the characters 'eEfFgG%', or None
Christian Heimesf16baeb2008-02-29 14:57:44 +00006026
6027 """
6028 m = _parse_format_specifier_regex.match(format_spec)
6029 if m is None:
6030 raise ValueError("Invalid format specifier: " + format_spec)
6031
6032 # get the dictionary
6033 format_dict = m.groupdict()
6034
Mark Dickinson79f52032009-03-17 23:12:51 +00006035 # zeropad; defaults for fill and alignment. If zero padding
6036 # is requested, the fill and align fields should be absent.
Christian Heimesf16baeb2008-02-29 14:57:44 +00006037 fill = format_dict['fill']
6038 align = format_dict['align']
Mark Dickinson79f52032009-03-17 23:12:51 +00006039 format_dict['zeropad'] = (format_dict['zeropad'] is not None)
6040 if format_dict['zeropad']:
6041 if fill is not None:
Christian Heimesf16baeb2008-02-29 14:57:44 +00006042 raise ValueError("Fill character conflicts with '0'"
6043 " in format specifier: " + format_spec)
Mark Dickinson79f52032009-03-17 23:12:51 +00006044 if align is not None:
Christian Heimesf16baeb2008-02-29 14:57:44 +00006045 raise ValueError("Alignment conflicts with '0' in "
6046 "format specifier: " + format_spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00006047 format_dict['fill'] = fill or ' '
Mark Dickinson46ab5d02009-09-08 20:22:46 +00006048 # PEP 3101 originally specified that the default alignment should
6049 # be left; it was later agreed that right-aligned makes more sense
6050 # for numeric types. See http://bugs.python.org/issue6857.
6051 format_dict['align'] = align or '>'
Christian Heimesf16baeb2008-02-29 14:57:44 +00006052
Mark Dickinson79f52032009-03-17 23:12:51 +00006053 # default sign handling: '-' for negative, '' for positive
Christian Heimesf16baeb2008-02-29 14:57:44 +00006054 if format_dict['sign'] is None:
6055 format_dict['sign'] = '-'
6056
Christian Heimesf16baeb2008-02-29 14:57:44 +00006057 # minimumwidth defaults to 0; precision remains None if not given
6058 format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
6059 if format_dict['precision'] is not None:
6060 format_dict['precision'] = int(format_dict['precision'])
6061
6062 # if format type is 'g' or 'G' then a precision of 0 makes little
6063 # sense; convert it to 1. Same if format type is unspecified.
6064 if format_dict['precision'] == 0:
Mark Dickinson7718d2b2009-09-07 16:21:56 +00006065 if format_dict['type'] is None or format_dict['type'] in 'gG':
Christian Heimesf16baeb2008-02-29 14:57:44 +00006066 format_dict['precision'] = 1
6067
Mark Dickinson79f52032009-03-17 23:12:51 +00006068 # determine thousands separator, grouping, and decimal separator, and
6069 # add appropriate entries to format_dict
6070 if format_dict['type'] == 'n':
6071 # apart from separators, 'n' behaves just like 'g'
6072 format_dict['type'] = 'g'
6073 if _localeconv is None:
6074 _localeconv = _locale.localeconv()
6075 if format_dict['thousands_sep'] is not None:
6076 raise ValueError("Explicit thousands separator conflicts with "
6077 "'n' type in format specifier: " + format_spec)
6078 format_dict['thousands_sep'] = _localeconv['thousands_sep']
6079 format_dict['grouping'] = _localeconv['grouping']
6080 format_dict['decimal_point'] = _localeconv['decimal_point']
6081 else:
6082 if format_dict['thousands_sep'] is None:
6083 format_dict['thousands_sep'] = ''
6084 format_dict['grouping'] = [3, 0]
6085 format_dict['decimal_point'] = '.'
Christian Heimesf16baeb2008-02-29 14:57:44 +00006086
6087 return format_dict
6088
Mark Dickinson79f52032009-03-17 23:12:51 +00006089def _format_align(sign, body, spec):
6090 """Given an unpadded, non-aligned numeric string 'body' and sign
Ezio Melotti42da6632011-03-15 05:18:48 +02006091 string 'sign', add padding and alignment conforming to the given
Mark Dickinson79f52032009-03-17 23:12:51 +00006092 format specifier dictionary 'spec' (as produced by
6093 parse_format_specifier).
Christian Heimesf16baeb2008-02-29 14:57:44 +00006094
6095 """
Christian Heimesf16baeb2008-02-29 14:57:44 +00006096 # how much extra space do we have to play with?
Mark Dickinson79f52032009-03-17 23:12:51 +00006097 minimumwidth = spec['minimumwidth']
6098 fill = spec['fill']
6099 padding = fill*(minimumwidth - len(sign) - len(body))
Christian Heimesf16baeb2008-02-29 14:57:44 +00006100
Mark Dickinson79f52032009-03-17 23:12:51 +00006101 align = spec['align']
Christian Heimesf16baeb2008-02-29 14:57:44 +00006102 if align == '<':
Christian Heimesf16baeb2008-02-29 14:57:44 +00006103 result = sign + body + padding
Mark Dickinsonad416342009-03-17 18:10:15 +00006104 elif align == '>':
6105 result = padding + sign + body
Christian Heimesf16baeb2008-02-29 14:57:44 +00006106 elif align == '=':
6107 result = sign + padding + body
Mark Dickinson79f52032009-03-17 23:12:51 +00006108 elif align == '^':
Christian Heimesf16baeb2008-02-29 14:57:44 +00006109 half = len(padding)//2
6110 result = padding[:half] + sign + body + padding[half:]
Mark Dickinson79f52032009-03-17 23:12:51 +00006111 else:
6112 raise ValueError('Unrecognised alignment field')
Christian Heimesf16baeb2008-02-29 14:57:44 +00006113
Christian Heimesf16baeb2008-02-29 14:57:44 +00006114 return result
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00006115
Mark Dickinson79f52032009-03-17 23:12:51 +00006116def _group_lengths(grouping):
6117 """Convert a localeconv-style grouping into a (possibly infinite)
6118 iterable of integers representing group lengths.
6119
6120 """
6121 # The result from localeconv()['grouping'], and the input to this
6122 # function, should be a list of integers in one of the
6123 # following three forms:
6124 #
6125 # (1) an empty list, or
6126 # (2) nonempty list of positive integers + [0]
6127 # (3) list of positive integers + [locale.CHAR_MAX], or
6128
6129 from itertools import chain, repeat
6130 if not grouping:
6131 return []
6132 elif grouping[-1] == 0 and len(grouping) >= 2:
6133 return chain(grouping[:-1], repeat(grouping[-2]))
6134 elif grouping[-1] == _locale.CHAR_MAX:
6135 return grouping[:-1]
6136 else:
6137 raise ValueError('unrecognised format for grouping')
6138
6139def _insert_thousands_sep(digits, spec, min_width=1):
6140 """Insert thousands separators into a digit string.
6141
6142 spec is a dictionary whose keys should include 'thousands_sep' and
6143 'grouping'; typically it's the result of parsing the format
6144 specifier using _parse_format_specifier.
6145
6146 The min_width keyword argument gives the minimum length of the
6147 result, which will be padded on the left with zeros if necessary.
6148
6149 If necessary, the zero padding adds an extra '0' on the left to
6150 avoid a leading thousands separator. For example, inserting
6151 commas every three digits in '123456', with min_width=8, gives
6152 '0,123,456', even though that has length 9.
6153
6154 """
6155
6156 sep = spec['thousands_sep']
6157 grouping = spec['grouping']
6158
6159 groups = []
6160 for l in _group_lengths(grouping):
Mark Dickinson79f52032009-03-17 23:12:51 +00006161 if l <= 0:
6162 raise ValueError("group length should be positive")
6163 # max(..., 1) forces at least 1 digit to the left of a separator
6164 l = min(max(len(digits), min_width, 1), l)
6165 groups.append('0'*(l - len(digits)) + digits[-l:])
6166 digits = digits[:-l]
6167 min_width -= l
6168 if not digits and min_width <= 0:
6169 break
Mark Dickinson7303b592009-03-18 08:25:36 +00006170 min_width -= len(sep)
Mark Dickinson79f52032009-03-17 23:12:51 +00006171 else:
6172 l = max(len(digits), min_width, 1)
6173 groups.append('0'*(l - len(digits)) + digits[-l:])
6174 return sep.join(reversed(groups))
6175
6176def _format_sign(is_negative, spec):
6177 """Determine sign character."""
6178
6179 if is_negative:
6180 return '-'
6181 elif spec['sign'] in ' +':
6182 return spec['sign']
6183 else:
6184 return ''
6185
6186def _format_number(is_negative, intpart, fracpart, exp, spec):
6187 """Format a number, given the following data:
6188
6189 is_negative: true if the number is negative, else false
6190 intpart: string of digits that must appear before the decimal point
6191 fracpart: string of digits that must come after the point
6192 exp: exponent, as an integer
6193 spec: dictionary resulting from parsing the format specifier
6194
6195 This function uses the information in spec to:
6196 insert separators (decimal separator and thousands separators)
6197 format the sign
6198 format the exponent
6199 add trailing '%' for the '%' type
6200 zero-pad if necessary
6201 fill and align if necessary
6202 """
6203
6204 sign = _format_sign(is_negative, spec)
6205
Eric Smith984bb582010-11-25 16:08:06 +00006206 if fracpart or spec['alt']:
Mark Dickinson79f52032009-03-17 23:12:51 +00006207 fracpart = spec['decimal_point'] + fracpart
6208
6209 if exp != 0 or spec['type'] in 'eE':
6210 echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
6211 fracpart += "{0}{1:+}".format(echar, exp)
6212 if spec['type'] == '%':
6213 fracpart += '%'
6214
6215 if spec['zeropad']:
6216 min_width = spec['minimumwidth'] - len(fracpart) - len(sign)
6217 else:
6218 min_width = 0
6219 intpart = _insert_thousands_sep(intpart, spec, min_width)
6220
6221 return _format_align(sign, intpart+fracpart, spec)
6222
6223
Guido van Rossumd8faa362007-04-27 19:54:29 +00006224##### Useful Constants (internal use only) ################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006225
Guido van Rossumd8faa362007-04-27 19:54:29 +00006226# Reusable defaults
Mark Dickinson627cf6a2009-01-03 12:11:47 +00006227_Infinity = Decimal('Inf')
6228_NegativeInfinity = Decimal('-Inf')
Mark Dickinsonf9236412009-01-02 23:23:21 +00006229_NaN = Decimal('NaN')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00006230_Zero = Decimal(0)
6231_One = Decimal(1)
6232_NegativeOne = Decimal(-1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006233
Mark Dickinson627cf6a2009-01-03 12:11:47 +00006234# _SignedInfinity[sign] is infinity w/ that sign
6235_SignedInfinity = (_Infinity, _NegativeInfinity)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006236
Mark Dickinsondc787d22010-05-23 13:33:13 +00006237# Constants related to the hash implementation; hash(x) is based
6238# on the reduction of x modulo _PyHASH_MODULUS
6239import sys
6240_PyHASH_MODULUS = sys.hash_info.modulus
6241# hash values to use for positive and negative infinities, and nans
6242_PyHASH_INF = sys.hash_info.inf
6243_PyHASH_NAN = sys.hash_info.nan
6244del sys
6245
6246# _PyHASH_10INV is the inverse of 10 modulo the prime _PyHASH_MODULUS
6247_PyHASH_10INV = pow(10, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006248
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006249
6250if __name__ == '__main__':
Raymond Hettinger6d7e26e2011-02-01 23:54:43 +00006251 import doctest, decimal
6252 doctest.testmod(decimal)