blob: 5a9f840771148855c89464985cd7e50bb46596f2 [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
135
Raymond Hettingereb260842005-06-07 18:52:34 +0000136import copy as _copy
Raymond Hettinger771ed762009-01-03 19:20:32 +0000137import math as _math
Raymond Hettinger82417ca2009-02-03 03:54:28 +0000138import numbers as _numbers
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000139
Christian Heimes25bb7832008-01-11 16:17:00 +0000140try:
141 from collections import namedtuple as _namedtuple
142 DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
143except ImportError:
144 DecimalTuple = lambda *args: args
145
Guido van Rossumd8faa362007-04-27 19:54:29 +0000146# Rounding
Raymond Hettinger0ea241e2004-07-04 13:53:24 +0000147ROUND_DOWN = 'ROUND_DOWN'
148ROUND_HALF_UP = 'ROUND_HALF_UP'
149ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
150ROUND_CEILING = 'ROUND_CEILING'
151ROUND_FLOOR = 'ROUND_FLOOR'
152ROUND_UP = 'ROUND_UP'
153ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000154ROUND_05UP = 'ROUND_05UP'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000155
Guido van Rossumd8faa362007-04-27 19:54:29 +0000156# Errors
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000157
158class DecimalException(ArithmeticError):
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000159 """Base exception class.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000160
161 Used exceptions derive from this.
162 If an exception derives from another exception besides this (such as
163 Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
164 called if the others are present. This isn't actually used for
165 anything, though.
166
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000167 handle -- Called when context._raise_error is called and the
Stefan Krah2eb4a072010-05-19 15:52:31 +0000168 trap_enabler is not set. First argument is self, second is the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000169 context. More arguments can be given, those being after
170 the explanation in _raise_error (For example,
171 context._raise_error(NewError, '(-x)!', self._sign) would
172 call NewError().handle(context, self._sign).)
173
174 To define a new exception, it should be sufficient to have it derive
175 from DecimalException.
176 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000177 def handle(self, context, *args):
178 pass
179
180
181class Clamped(DecimalException):
182 """Exponent of a 0 changed to fit bounds.
183
184 This occurs and signals clamped if the exponent of a result has been
185 altered in order to fit the constraints of a specific concrete
Guido van Rossumd8faa362007-04-27 19:54:29 +0000186 representation. This may occur when the exponent of a zero result would
187 be outside the bounds of a representation, or when a large normal
188 number would have an encoded exponent that cannot be represented. In
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000189 this latter case, the exponent is reduced to fit and the corresponding
190 number of zero digits are appended to the coefficient ("fold-down").
191 """
192
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000193class InvalidOperation(DecimalException):
194 """An invalid operation was performed.
195
196 Various bad things cause this:
197
198 Something creates a signaling NaN
199 -INF + INF
Guido van Rossumd8faa362007-04-27 19:54:29 +0000200 0 * (+-)INF
201 (+-)INF / (+-)INF
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000202 x % 0
203 (+-)INF % x
204 x._rescale( non-integer )
205 sqrt(-x) , x > 0
206 0 ** 0
207 x ** (non-integer)
208 x ** (+-)INF
209 An operand is invalid
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000210
211 The result of the operation after these is a quiet positive NaN,
212 except when the cause is a signaling NaN, in which case the result is
213 also a quiet NaN, but with the original sign, and an optional
214 diagnostic information.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000215 """
216 def handle(self, context, *args):
217 if args:
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000218 ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
219 return ans._fix_nan(context)
Mark Dickinsonf9236412009-01-02 23:23:21 +0000220 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000221
222class ConversionSyntax(InvalidOperation):
223 """Trying to convert badly formed string.
224
225 This occurs and signals invalid-operation if an string is being
226 converted to a number and it does not conform to the numeric string
Guido van Rossumd8faa362007-04-27 19:54:29 +0000227 syntax. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000228 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000229 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000230 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000231
232class DivisionByZero(DecimalException, ZeroDivisionError):
233 """Division by 0.
234
235 This occurs and signals division-by-zero if division of a finite number
236 by zero was attempted (during a divide-integer or divide operation, or a
237 power operation with negative right-hand operand), and the dividend was
238 not zero.
239
240 The result of the operation is [sign,inf], where sign is the exclusive
241 or of the signs of the operands for divide, or is 1 for an odd power of
242 -0, for power.
243 """
244
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000245 def handle(self, context, sign, *args):
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000246 return _SignedInfinity[sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000247
248class DivisionImpossible(InvalidOperation):
249 """Cannot perform the division adequately.
250
251 This occurs and signals invalid-operation if the integer result of a
252 divide-integer or remainder operation had too many digits (would be
Guido van Rossumd8faa362007-04-27 19:54:29 +0000253 longer than precision). The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000254 """
255
256 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000257 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000258
259class DivisionUndefined(InvalidOperation, ZeroDivisionError):
260 """Undefined result of division.
261
262 This occurs and signals invalid-operation if division by zero was
263 attempted (during a divide-integer, divide, or remainder operation), and
Guido van Rossumd8faa362007-04-27 19:54:29 +0000264 the dividend is also zero. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000265 """
266
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000267 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000268 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000269
270class Inexact(DecimalException):
271 """Had to round, losing information.
272
273 This occurs and signals inexact whenever the result of an operation is
274 not exact (that is, it needed to be rounded and any discarded digits
Guido van Rossumd8faa362007-04-27 19:54:29 +0000275 were non-zero), or if an overflow or underflow condition occurs. The
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000276 result in all cases is unchanged.
277
278 The inexact signal may be tested (or trapped) to determine if a given
279 operation (or sequence of operations) was inexact.
280 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000281
282class InvalidContext(InvalidOperation):
283 """Invalid context. Unknown rounding, for example.
284
285 This occurs and signals invalid-operation if an invalid context was
Guido van Rossumd8faa362007-04-27 19:54:29 +0000286 detected during an operation. This can occur if contexts are not checked
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000287 on creation and either the precision exceeds the capability of the
288 underlying concrete representation or an unknown or unsupported rounding
Guido van Rossumd8faa362007-04-27 19:54:29 +0000289 was specified. These aspects of the context need only be checked when
290 the values are required to be used. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000291 """
292
293 def handle(self, context, *args):
Mark Dickinsonf9236412009-01-02 23:23:21 +0000294 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000295
296class Rounded(DecimalException):
297 """Number got rounded (not necessarily changed during rounding).
298
299 This occurs and signals rounded whenever the result of an operation is
300 rounded (that is, some zero or non-zero digits were discarded from the
Guido van Rossumd8faa362007-04-27 19:54:29 +0000301 coefficient), or if an overflow or underflow condition occurs. The
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000302 result in all cases is unchanged.
303
304 The rounded signal may be tested (or trapped) to determine if a given
305 operation (or sequence of operations) caused a loss of precision.
306 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000307
308class Subnormal(DecimalException):
309 """Exponent < Emin before rounding.
310
311 This occurs and signals subnormal whenever the result of a conversion or
312 operation is subnormal (that is, its adjusted exponent is less than
Guido van Rossumd8faa362007-04-27 19:54:29 +0000313 Emin, before any rounding). The result in all cases is unchanged.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000314
315 The subnormal signal may be tested (or trapped) to determine if a given
316 or operation (or sequence of operations) yielded a subnormal result.
317 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000318
319class Overflow(Inexact, Rounded):
320 """Numerical overflow.
321
322 This occurs and signals overflow if the adjusted exponent of a result
323 (from a conversion or from an operation that is not an attempt to divide
324 by zero), after rounding, would be greater than the largest value that
325 can be handled by the implementation (the value Emax).
326
327 The result depends on the rounding mode:
328
329 For round-half-up and round-half-even (and for round-half-down and
330 round-up, if implemented), the result of the operation is [sign,inf],
Guido van Rossumd8faa362007-04-27 19:54:29 +0000331 where sign is the sign of the intermediate result. For round-down, the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000332 result is the largest finite number that can be represented in the
Guido van Rossumd8faa362007-04-27 19:54:29 +0000333 current precision, with the sign of the intermediate result. For
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000334 round-ceiling, the result is the same as for round-down if the sign of
Guido van Rossumd8faa362007-04-27 19:54:29 +0000335 the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000336 the result is the same as for round-down if the sign of the intermediate
Guido van Rossumd8faa362007-04-27 19:54:29 +0000337 result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000338 will also be raised.
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000339 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000340
341 def handle(self, context, sign, *args):
342 if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000343 ROUND_HALF_DOWN, ROUND_UP):
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000344 return _SignedInfinity[sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000345 if sign == 0:
346 if context.rounding == ROUND_CEILING:
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000347 return _SignedInfinity[sign]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000348 return _dec_from_triple(sign, '9'*context.prec,
349 context.Emax-context.prec+1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000350 if sign == 1:
351 if context.rounding == ROUND_FLOOR:
Mark Dickinson627cf6a2009-01-03 12:11:47 +0000352 return _SignedInfinity[sign]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000353 return _dec_from_triple(sign, '9'*context.prec,
354 context.Emax-context.prec+1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000355
356
357class Underflow(Inexact, Rounded, Subnormal):
358 """Numerical underflow with result rounded to 0.
359
360 This occurs and signals underflow if a result is inexact and the
361 adjusted exponent of the result would be smaller (more negative) than
362 the smallest value that can be handled by the implementation (the value
Guido van Rossumd8faa362007-04-27 19:54:29 +0000363 Emin). That is, the result is both inexact and subnormal.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000364
365 The result after an underflow will be a subnormal number rounded, if
Guido van Rossumd8faa362007-04-27 19:54:29 +0000366 necessary, so that its exponent is not less than Etiny. This may result
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000367 in 0 with the sign of the intermediate result and an exponent of Etiny.
368
369 In all cases, Inexact, Rounded, and Subnormal will also be raised.
370 """
371
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000372# List of public traps and flags
Raymond Hettingerfed52962004-07-14 15:41:57 +0000373_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000374 Underflow, InvalidOperation, Subnormal]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000375
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000376# Map conditions (per the spec) to signals
377_condition_map = {ConversionSyntax:InvalidOperation,
378 DivisionImpossible:InvalidOperation,
379 DivisionUndefined:InvalidOperation,
380 InvalidContext:InvalidOperation}
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000381
Guido van Rossumd8faa362007-04-27 19:54:29 +0000382##### Context Functions ##################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000383
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000384# The getcontext() and setcontext() function manage access to a thread-local
385# current context. Py2.4 offers direct support for thread locals. If that
Georg Brandlf9926402008-06-13 06:32:25 +0000386# is not available, use threading.current_thread() which is slower but will
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000387# work for older Pythons. If threads are not part of the build, create a
388# mock threading object with threading.local() returning the module namespace.
389
390try:
391 import threading
392except ImportError:
393 # Python was compiled without threads; create a mock object instead
394 import sys
Guido van Rossumd8faa362007-04-27 19:54:29 +0000395 class MockThreading(object):
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000396 def local(self, sys=sys):
397 return sys.modules[__name__]
398 threading = MockThreading()
399 del sys, MockThreading
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000400
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000401try:
402 threading.local
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000403
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000404except AttributeError:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000405
Guido van Rossumd8faa362007-04-27 19:54:29 +0000406 # To fix reloading, force it to create a new context
407 # Old contexts have different exceptions in their dicts, making problems.
Georg Brandlf9926402008-06-13 06:32:25 +0000408 if hasattr(threading.current_thread(), '__decimal_context__'):
409 del threading.current_thread().__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000410
411 def setcontext(context):
412 """Set this thread's context to context."""
413 if context in (DefaultContext, BasicContext, ExtendedContext):
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000414 context = context.copy()
Raymond Hettinger61992ef2004-08-06 23:42:16 +0000415 context.clear_flags()
Georg Brandlf9926402008-06-13 06:32:25 +0000416 threading.current_thread().__decimal_context__ = context
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000417
418 def getcontext():
419 """Returns this thread's context.
420
421 If this thread does not yet have a context, returns
422 a new context and sets this thread's context.
423 New contexts are copies of DefaultContext.
424 """
425 try:
Georg Brandlf9926402008-06-13 06:32:25 +0000426 return threading.current_thread().__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000427 except AttributeError:
428 context = Context()
Georg Brandlf9926402008-06-13 06:32:25 +0000429 threading.current_thread().__decimal_context__ = context
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000430 return context
431
432else:
433
434 local = threading.local()
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000435 if hasattr(local, '__decimal_context__'):
436 del local.__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000437
438 def getcontext(_local=local):
439 """Returns this thread's context.
440
441 If this thread does not yet have a context, returns
442 a new context and sets this thread's context.
443 New contexts are copies of DefaultContext.
444 """
445 try:
446 return _local.__decimal_context__
447 except AttributeError:
448 context = Context()
449 _local.__decimal_context__ = context
450 return context
451
452 def setcontext(context, _local=local):
453 """Set this thread's context to context."""
454 if context in (DefaultContext, BasicContext, ExtendedContext):
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000455 context = context.copy()
Raymond Hettinger61992ef2004-08-06 23:42:16 +0000456 context.clear_flags()
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000457 _local.__decimal_context__ = context
458
459 del threading, local # Don't contaminate the namespace
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000460
Thomas Wouters89f507f2006-12-13 04:49:30 +0000461def localcontext(ctx=None):
462 """Return a context manager for a copy of the supplied context
463
464 Uses a copy of the current context if no context is specified
465 The returned context manager creates a local decimal context
466 in a with statement:
467 def sin(x):
468 with localcontext() as ctx:
469 ctx.prec += 2
470 # Rest of sin calculation algorithm
471 # uses a precision 2 greater than normal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000472 return +s # Convert result to normal precision
Thomas Wouters89f507f2006-12-13 04:49:30 +0000473
474 def sin(x):
475 with localcontext(ExtendedContext):
476 # Rest of sin calculation algorithm
477 # uses the Extended Context from the
478 # General Decimal Arithmetic Specification
Guido van Rossumd8faa362007-04-27 19:54:29 +0000479 return +s # Convert result to normal context
Thomas Wouters89f507f2006-12-13 04:49:30 +0000480
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000481 >>> setcontext(DefaultContext)
Guido van Rossum7131f842007-02-09 20:13:25 +0000482 >>> print(getcontext().prec)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000483 28
484 >>> with localcontext():
485 ... ctx = getcontext()
Thomas Wouterscf297e42007-02-23 15:07:44 +0000486 ... ctx.prec += 2
Guido van Rossum7131f842007-02-09 20:13:25 +0000487 ... print(ctx.prec)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000488 ...
Thomas Wouters89f507f2006-12-13 04:49:30 +0000489 30
490 >>> with localcontext(ExtendedContext):
Guido van Rossum7131f842007-02-09 20:13:25 +0000491 ... print(getcontext().prec)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000492 ...
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 9
Guido van Rossum7131f842007-02-09 20:13:25 +0000494 >>> print(getcontext().prec)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000495 28
496 """
497 if ctx is None: ctx = getcontext()
498 return _ContextManager(ctx)
499
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000500
Guido van Rossumd8faa362007-04-27 19:54:29 +0000501##### Decimal class #######################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000502
Raymond Hettingera0fd8882009-01-20 07:24:44 +0000503# Do not subclass Decimal from numbers.Real and do not register it as such
504# (because Decimals are not interoperable with floats). See the notes in
505# numbers.py for more detail.
506
507class Decimal(object):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000508 """Floating point class for decimal arithmetic."""
509
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000510 __slots__ = ('_exp','_int','_sign', '_is_special')
511 # Generally, the value of the Decimal instance is given by
512 # (-1)**_sign * _int * 10**_exp
513 # Special values are signified by _is_special == True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000514
Raymond Hettingerdab988d2004-10-09 07:10:44 +0000515 # We're immutable, so use __new__ not __init__
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000516 def __new__(cls, value="0", context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000517 """Create a decimal point instance.
518
519 >>> Decimal('3.14') # string input
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000520 Decimal('3.14')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000521 >>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent)
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000522 Decimal('3.14')
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000523 >>> Decimal(314) # int
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000524 Decimal('314')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000525 >>> Decimal(Decimal(314)) # another decimal instance
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000526 Decimal('314')
Christian Heimesa62da1d2008-01-12 19:39:10 +0000527 >>> Decimal(' 3.14 \\n') # leading and trailing whitespace okay
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000528 Decimal('3.14')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000529 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000530
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000531 # Note that the coefficient, self._int, is actually stored as
532 # a string rather than as a tuple of digits. This speeds up
533 # the "digits to integer" and "integer to digits" conversions
534 # that are used in almost every arithmetic operation on
535 # Decimals. This is an internal detail: the as_tuple function
536 # and the Decimal constructor still deal with tuples of
537 # digits.
538
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000539 self = object.__new__(cls)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000540
Christian Heimesd59c64c2007-11-30 19:27:20 +0000541 # From a string
542 # REs insist on real strings, so we can too.
543 if isinstance(value, str):
Christian Heimesa62da1d2008-01-12 19:39:10 +0000544 m = _parser(value.strip())
Christian Heimesd59c64c2007-11-30 19:27:20 +0000545 if m is None:
546 if context is None:
547 context = getcontext()
548 return context._raise_error(ConversionSyntax,
549 "Invalid literal for Decimal: %r" % value)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000550
Christian Heimesd59c64c2007-11-30 19:27:20 +0000551 if m.group('sign') == "-":
552 self._sign = 1
553 else:
554 self._sign = 0
555 intpart = m.group('int')
556 if intpart is not None:
557 # finite number
Mark Dickinson345adc42009-08-02 10:14:23 +0000558 fracpart = m.group('frac') or ''
Christian Heimesd59c64c2007-11-30 19:27:20 +0000559 exp = int(m.group('exp') or '0')
Mark Dickinson345adc42009-08-02 10:14:23 +0000560 self._int = str(int(intpart+fracpart))
561 self._exp = exp - len(fracpart)
Christian Heimesd59c64c2007-11-30 19:27:20 +0000562 self._is_special = False
563 else:
564 diag = m.group('diag')
565 if diag is not None:
566 # NaN
Mark Dickinson345adc42009-08-02 10:14:23 +0000567 self._int = str(int(diag or '0')).lstrip('0')
Christian Heimesd59c64c2007-11-30 19:27:20 +0000568 if m.group('signal'):
569 self._exp = 'N'
570 else:
571 self._exp = 'n'
572 else:
573 # infinity
574 self._int = '0'
575 self._exp = 'F'
576 self._is_special = True
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000577 return self
578
579 # From an integer
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000580 if isinstance(value, int):
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000581 if value >= 0:
582 self._sign = 0
583 else:
584 self._sign = 1
585 self._exp = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000586 self._int = str(abs(value))
Christian Heimesd59c64c2007-11-30 19:27:20 +0000587 self._is_special = False
588 return self
589
590 # From another decimal
591 if isinstance(value, Decimal):
592 self._exp = value._exp
593 self._sign = value._sign
594 self._int = value._int
595 self._is_special = value._is_special
596 return self
597
598 # From an internal working value
599 if isinstance(value, _WorkRep):
600 self._sign = value.sign
601 self._int = str(value.int)
602 self._exp = int(value.exp)
603 self._is_special = False
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000604 return self
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000605
606 # tuple/list conversion (possibly from as_tuple())
607 if isinstance(value, (list,tuple)):
608 if len(value) != 3:
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000609 raise ValueError('Invalid tuple size in creation of Decimal '
610 'from list or tuple. The list or tuple '
611 'should have exactly three elements.')
612 # process sign. The isinstance test rejects floats
613 if not (isinstance(value[0], int) and value[0] in (0,1)):
614 raise ValueError("Invalid sign. The first value in the tuple "
615 "should be an integer; either 0 for a "
616 "positive number or 1 for a negative number.")
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000617 self._sign = value[0]
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000618 if value[2] == 'F':
619 # infinity: value[1] is ignored
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000620 self._int = '0'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000621 self._exp = value[2]
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000622 self._is_special = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000623 else:
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000624 # process and validate the digits in value[1]
625 digits = []
626 for digit in value[1]:
627 if isinstance(digit, int) and 0 <= digit <= 9:
628 # skip leading zeros
629 if digits or digit != 0:
630 digits.append(digit)
631 else:
632 raise ValueError("The second value in the tuple must "
633 "be composed of integers in the range "
634 "0 through 9.")
635 if value[2] in ('n', 'N'):
636 # NaN: digits form the diagnostic
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000637 self._int = ''.join(map(str, digits))
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000638 self._exp = value[2]
639 self._is_special = True
640 elif isinstance(value[2], int):
641 # finite number: digits give the coefficient
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000642 self._int = ''.join(map(str, digits or [0]))
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000643 self._exp = value[2]
644 self._is_special = False
645 else:
646 raise ValueError("The third value in the tuple must "
647 "be an integer, or one of the "
648 "strings 'F', 'n', 'N'.")
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000649 return self
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000650
Raymond Hettingerbf440692004-07-10 14:14:37 +0000651 if isinstance(value, float):
Raymond Hettinger96798592010-04-02 16:58:27 +0000652 value = Decimal.from_float(value)
653 self._exp = value._exp
654 self._sign = value._sign
655 self._int = value._int
656 self._is_special = value._is_special
657 return self
Raymond Hettingerbf440692004-07-10 14:14:37 +0000658
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000659 raise TypeError("Cannot convert %r to Decimal" % value)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000660
Mark Dickinsonba298e42009-01-04 21:17:43 +0000661 # @classmethod, but @decorator is not valid Python 2.3 syntax, so
662 # don't use it (see notes on Py2.3 compatibility at top of file)
Raymond Hettinger771ed762009-01-03 19:20:32 +0000663 def from_float(cls, f):
664 """Converts a float to a decimal number, exactly.
665
666 Note that Decimal.from_float(0.1) is not the same as Decimal('0.1').
667 Since 0.1 is not exactly representable in binary floating point, the
668 value is stored as the nearest representable value which is
669 0x1.999999999999ap-4. The exact equivalent of the value in decimal
670 is 0.1000000000000000055511151231257827021181583404541015625.
671
672 >>> Decimal.from_float(0.1)
673 Decimal('0.1000000000000000055511151231257827021181583404541015625')
674 >>> Decimal.from_float(float('nan'))
675 Decimal('NaN')
676 >>> Decimal.from_float(float('inf'))
677 Decimal('Infinity')
678 >>> Decimal.from_float(-float('inf'))
679 Decimal('-Infinity')
680 >>> Decimal.from_float(-0.0)
681 Decimal('-0')
682
683 """
684 if isinstance(f, int): # handle integer inputs
685 return cls(f)
686 if _math.isinf(f) or _math.isnan(f): # raises TypeError if not a float
687 return cls(repr(f))
Mark Dickinsonba298e42009-01-04 21:17:43 +0000688 if _math.copysign(1.0, f) == 1.0:
689 sign = 0
690 else:
691 sign = 1
Raymond Hettinger771ed762009-01-03 19:20:32 +0000692 n, d = abs(f).as_integer_ratio()
693 k = d.bit_length() - 1
694 result = _dec_from_triple(sign, str(n*5**k), -k)
Mark Dickinsonba298e42009-01-04 21:17:43 +0000695 if cls is Decimal:
696 return result
697 else:
698 return cls(result)
699 from_float = classmethod(from_float)
Raymond Hettinger771ed762009-01-03 19:20:32 +0000700
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000701 def _isnan(self):
702 """Returns whether the number is not actually one.
703
704 0 if a number
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000705 1 if NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000706 2 if sNaN
707 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000708 if self._is_special:
709 exp = self._exp
710 if exp == 'n':
711 return 1
712 elif exp == 'N':
713 return 2
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000714 return 0
715
716 def _isinfinity(self):
717 """Returns whether the number is infinite
718
719 0 if finite or not a number
720 1 if +INF
721 -1 if -INF
722 """
723 if self._exp == 'F':
724 if self._sign:
725 return -1
726 return 1
727 return 0
728
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000729 def _check_nans(self, other=None, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000730 """Returns whether the number is not actually one.
731
732 if self, other are sNaN, signal
733 if self, other are NaN return nan
734 return 0
735
736 Done before operations.
737 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000738
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000739 self_is_nan = self._isnan()
740 if other is None:
741 other_is_nan = False
742 else:
743 other_is_nan = other._isnan()
744
745 if self_is_nan or other_is_nan:
746 if context is None:
747 context = getcontext()
748
749 if self_is_nan == 2:
750 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000751 self)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000752 if other_is_nan == 2:
753 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000754 other)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000755 if self_is_nan:
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000756 return self._fix_nan(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000757
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000758 return other._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000759 return 0
760
Christian Heimes77c02eb2008-02-09 02:18:51 +0000761 def _compare_check_nans(self, other, context):
762 """Version of _check_nans used for the signaling comparisons
763 compare_signal, __le__, __lt__, __ge__, __gt__.
764
765 Signal InvalidOperation if either self or other is a (quiet
766 or signaling) NaN. Signaling NaNs take precedence over quiet
767 NaNs.
768
769 Return 0 if neither operand is a NaN.
770
771 """
772 if context is None:
773 context = getcontext()
774
775 if self._is_special or other._is_special:
776 if self.is_snan():
777 return context._raise_error(InvalidOperation,
778 'comparison involving sNaN',
779 self)
780 elif other.is_snan():
781 return context._raise_error(InvalidOperation,
782 'comparison involving sNaN',
783 other)
784 elif self.is_qnan():
785 return context._raise_error(InvalidOperation,
786 'comparison involving NaN',
787 self)
788 elif other.is_qnan():
789 return context._raise_error(InvalidOperation,
790 'comparison involving NaN',
791 other)
792 return 0
793
Jack Diederich4dafcc42006-11-28 19:15:13 +0000794 def __bool__(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000795 """Return True if self is nonzero; otherwise return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000796
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000797 NaNs and infinities are considered nonzero.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000798 """
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000799 return self._is_special or self._int != '0'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000800
Christian Heimes77c02eb2008-02-09 02:18:51 +0000801 def _cmp(self, other):
802 """Compare the two non-NaN decimal instances self and other.
803
804 Returns -1 if self < other, 0 if self == other and 1
805 if self > other. This routine is for internal use only."""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000806
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000807 if self._is_special or other._is_special:
Mark Dickinsone6aad752009-01-25 10:48:51 +0000808 self_inf = self._isinfinity()
809 other_inf = other._isinfinity()
810 if self_inf == other_inf:
811 return 0
812 elif self_inf < other_inf:
813 return -1
814 else:
815 return 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000816
Mark Dickinsone6aad752009-01-25 10:48:51 +0000817 # check for zeros; Decimal('0') == Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000818 if not self:
819 if not other:
820 return 0
821 else:
822 return -((-1)**other._sign)
823 if not other:
824 return (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000825
Guido van Rossumd8faa362007-04-27 19:54:29 +0000826 # If different signs, neg one is less
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000827 if other._sign < self._sign:
828 return -1
829 if self._sign < other._sign:
830 return 1
831
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000832 self_adjusted = self.adjusted()
833 other_adjusted = other.adjusted()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000834 if self_adjusted == other_adjusted:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000835 self_padded = self._int + '0'*(self._exp - other._exp)
836 other_padded = other._int + '0'*(other._exp - self._exp)
Mark Dickinsone6aad752009-01-25 10:48:51 +0000837 if self_padded == other_padded:
838 return 0
839 elif self_padded < other_padded:
840 return -(-1)**self._sign
841 else:
842 return (-1)**self._sign
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000843 elif self_adjusted > other_adjusted:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000844 return (-1)**self._sign
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000845 else: # self_adjusted < other_adjusted
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000846 return -((-1)**self._sign)
847
Christian Heimes77c02eb2008-02-09 02:18:51 +0000848 # Note: The Decimal standard doesn't cover rich comparisons for
849 # Decimals. In particular, the specification is silent on the
850 # subject of what should happen for a comparison involving a NaN.
851 # We take the following approach:
852 #
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000853 # == comparisons involving a quiet NaN always return False
854 # != comparisons involving a quiet NaN always return True
855 # == or != comparisons involving a signaling NaN signal
856 # InvalidOperation, and return False or True as above if the
857 # InvalidOperation is not trapped.
Christian Heimes77c02eb2008-02-09 02:18:51 +0000858 # <, >, <= and >= comparisons involving a (quiet or signaling)
859 # NaN signal InvalidOperation, and return False if the
Christian Heimes3feef612008-02-11 06:19:17 +0000860 # InvalidOperation is not trapped.
Christian Heimes77c02eb2008-02-09 02:18:51 +0000861 #
862 # This behavior is designed to conform as closely as possible to
863 # that specified by IEEE 754.
864
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000865 def __eq__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000866 self, other = _convert_for_comparison(self, other, equality_op=True)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000867 if other is NotImplemented:
868 return other
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000869 if self._check_nans(other, context):
Christian Heimes77c02eb2008-02-09 02:18:51 +0000870 return False
871 return self._cmp(other) == 0
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000872
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000873 def __ne__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000874 self, other = _convert_for_comparison(self, other, equality_op=True)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000875 if other is NotImplemented:
876 return other
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000877 if self._check_nans(other, context):
Christian Heimes77c02eb2008-02-09 02:18:51 +0000878 return True
879 return self._cmp(other) != 0
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000880
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000881
Christian Heimes77c02eb2008-02-09 02:18:51 +0000882 def __lt__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000883 self, other = _convert_for_comparison(self, other)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000884 if other is NotImplemented:
885 return other
886 ans = self._compare_check_nans(other, context)
887 if ans:
888 return False
889 return self._cmp(other) < 0
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000890
Christian Heimes77c02eb2008-02-09 02:18:51 +0000891 def __le__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000892 self, other = _convert_for_comparison(self, other)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000893 if other is NotImplemented:
894 return other
895 ans = self._compare_check_nans(other, context)
896 if ans:
897 return False
898 return self._cmp(other) <= 0
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000899
Christian Heimes77c02eb2008-02-09 02:18:51 +0000900 def __gt__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000901 self, other = _convert_for_comparison(self, other)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000902 if other is NotImplemented:
903 return other
904 ans = self._compare_check_nans(other, context)
905 if ans:
906 return False
907 return self._cmp(other) > 0
908
909 def __ge__(self, other, context=None):
Mark Dickinson08ade6f2010-06-11 10:44:52 +0000910 self, other = _convert_for_comparison(self, other)
Christian Heimes77c02eb2008-02-09 02:18:51 +0000911 if other is NotImplemented:
912 return other
913 ans = self._compare_check_nans(other, context)
914 if ans:
915 return False
916 return self._cmp(other) >= 0
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000917
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000918 def compare(self, other, context=None):
919 """Compares one to another.
920
921 -1 => a < b
922 0 => a = b
923 1 => a > b
924 NaN => one is NaN
925 Like __cmp__, but returns Decimal instances.
926 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000927 other = _convert_other(other, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000928
Guido van Rossumd8faa362007-04-27 19:54:29 +0000929 # Compare(NaN, NaN) = NaN
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000930 if (self._is_special or other and other._is_special):
931 ans = self._check_nans(other, context)
932 if ans:
933 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000934
Christian Heimes77c02eb2008-02-09 02:18:51 +0000935 return Decimal(self._cmp(other))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000936
937 def __hash__(self):
938 """x.__hash__() <==> hash(x)"""
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000939
Mark Dickinsondc787d22010-05-23 13:33:13 +0000940 # In order to make sure that the hash of a Decimal instance
941 # agrees with the hash of a numerically equal integer, float
942 # or Fraction, we follow the rules for numeric hashes outlined
943 # in the documentation. (See library docs, 'Built-in Types').
Raymond Hettingerbea3f6f2005-03-15 04:59:17 +0000944 if self._is_special:
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000945 if self.is_snan():
946 raise TypeError('Cannot hash a signaling NaN value.')
947 elif self.is_nan():
Mark Dickinsondc787d22010-05-23 13:33:13 +0000948 return _PyHASH_NAN
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000949 else:
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000950 if self._sign:
Mark Dickinsondc787d22010-05-23 13:33:13 +0000951 return -_PyHASH_INF
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000952 else:
Mark Dickinsondc787d22010-05-23 13:33:13 +0000953 return _PyHASH_INF
Mark Dickinsonac256ab2010-04-03 11:08:14 +0000954
Mark Dickinsondc787d22010-05-23 13:33:13 +0000955 if self._exp >= 0:
956 exp_hash = pow(10, self._exp, _PyHASH_MODULUS)
957 else:
958 exp_hash = pow(_PyHASH_10INV, -self._exp, _PyHASH_MODULUS)
959 hash_ = int(self._int) * exp_hash % _PyHASH_MODULUS
Stefan Krahdc817b22010-11-17 11:16:34 +0000960 ans = hash_ if self >= 0 else -hash_
961 return -2 if ans == -1 else ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000962
963 def as_tuple(self):
964 """Represents the number as a triple tuple.
965
966 To show the internals exactly as they are.
967 """
Christian Heimes25bb7832008-01-11 16:17:00 +0000968 return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000969
970 def __repr__(self):
971 """Represents the number as an instance of Decimal."""
972 # Invariant: eval(repr(d)) == d
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000973 return "Decimal('%s')" % str(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000974
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000975 def __str__(self, eng=False, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000976 """Return string representation of the number in scientific notation.
977
978 Captures all of the information in the underlying representation.
979 """
980
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000981 sign = ['', '-'][self._sign]
Raymond Hettingere5a0a962005-06-20 09:49:42 +0000982 if self._is_special:
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000983 if self._exp == 'F':
984 return sign + 'Infinity'
985 elif self._exp == 'n':
986 return sign + 'NaN' + self._int
987 else: # self._exp == 'N'
988 return sign + 'sNaN' + self._int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000989
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000990 # number of digits of self._int to left of decimal point
991 leftdigits = self._exp + len(self._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000992
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000993 # dotplace is number of digits of self._int to the left of the
994 # decimal point in the mantissa of the output string (that is,
995 # after adjusting the exponent)
996 if self._exp <= 0 and leftdigits > -6:
997 # no exponent required
998 dotplace = leftdigits
999 elif not eng:
1000 # usual scientific notation: 1 digit on left of the point
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001001 dotplace = 1
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001002 elif self._int == '0':
1003 # engineering notation, zero
1004 dotplace = (leftdigits + 1) % 3 - 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001005 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001006 # engineering notation, nonzero
1007 dotplace = (leftdigits - 1) % 3 + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001008
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001009 if dotplace <= 0:
1010 intpart = '0'
1011 fracpart = '.' + '0'*(-dotplace) + self._int
1012 elif dotplace >= len(self._int):
1013 intpart = self._int+'0'*(dotplace-len(self._int))
1014 fracpart = ''
1015 else:
1016 intpart = self._int[:dotplace]
1017 fracpart = '.' + self._int[dotplace:]
1018 if leftdigits == dotplace:
1019 exp = ''
1020 else:
1021 if context is None:
1022 context = getcontext()
1023 exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
1024
1025 return sign + intpart + fracpart + exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001026
1027 def to_eng_string(self, context=None):
1028 """Convert to engineering-type string.
1029
1030 Engineering notation has an exponent which is a multiple of 3, so there
1031 are up to 3 digits left of the decimal place.
1032
1033 Same rules for when in exponential and when as a value as in __str__.
1034 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001035 return self.__str__(eng=True, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001036
1037 def __neg__(self, context=None):
1038 """Returns a copy with the sign switched.
1039
1040 Rounds, if it has reason.
1041 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001042 if self._is_special:
1043 ans = self._check_nans(context=context)
1044 if ans:
1045 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001046
1047 if not self:
1048 # -Decimal('0') is Decimal('0'), not Decimal('-0')
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001049 ans = self.copy_abs()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001050 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001051 ans = self.copy_negate()
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001052
1053 if context is None:
1054 context = getcontext()
Christian Heimes2c181612007-12-17 20:04:13 +00001055 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001056
1057 def __pos__(self, context=None):
1058 """Returns a copy, unless it is a sNaN.
1059
1060 Rounds the number (if more then precision digits)
1061 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001062 if self._is_special:
1063 ans = self._check_nans(context=context)
1064 if ans:
1065 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001066
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001067 if not self:
1068 # + (-0) = 0
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001069 ans = self.copy_abs()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001070 else:
1071 ans = Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001072
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001073 if context is None:
1074 context = getcontext()
Christian Heimes2c181612007-12-17 20:04:13 +00001075 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001076
Christian Heimes2c181612007-12-17 20:04:13 +00001077 def __abs__(self, round=True, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001078 """Returns the absolute value of self.
1079
Christian Heimes2c181612007-12-17 20:04:13 +00001080 If the keyword argument 'round' is false, do not round. The
1081 expression self.__abs__(round=False) is equivalent to
1082 self.copy_abs().
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001083 """
Christian Heimes2c181612007-12-17 20:04:13 +00001084 if not round:
1085 return self.copy_abs()
1086
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001087 if self._is_special:
1088 ans = self._check_nans(context=context)
1089 if ans:
1090 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001091
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001092 if self._sign:
1093 ans = self.__neg__(context=context)
1094 else:
1095 ans = self.__pos__(context=context)
1096
1097 return ans
1098
1099 def __add__(self, other, context=None):
1100 """Returns self + other.
1101
1102 -INF + INF (or the reverse) cause InvalidOperation errors.
1103 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001104 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001105 if other is NotImplemented:
1106 return other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001107
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001108 if context is None:
1109 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001110
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001111 if self._is_special or other._is_special:
1112 ans = self._check_nans(other, context)
1113 if ans:
1114 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001115
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001116 if self._isinfinity():
Guido van Rossumd8faa362007-04-27 19:54:29 +00001117 # If both INF, same sign => same as both, opposite => error.
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001118 if self._sign != other._sign and other._isinfinity():
1119 return context._raise_error(InvalidOperation, '-INF + INF')
1120 return Decimal(self)
1121 if other._isinfinity():
Guido van Rossumd8faa362007-04-27 19:54:29 +00001122 return Decimal(other) # Can't both be infinity here
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001123
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001124 exp = min(self._exp, other._exp)
1125 negativezero = 0
1126 if context.rounding == ROUND_FLOOR and self._sign != other._sign:
Guido van Rossumd8faa362007-04-27 19:54:29 +00001127 # If the answer is 0, the sign should be negative, in this case.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001128 negativezero = 1
1129
1130 if not self and not other:
1131 sign = min(self._sign, other._sign)
1132 if negativezero:
1133 sign = 1
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001134 ans = _dec_from_triple(sign, '0', exp)
Christian Heimes2c181612007-12-17 20:04:13 +00001135 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001136 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001137 if not self:
Facundo Batista99b55482004-10-26 23:38:46 +00001138 exp = max(exp, other._exp - context.prec-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001139 ans = other._rescale(exp, context.rounding)
Christian Heimes2c181612007-12-17 20:04:13 +00001140 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001141 return ans
1142 if not other:
Facundo Batista99b55482004-10-26 23:38:46 +00001143 exp = max(exp, self._exp - context.prec-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001144 ans = self._rescale(exp, context.rounding)
Christian Heimes2c181612007-12-17 20:04:13 +00001145 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001146 return ans
1147
1148 op1 = _WorkRep(self)
1149 op2 = _WorkRep(other)
Christian Heimes2c181612007-12-17 20:04:13 +00001150 op1, op2 = _normalize(op1, op2, context.prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001151
1152 result = _WorkRep()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001153 if op1.sign != op2.sign:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001154 # Equal and opposite
Raymond Hettinger17931de2004-10-27 06:21:46 +00001155 if op1.int == op2.int:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001156 ans = _dec_from_triple(negativezero, '0', exp)
Christian Heimes2c181612007-12-17 20:04:13 +00001157 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001158 return ans
Raymond Hettinger17931de2004-10-27 06:21:46 +00001159 if op1.int < op2.int:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001160 op1, op2 = op2, op1
Guido van Rossumd8faa362007-04-27 19:54:29 +00001161 # OK, now abs(op1) > abs(op2)
Raymond Hettinger17931de2004-10-27 06:21:46 +00001162 if op1.sign == 1:
1163 result.sign = 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001164 op1.sign, op2.sign = op2.sign, op1.sign
1165 else:
Raymond Hettinger17931de2004-10-27 06:21:46 +00001166 result.sign = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +00001167 # So we know the sign, and op1 > 0.
Raymond Hettinger17931de2004-10-27 06:21:46 +00001168 elif op1.sign == 1:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001169 result.sign = 1
Raymond Hettinger17931de2004-10-27 06:21:46 +00001170 op1.sign, op2.sign = (0, 0)
1171 else:
1172 result.sign = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +00001173 # Now, op1 > abs(op2) > 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001174
Raymond Hettinger17931de2004-10-27 06:21:46 +00001175 if op2.sign == 0:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001176 result.int = op1.int + op2.int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001177 else:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001178 result.int = op1.int - op2.int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001179
1180 result.exp = op1.exp
1181 ans = Decimal(result)
Christian Heimes2c181612007-12-17 20:04:13 +00001182 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001183 return ans
1184
1185 __radd__ = __add__
1186
1187 def __sub__(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001188 """Return self - other"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001189 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001190 if other is NotImplemented:
1191 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001192
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001193 if self._is_special or other._is_special:
1194 ans = self._check_nans(other, context=context)
1195 if ans:
1196 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001197
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001198 # self - other is computed as self + other.copy_negate()
1199 return self.__add__(other.copy_negate(), context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001200
1201 def __rsub__(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001202 """Return other - self"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001203 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001204 if other is NotImplemented:
1205 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001206
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001207 return other.__sub__(self, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001208
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001209 def __mul__(self, other, context=None):
1210 """Return self * other.
1211
1212 (+-) INF * 0 (or its reverse) raise InvalidOperation.
1213 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001214 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001215 if other is NotImplemented:
1216 return other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001217
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001218 if context is None:
1219 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001220
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +00001221 resultsign = self._sign ^ other._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001222
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001223 if self._is_special or other._is_special:
1224 ans = self._check_nans(other, context)
1225 if ans:
1226 return ans
1227
1228 if self._isinfinity():
1229 if not other:
1230 return context._raise_error(InvalidOperation, '(+-)INF * 0')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001231 return _SignedInfinity[resultsign]
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001232
1233 if other._isinfinity():
1234 if not self:
1235 return context._raise_error(InvalidOperation, '0 * (+-)INF')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001236 return _SignedInfinity[resultsign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001237
1238 resultexp = self._exp + other._exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001239
1240 # Special case for multiplying by zero
1241 if not self or not other:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001242 ans = _dec_from_triple(resultsign, '0', resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001243 # Fixing in case the exponent is out of bounds
1244 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001245 return ans
1246
1247 # Special case for multiplying by power of 10
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001248 if self._int == '1':
1249 ans = _dec_from_triple(resultsign, other._int, resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001250 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001251 return ans
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001252 if other._int == '1':
1253 ans = _dec_from_triple(resultsign, self._int, resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001254 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001255 return ans
1256
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001257 op1 = _WorkRep(self)
1258 op2 = _WorkRep(other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001259
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001260 ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
Christian Heimes2c181612007-12-17 20:04:13 +00001261 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001262
1263 return ans
1264 __rmul__ = __mul__
1265
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001266 def __truediv__(self, other, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001267 """Return self / other."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001268 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001269 if other is NotImplemented:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001270 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001271
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001272 if context is None:
1273 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001274
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +00001275 sign = self._sign ^ other._sign
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001276
1277 if self._is_special or other._is_special:
1278 ans = self._check_nans(other, context)
1279 if ans:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001280 return ans
1281
1282 if self._isinfinity() and other._isinfinity():
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001283 return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001284
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001285 if self._isinfinity():
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001286 return _SignedInfinity[sign]
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001287
1288 if other._isinfinity():
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001289 context._raise_error(Clamped, 'Division by infinity')
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001290 return _dec_from_triple(sign, '0', context.Etiny())
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001291
1292 # Special cases for zeroes
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001293 if not other:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001294 if not self:
1295 return context._raise_error(DivisionUndefined, '0 / 0')
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001296 return context._raise_error(DivisionByZero, 'x / 0', sign)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001297
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001298 if not self:
1299 exp = self._exp - other._exp
1300 coeff = 0
1301 else:
1302 # OK, so neither = 0, INF or NaN
1303 shift = len(other._int) - len(self._int) + context.prec + 1
1304 exp = self._exp - other._exp - shift
1305 op1 = _WorkRep(self)
1306 op2 = _WorkRep(other)
1307 if shift >= 0:
1308 coeff, remainder = divmod(op1.int * 10**shift, op2.int)
1309 else:
1310 coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
1311 if remainder:
1312 # result is not exact; adjust to ensure correct rounding
1313 if coeff % 5 == 0:
1314 coeff += 1
1315 else:
1316 # result is exact; get as close to ideal exponent as possible
1317 ideal_exp = self._exp - other._exp
1318 while exp < ideal_exp and coeff % 10 == 0:
1319 coeff //= 10
1320 exp += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001321
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001322 ans = _dec_from_triple(sign, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001323 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001324
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001325 def _divide(self, other, context):
1326 """Return (self // other, self % other), to context.prec precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001327
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001328 Assumes that neither self nor other is a NaN, that self is not
1329 infinite and that other is nonzero.
1330 """
1331 sign = self._sign ^ other._sign
1332 if other._isinfinity():
1333 ideal_exp = self._exp
1334 else:
1335 ideal_exp = min(self._exp, other._exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001336
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001337 expdiff = self.adjusted() - other.adjusted()
1338 if not self or other._isinfinity() or expdiff <= -2:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001339 return (_dec_from_triple(sign, '0', 0),
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001340 self._rescale(ideal_exp, context.rounding))
1341 if expdiff <= context.prec:
1342 op1 = _WorkRep(self)
1343 op2 = _WorkRep(other)
1344 if op1.exp >= op2.exp:
1345 op1.int *= 10**(op1.exp - op2.exp)
1346 else:
1347 op2.int *= 10**(op2.exp - op1.exp)
1348 q, r = divmod(op1.int, op2.int)
1349 if q < 10**context.prec:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001350 return (_dec_from_triple(sign, str(q), 0),
1351 _dec_from_triple(self._sign, str(r), ideal_exp))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001352
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001353 # Here the quotient is too large to be representable
1354 ans = context._raise_error(DivisionImpossible,
1355 'quotient too large in //, % or divmod')
1356 return ans, ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001357
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001358 def __rtruediv__(self, other, context=None):
1359 """Swaps self/other and returns __truediv__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001360 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001361 if other is NotImplemented:
1362 return other
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001363 return other.__truediv__(self, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001364
1365 def __divmod__(self, other, context=None):
1366 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001367 Return (self // other, self % other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001368 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001369 other = _convert_other(other)
1370 if other is NotImplemented:
1371 return other
1372
1373 if context is None:
1374 context = getcontext()
1375
1376 ans = self._check_nans(other, context)
1377 if ans:
1378 return (ans, ans)
1379
1380 sign = self._sign ^ other._sign
1381 if self._isinfinity():
1382 if other._isinfinity():
1383 ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
1384 return ans, ans
1385 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001386 return (_SignedInfinity[sign],
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001387 context._raise_error(InvalidOperation, 'INF % x'))
1388
1389 if not other:
1390 if not self:
1391 ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
1392 return ans, ans
1393 else:
1394 return (context._raise_error(DivisionByZero, 'x // 0', sign),
1395 context._raise_error(InvalidOperation, 'x % 0'))
1396
1397 quotient, remainder = self._divide(other, context)
Christian Heimes2c181612007-12-17 20:04:13 +00001398 remainder = remainder._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001399 return quotient, remainder
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001400
1401 def __rdivmod__(self, other, context=None):
1402 """Swaps self/other and returns __divmod__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001403 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001404 if other is NotImplemented:
1405 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001406 return other.__divmod__(self, context=context)
1407
1408 def __mod__(self, other, context=None):
1409 """
1410 self % other
1411 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001412 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001413 if other is NotImplemented:
1414 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001415
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001416 if context is None:
1417 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001418
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001419 ans = self._check_nans(other, context)
1420 if ans:
1421 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001422
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001423 if self._isinfinity():
1424 return context._raise_error(InvalidOperation, 'INF % x')
1425 elif not other:
1426 if self:
1427 return context._raise_error(InvalidOperation, 'x % 0')
1428 else:
1429 return context._raise_error(DivisionUndefined, '0 % 0')
1430
1431 remainder = self._divide(other, context)[1]
Christian Heimes2c181612007-12-17 20:04:13 +00001432 remainder = remainder._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001433 return remainder
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001434
1435 def __rmod__(self, other, context=None):
1436 """Swaps self/other and returns __mod__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001437 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001438 if other is NotImplemented:
1439 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001440 return other.__mod__(self, context=context)
1441
1442 def remainder_near(self, other, context=None):
1443 """
1444 Remainder nearest to 0- abs(remainder-near) <= other/2
1445 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001446 if context is None:
1447 context = getcontext()
1448
1449 other = _convert_other(other, raiseit=True)
1450
1451 ans = self._check_nans(other, context)
1452 if ans:
1453 return ans
1454
1455 # self == +/-infinity -> InvalidOperation
1456 if self._isinfinity():
1457 return context._raise_error(InvalidOperation,
1458 'remainder_near(infinity, x)')
1459
1460 # other == 0 -> either InvalidOperation or DivisionUndefined
1461 if not other:
1462 if self:
1463 return context._raise_error(InvalidOperation,
1464 'remainder_near(x, 0)')
1465 else:
1466 return context._raise_error(DivisionUndefined,
1467 'remainder_near(0, 0)')
1468
1469 # other = +/-infinity -> remainder = self
1470 if other._isinfinity():
1471 ans = Decimal(self)
1472 return ans._fix(context)
1473
1474 # self = 0 -> remainder = self, with ideal exponent
1475 ideal_exponent = min(self._exp, other._exp)
1476 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001477 ans = _dec_from_triple(self._sign, '0', ideal_exponent)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001478 return ans._fix(context)
1479
1480 # catch most cases of large or small quotient
1481 expdiff = self.adjusted() - other.adjusted()
1482 if expdiff >= context.prec + 1:
1483 # expdiff >= prec+1 => abs(self/other) > 10**prec
1484 return context._raise_error(DivisionImpossible)
1485 if expdiff <= -2:
1486 # expdiff <= -2 => abs(self/other) < 0.1
1487 ans = self._rescale(ideal_exponent, context.rounding)
1488 return ans._fix(context)
1489
1490 # adjust both arguments to have the same exponent, then divide
1491 op1 = _WorkRep(self)
1492 op2 = _WorkRep(other)
1493 if op1.exp >= op2.exp:
1494 op1.int *= 10**(op1.exp - op2.exp)
1495 else:
1496 op2.int *= 10**(op2.exp - op1.exp)
1497 q, r = divmod(op1.int, op2.int)
1498 # remainder is r*10**ideal_exponent; other is +/-op2.int *
1499 # 10**ideal_exponent. Apply correction to ensure that
1500 # abs(remainder) <= abs(other)/2
1501 if 2*r + (q&1) > op2.int:
1502 r -= op2.int
1503 q += 1
1504
1505 if q >= 10**context.prec:
1506 return context._raise_error(DivisionImpossible)
1507
1508 # result has same sign as self unless r is negative
1509 sign = self._sign
1510 if r < 0:
1511 sign = 1-sign
1512 r = -r
1513
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001514 ans = _dec_from_triple(sign, str(r), ideal_exponent)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001515 return ans._fix(context)
1516
1517 def __floordiv__(self, other, context=None):
1518 """self // other"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001519 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001520 if other is NotImplemented:
1521 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001522
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001523 if context is None:
1524 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001525
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001526 ans = self._check_nans(other, context)
1527 if ans:
1528 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001529
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001530 if self._isinfinity():
1531 if other._isinfinity():
1532 return context._raise_error(InvalidOperation, 'INF // INF')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001533 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001534 return _SignedInfinity[self._sign ^ other._sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001535
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001536 if not other:
1537 if self:
1538 return context._raise_error(DivisionByZero, 'x // 0',
1539 self._sign ^ other._sign)
1540 else:
1541 return context._raise_error(DivisionUndefined, '0 // 0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001542
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001543 return self._divide(other, context)[0]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001544
1545 def __rfloordiv__(self, other, context=None):
1546 """Swaps self/other and returns __floordiv__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001547 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001548 if other is NotImplemented:
1549 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001550 return other.__floordiv__(self, context=context)
1551
1552 def __float__(self):
1553 """Float representation."""
1554 return float(str(self))
1555
1556 def __int__(self):
Brett Cannon46b08022005-03-01 03:12:26 +00001557 """Converts self to an int, truncating if necessary."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001558 if self._is_special:
1559 if self._isnan():
Mark Dickinson825fce32009-09-07 18:08:12 +00001560 raise ValueError("Cannot convert NaN to integer")
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001561 elif self._isinfinity():
Mark Dickinson825fce32009-09-07 18:08:12 +00001562 raise OverflowError("Cannot convert infinity to integer")
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001563 s = (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001564 if self._exp >= 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001565 return s*int(self._int)*10**self._exp
Raymond Hettinger605ed022004-11-24 07:28:48 +00001566 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001567 return s*int(self._int[:self._exp] or '0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001568
Christian Heimes969fe572008-01-25 11:23:10 +00001569 __trunc__ = __int__
1570
Christian Heimes0bd4e112008-02-12 22:59:25 +00001571 def real(self):
1572 return self
Mark Dickinson315a20a2009-01-04 21:34:18 +00001573 real = property(real)
Christian Heimes0bd4e112008-02-12 22:59:25 +00001574
Christian Heimes0bd4e112008-02-12 22:59:25 +00001575 def imag(self):
1576 return Decimal(0)
Mark Dickinson315a20a2009-01-04 21:34:18 +00001577 imag = property(imag)
Christian Heimes0bd4e112008-02-12 22:59:25 +00001578
1579 def conjugate(self):
1580 return self
1581
1582 def __complex__(self):
1583 return complex(float(self))
1584
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001585 def _fix_nan(self, context):
1586 """Decapitate the payload of a NaN to fit the context"""
1587 payload = self._int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001588
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001589 # maximum length of payload is precision if clamp=0,
1590 # precision-1 if clamp=1.
1591 max_payload_len = context.prec - context.clamp
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001592 if len(payload) > max_payload_len:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001593 payload = payload[len(payload)-max_payload_len:].lstrip('0')
1594 return _dec_from_triple(self._sign, payload, self._exp, True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001595 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001596
Raymond Hettingerdab988d2004-10-09 07:10:44 +00001597 def _fix(self, context):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001598 """Round if it is necessary to keep self within prec precision.
1599
1600 Rounds and fixes the exponent. Does not raise on a sNaN.
1601
1602 Arguments:
1603 self - Decimal instance
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001604 context - context used.
1605 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001606
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001607 if self._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001608 if self._isnan():
1609 # decapitate payload if necessary
1610 return self._fix_nan(context)
1611 else:
1612 # self is +/-Infinity; return unaltered
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001613 return Decimal(self)
1614
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001615 # if self is zero then exponent should be between Etiny and
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001616 # Emax if clamp==0, and between Etiny and Etop if clamp==1.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001617 Etiny = context.Etiny()
1618 Etop = context.Etop()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001619 if not self:
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001620 exp_max = [context.Emax, Etop][context.clamp]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001621 new_exp = min(max(self._exp, Etiny), exp_max)
1622 if new_exp != self._exp:
1623 context._raise_error(Clamped)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001624 return _dec_from_triple(self._sign, '0', new_exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001625 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001626 return Decimal(self)
1627
1628 # exp_min is the smallest allowable exponent of the result,
1629 # equal to max(self.adjusted()-context.prec+1, Etiny)
1630 exp_min = len(self._int) + self._exp - context.prec
1631 if exp_min > Etop:
1632 # overflow: exp_min > Etop iff self.adjusted() > Emax
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001633 ans = context._raise_error(Overflow, 'above Emax', self._sign)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001634 context._raise_error(Inexact)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001635 context._raise_error(Rounded)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001636 return ans
1637
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001638 self_is_subnormal = exp_min < Etiny
1639 if self_is_subnormal:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001640 exp_min = Etiny
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001641
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001642 # round if self has too many digits
1643 if self._exp < exp_min:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001644 digits = len(self._int) + self._exp - exp_min
1645 if digits < 0:
1646 self = _dec_from_triple(self._sign, '1', exp_min-1)
1647 digits = 0
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001648 rounding_method = self._pick_rounding_function[context.rounding]
1649 changed = getattr(self, rounding_method)(digits)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001650 coeff = self._int[:digits] or '0'
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001651 if changed > 0:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001652 coeff = str(int(coeff)+1)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001653 if len(coeff) > context.prec:
1654 coeff = coeff[:-1]
1655 exp_min += 1
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001656
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001657 # check whether the rounding pushed the exponent out of range
1658 if exp_min > Etop:
1659 ans = context._raise_error(Overflow, 'above Emax', self._sign)
1660 else:
1661 ans = _dec_from_triple(self._sign, coeff, exp_min)
1662
1663 # raise the appropriate signals, taking care to respect
1664 # the precedence described in the specification
1665 if changed and self_is_subnormal:
1666 context._raise_error(Underflow)
1667 if self_is_subnormal:
1668 context._raise_error(Subnormal)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001669 if changed:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001670 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001671 context._raise_error(Rounded)
1672 if not ans:
1673 # raise Clamped on underflow to 0
1674 context._raise_error(Clamped)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001675 return ans
1676
Mark Dickinsonc69160e2010-05-04 14:35:33 +00001677 if self_is_subnormal:
1678 context._raise_error(Subnormal)
1679
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00001680 # fold down if clamp == 1 and self has too few digits
1681 if context.clamp == 1 and self._exp > Etop:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001682 context._raise_error(Clamped)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001683 self_padded = self._int + '0'*(self._exp - Etop)
1684 return _dec_from_triple(self._sign, self_padded, Etop)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001685
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001686 # here self was representable to begin with; return unchanged
1687 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001688
1689 _pick_rounding_function = {}
1690
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001691 # for each of the rounding functions below:
1692 # self is a finite, nonzero Decimal
1693 # prec is an integer satisfying 0 <= prec < len(self._int)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001694 #
1695 # each function returns either -1, 0, or 1, as follows:
1696 # 1 indicates that self should be rounded up (away from zero)
1697 # 0 indicates that self should be truncated, and that all the
1698 # digits to be truncated are zeros (so the value is unchanged)
1699 # -1 indicates that there are nonzero digits to be truncated
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001700
1701 def _round_down(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001702 """Also known as round-towards-0, truncate."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001703 if _all_zeros(self._int, prec):
1704 return 0
1705 else:
1706 return -1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001707
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001708 def _round_up(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001709 """Rounds away from 0."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001710 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001711
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001712 def _round_half_up(self, prec):
1713 """Rounds 5 up (away from 0)"""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001714 if self._int[prec] in '56789':
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001715 return 1
1716 elif _all_zeros(self._int, prec):
1717 return 0
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001718 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001719 return -1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001720
1721 def _round_half_down(self, prec):
1722 """Round 5 down"""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001723 if _exact_half(self._int, prec):
1724 return -1
1725 else:
1726 return self._round_half_up(prec)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001727
1728 def _round_half_even(self, prec):
1729 """Round 5 to even, rest to nearest."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001730 if _exact_half(self._int, prec) and \
1731 (prec == 0 or self._int[prec-1] in '02468'):
1732 return -1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001733 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001734 return self._round_half_up(prec)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001735
1736 def _round_ceiling(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001737 """Rounds up (not away from 0 if negative.)"""
1738 if self._sign:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001739 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001740 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001741 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001742
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001743 def _round_floor(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001744 """Rounds down (not towards 0 if negative)"""
1745 if not self._sign:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001746 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001747 else:
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001748 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001749
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001750 def _round_05up(self, prec):
1751 """Round down unless digit prec-1 is 0 or 5."""
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001752 if prec and self._int[prec-1] not in '05':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001753 return self._round_down(prec)
Christian Heimescbf3b5c2007-12-03 21:02:03 +00001754 else:
1755 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001756
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001757 def __round__(self, n=None):
1758 """Round self to the nearest integer, or to a given precision.
1759
1760 If only one argument is supplied, round a finite Decimal
1761 instance self to the nearest integer. If self is infinite or
1762 a NaN then a Python exception is raised. If self is finite
1763 and lies exactly halfway between two integers then it is
1764 rounded to the integer with even last digit.
1765
1766 >>> round(Decimal('123.456'))
1767 123
1768 >>> round(Decimal('-456.789'))
1769 -457
1770 >>> round(Decimal('-3.0'))
1771 -3
1772 >>> round(Decimal('2.5'))
1773 2
1774 >>> round(Decimal('3.5'))
1775 4
1776 >>> round(Decimal('Inf'))
1777 Traceback (most recent call last):
1778 ...
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001779 OverflowError: cannot round an infinity
1780 >>> round(Decimal('NaN'))
1781 Traceback (most recent call last):
1782 ...
Mark Dickinsonb27406c2008-05-09 13:42:33 +00001783 ValueError: cannot round a NaN
1784
1785 If a second argument n is supplied, self is rounded to n
1786 decimal places using the rounding mode for the current
1787 context.
1788
1789 For an integer n, round(self, -n) is exactly equivalent to
1790 self.quantize(Decimal('1En')).
1791
1792 >>> round(Decimal('123.456'), 0)
1793 Decimal('123')
1794 >>> round(Decimal('123.456'), 2)
1795 Decimal('123.46')
1796 >>> round(Decimal('123.456'), -2)
1797 Decimal('1E+2')
1798 >>> round(Decimal('-Infinity'), 37)
1799 Decimal('NaN')
1800 >>> round(Decimal('sNaN123'), 0)
1801 Decimal('NaN123')
1802
1803 """
1804 if n is not None:
1805 # two-argument form: use the equivalent quantize call
1806 if not isinstance(n, int):
1807 raise TypeError('Second argument to round should be integral')
1808 exp = _dec_from_triple(0, '1', -n)
1809 return self.quantize(exp)
1810
1811 # one-argument form
1812 if self._is_special:
1813 if self.is_nan():
1814 raise ValueError("cannot round a NaN")
1815 else:
1816 raise OverflowError("cannot round an infinity")
1817 return int(self._rescale(0, ROUND_HALF_EVEN))
1818
1819 def __floor__(self):
1820 """Return the floor of self, as an integer.
1821
1822 For a finite Decimal instance self, return the greatest
1823 integer n such that n <= self. If self is infinite or a NaN
1824 then a Python exception is raised.
1825
1826 """
1827 if self._is_special:
1828 if self.is_nan():
1829 raise ValueError("cannot round a NaN")
1830 else:
1831 raise OverflowError("cannot round an infinity")
1832 return int(self._rescale(0, ROUND_FLOOR))
1833
1834 def __ceil__(self):
1835 """Return the ceiling of self, as an integer.
1836
1837 For a finite Decimal instance self, return the least integer n
1838 such that n >= self. If self is infinite or a NaN then a
1839 Python exception is raised.
1840
1841 """
1842 if self._is_special:
1843 if self.is_nan():
1844 raise ValueError("cannot round a NaN")
1845 else:
1846 raise OverflowError("cannot round an infinity")
1847 return int(self._rescale(0, ROUND_CEILING))
1848
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001849 def fma(self, other, third, context=None):
1850 """Fused multiply-add.
1851
1852 Returns self*other+third with no rounding of the intermediate
1853 product self*other.
1854
1855 self and other are multiplied together, with no rounding of
1856 the result. The third operand is then added to the result,
1857 and a single final rounding is performed.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001858 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001859
1860 other = _convert_other(other, raiseit=True)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001861
1862 # compute product; raise InvalidOperation if either operand is
1863 # a signaling NaN or if the product is zero times infinity.
1864 if self._is_special or other._is_special:
1865 if context is None:
1866 context = getcontext()
1867 if self._exp == 'N':
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001868 return context._raise_error(InvalidOperation, 'sNaN', self)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001869 if other._exp == 'N':
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001870 return context._raise_error(InvalidOperation, 'sNaN', other)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001871 if self._exp == 'n':
1872 product = self
1873 elif other._exp == 'n':
1874 product = other
1875 elif self._exp == 'F':
1876 if not other:
1877 return context._raise_error(InvalidOperation,
1878 'INF * 0 in fma')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001879 product = _SignedInfinity[self._sign ^ other._sign]
Christian Heimes8b0facf2007-12-04 19:30:01 +00001880 elif other._exp == 'F':
1881 if not self:
1882 return context._raise_error(InvalidOperation,
1883 '0 * INF in fma')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00001884 product = _SignedInfinity[self._sign ^ other._sign]
Christian Heimes8b0facf2007-12-04 19:30:01 +00001885 else:
1886 product = _dec_from_triple(self._sign ^ other._sign,
1887 str(int(self._int) * int(other._int)),
1888 self._exp + other._exp)
1889
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001890 third = _convert_other(third, raiseit=True)
Christian Heimes8b0facf2007-12-04 19:30:01 +00001891 return product.__add__(third, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001892
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001893 def _power_modulo(self, other, modulo, context=None):
1894 """Three argument version of __pow__"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001895
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001896 # if can't convert other and modulo to Decimal, raise
1897 # TypeError; there's no point returning NotImplemented (no
1898 # equivalent of __rpow__ for three argument pow)
1899 other = _convert_other(other, raiseit=True)
1900 modulo = _convert_other(modulo, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001901
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001902 if context is None:
1903 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001904
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001905 # deal with NaNs: if there are any sNaNs then first one wins,
1906 # (i.e. behaviour for NaNs is identical to that of fma)
1907 self_is_nan = self._isnan()
1908 other_is_nan = other._isnan()
1909 modulo_is_nan = modulo._isnan()
1910 if self_is_nan or other_is_nan or modulo_is_nan:
1911 if self_is_nan == 2:
1912 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001913 self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001914 if other_is_nan == 2:
1915 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001916 other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001917 if modulo_is_nan == 2:
1918 return context._raise_error(InvalidOperation, 'sNaN',
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00001919 modulo)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001920 if self_is_nan:
1921 return self._fix_nan(context)
1922 if other_is_nan:
1923 return other._fix_nan(context)
1924 return modulo._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001925
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001926 # check inputs: we apply same restrictions as Python's pow()
1927 if not (self._isinteger() and
1928 other._isinteger() and
1929 modulo._isinteger()):
1930 return context._raise_error(InvalidOperation,
1931 'pow() 3rd argument not allowed '
1932 'unless all arguments are integers')
1933 if other < 0:
1934 return context._raise_error(InvalidOperation,
1935 'pow() 2nd argument cannot be '
1936 'negative when 3rd argument specified')
1937 if not modulo:
1938 return context._raise_error(InvalidOperation,
1939 'pow() 3rd argument cannot be 0')
1940
1941 # additional restriction for decimal: the modulus must be less
1942 # than 10**prec in absolute value
1943 if modulo.adjusted() >= context.prec:
1944 return context._raise_error(InvalidOperation,
1945 'insufficient precision: pow() 3rd '
1946 'argument must not have more than '
1947 'precision digits')
1948
1949 # define 0**0 == NaN, for consistency with two-argument pow
1950 # (even though it hurts!)
1951 if not other and not self:
1952 return context._raise_error(InvalidOperation,
1953 'at least one of pow() 1st argument '
1954 'and 2nd argument must be nonzero ;'
1955 '0**0 is not defined')
1956
1957 # compute sign of result
1958 if other._iseven():
1959 sign = 0
1960 else:
1961 sign = self._sign
1962
1963 # convert modulo to a Python integer, and self and other to
1964 # Decimal integers (i.e. force their exponents to be >= 0)
1965 modulo = abs(int(modulo))
1966 base = _WorkRep(self.to_integral_value())
1967 exponent = _WorkRep(other.to_integral_value())
1968
1969 # compute result using integer pow()
1970 base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
1971 for i in range(exponent.exp):
1972 base = pow(base, 10, modulo)
1973 base = pow(base, exponent.int, modulo)
1974
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00001975 return _dec_from_triple(sign, str(base), 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001976
1977 def _power_exact(self, other, p):
1978 """Attempt to compute self**other exactly.
1979
1980 Given Decimals self and other and an integer p, attempt to
1981 compute an exact result for the power self**other, with p
1982 digits of precision. Return None if self**other is not
1983 exactly representable in p digits.
1984
1985 Assumes that elimination of special cases has already been
1986 performed: self and other must both be nonspecial; self must
1987 be positive and not numerically equal to 1; other must be
1988 nonzero. For efficiency, other._exp should not be too large,
1989 so that 10**abs(other._exp) is a feasible calculation."""
1990
1991 # In the comments below, we write x for the value of self and
1992 # y for the value of other. Write x = xc*10**xe and y =
1993 # yc*10**ye.
1994
1995 # The main purpose of this method is to identify the *failure*
1996 # of x**y to be exactly representable with as little effort as
1997 # possible. So we look for cheap and easy tests that
1998 # eliminate the possibility of x**y being exact. Only if all
1999 # these tests are passed do we go on to actually compute x**y.
2000
2001 # Here's the main idea. First normalize both x and y. We
2002 # express y as a rational m/n, with m and n relatively prime
2003 # and n>0. Then for x**y to be exactly representable (at
2004 # *any* precision), xc must be the nth power of a positive
2005 # integer and xe must be divisible by n. If m is negative
2006 # then additionally xc must be a power of either 2 or 5, hence
2007 # a power of 2**n or 5**n.
2008 #
2009 # There's a limit to how small |y| can be: if y=m/n as above
2010 # then:
2011 #
2012 # (1) if xc != 1 then for the result to be representable we
2013 # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So
2014 # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
2015 # 2**(1/|y|), hence xc**|y| < 2 and the result is not
2016 # representable.
2017 #
2018 # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if
2019 # |y| < 1/|xe| then the result is not representable.
2020 #
2021 # Note that since x is not equal to 1, at least one of (1) and
2022 # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
2023 # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
2024 #
2025 # There's also a limit to how large y can be, at least if it's
2026 # positive: the normalized result will have coefficient xc**y,
2027 # so if it's representable then xc**y < 10**p, and y <
2028 # p/log10(xc). Hence if y*log10(xc) >= p then the result is
2029 # not exactly representable.
2030
2031 # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
2032 # so |y| < 1/xe and the result is not representable.
2033 # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
2034 # < 1/nbits(xc).
2035
2036 x = _WorkRep(self)
2037 xc, xe = x.int, x.exp
2038 while xc % 10 == 0:
2039 xc //= 10
2040 xe += 1
2041
2042 y = _WorkRep(other)
2043 yc, ye = y.int, y.exp
2044 while yc % 10 == 0:
2045 yc //= 10
2046 ye += 1
2047
2048 # case where xc == 1: result is 10**(xe*y), with xe*y
2049 # required to be an integer
2050 if xc == 1:
Mark Dickinsona1236312010-07-08 19:03:34 +00002051 xe *= yc
2052 # result is now 10**(xe * 10**ye); xe * 10**ye must be integral
2053 while xe % 10 == 0:
2054 xe //= 10
2055 ye += 1
2056 if ye < 0:
2057 return None
2058 exponent = xe * 10**ye
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002059 if y.sign == 1:
2060 exponent = -exponent
2061 # if other is a nonnegative integer, use ideal exponent
2062 if other._isinteger() and other._sign == 0:
2063 ideal_exponent = self._exp*int(other)
2064 zeros = min(exponent-ideal_exponent, p-1)
2065 else:
2066 zeros = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002067 return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002068
2069 # case where y is negative: xc must be either a power
2070 # of 2 or a power of 5.
2071 if y.sign == 1:
2072 last_digit = xc % 10
2073 if last_digit in (2,4,6,8):
2074 # quick test for power of 2
2075 if xc & -xc != xc:
2076 return None
2077 # now xc is a power of 2; e is its exponent
2078 e = _nbits(xc)-1
2079 # find e*y and xe*y; both must be integers
2080 if ye >= 0:
2081 y_as_int = yc*10**ye
2082 e = e*y_as_int
2083 xe = xe*y_as_int
2084 else:
2085 ten_pow = 10**-ye
2086 e, remainder = divmod(e*yc, ten_pow)
2087 if remainder:
2088 return None
2089 xe, remainder = divmod(xe*yc, ten_pow)
2090 if remainder:
2091 return None
2092
2093 if e*65 >= p*93: # 93/65 > log(10)/log(5)
2094 return None
2095 xc = 5**e
2096
2097 elif last_digit == 5:
2098 # e >= log_5(xc) if xc is a power of 5; we have
2099 # equality all the way up to xc=5**2658
2100 e = _nbits(xc)*28//65
2101 xc, remainder = divmod(5**e, xc)
2102 if remainder:
2103 return None
2104 while xc % 5 == 0:
2105 xc //= 5
2106 e -= 1
2107 if ye >= 0:
2108 y_as_integer = yc*10**ye
2109 e = e*y_as_integer
2110 xe = xe*y_as_integer
2111 else:
2112 ten_pow = 10**-ye
2113 e, remainder = divmod(e*yc, ten_pow)
2114 if remainder:
2115 return None
2116 xe, remainder = divmod(xe*yc, ten_pow)
2117 if remainder:
2118 return None
2119 if e*3 >= p*10: # 10/3 > log(10)/log(2)
2120 return None
2121 xc = 2**e
2122 else:
2123 return None
2124
2125 if xc >= 10**p:
2126 return None
2127 xe = -e-xe
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002128 return _dec_from_triple(0, str(xc), xe)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002129
2130 # now y is positive; find m and n such that y = m/n
2131 if ye >= 0:
2132 m, n = yc*10**ye, 1
2133 else:
2134 if xe != 0 and len(str(abs(yc*xe))) <= -ye:
2135 return None
2136 xc_bits = _nbits(xc)
2137 if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
2138 return None
2139 m, n = yc, 10**(-ye)
2140 while m % 2 == n % 2 == 0:
2141 m //= 2
2142 n //= 2
2143 while m % 5 == n % 5 == 0:
2144 m //= 5
2145 n //= 5
2146
2147 # compute nth root of xc*10**xe
2148 if n > 1:
2149 # if 1 < xc < 2**n then xc isn't an nth power
2150 if xc != 1 and xc_bits <= n:
2151 return None
2152
2153 xe, rem = divmod(xe, n)
2154 if rem != 0:
2155 return None
2156
2157 # compute nth root of xc using Newton's method
2158 a = 1 << -(-_nbits(xc)//n) # initial estimate
2159 while True:
2160 q, r = divmod(xc, a**(n-1))
2161 if a <= q:
2162 break
2163 else:
2164 a = (a*(n-1) + q)//n
2165 if not (a == q and r == 0):
2166 return None
2167 xc = a
2168
2169 # now xc*10**xe is the nth root of the original xc*10**xe
2170 # compute mth power of xc*10**xe
2171
2172 # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
2173 # 10**p and the result is not representable.
2174 if xc > 1 and m > p*100//_log10_lb(xc):
2175 return None
2176 xc = xc**m
2177 xe *= m
2178 if xc > 10**p:
2179 return None
2180
2181 # by this point the result *is* exactly representable
2182 # adjust the exponent to get as close as possible to the ideal
2183 # exponent, if necessary
2184 str_xc = str(xc)
2185 if other._isinteger() and other._sign == 0:
2186 ideal_exponent = self._exp*int(other)
2187 zeros = min(xe-ideal_exponent, p-len(str_xc))
2188 else:
2189 zeros = 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002190 return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002191
2192 def __pow__(self, other, modulo=None, context=None):
2193 """Return self ** other [ % modulo].
2194
2195 With two arguments, compute self**other.
2196
2197 With three arguments, compute (self**other) % modulo. For the
2198 three argument form, the following restrictions on the
2199 arguments hold:
2200
2201 - all three arguments must be integral
2202 - other must be nonnegative
2203 - either self or other (or both) must be nonzero
2204 - modulo must be nonzero and must have at most p digits,
2205 where p is the context precision.
2206
2207 If any of these restrictions is violated the InvalidOperation
2208 flag is raised.
2209
2210 The result of pow(self, other, modulo) is identical to the
2211 result that would be obtained by computing (self**other) %
2212 modulo with unbounded precision, but is computed more
2213 efficiently. It is always exact.
2214 """
2215
2216 if modulo is not None:
2217 return self._power_modulo(other, modulo, context)
2218
2219 other = _convert_other(other)
2220 if other is NotImplemented:
2221 return other
2222
2223 if context is None:
2224 context = getcontext()
2225
2226 # either argument is a NaN => result is NaN
2227 ans = self._check_nans(other, context)
2228 if ans:
2229 return ans
2230
2231 # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
2232 if not other:
2233 if not self:
2234 return context._raise_error(InvalidOperation, '0 ** 0')
2235 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002236 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002237
2238 # result has sign 1 iff self._sign is 1 and other is an odd integer
2239 result_sign = 0
2240 if self._sign == 1:
2241 if other._isinteger():
2242 if not other._iseven():
2243 result_sign = 1
2244 else:
2245 # -ve**noninteger = NaN
2246 # (-0)**noninteger = 0**noninteger
2247 if self:
2248 return context._raise_error(InvalidOperation,
2249 'x ** y with x negative and y not an integer')
2250 # negate self, without doing any unwanted rounding
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002251 self = self.copy_negate()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002252
2253 # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
2254 if not self:
2255 if other._sign == 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002256 return _dec_from_triple(result_sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002257 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002258 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002259
2260 # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002261 if self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002262 if other._sign == 0:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002263 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002264 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002265 return _dec_from_triple(result_sign, '0', 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002266
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002267 # 1**other = 1, but the choice of exponent and the flags
2268 # depend on the exponent of self, and on whether other is a
2269 # positive integer, a negative integer, or neither
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002270 if self == _One:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002271 if other._isinteger():
2272 # exp = max(self._exp*max(int(other), 0),
2273 # 1-context.prec) but evaluating int(other) directly
2274 # is dangerous until we know other is small (other
2275 # could be 1e999999999)
2276 if other._sign == 1:
2277 multiplier = 0
2278 elif other > context.prec:
2279 multiplier = context.prec
2280 else:
2281 multiplier = int(other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002282
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002283 exp = self._exp * multiplier
2284 if exp < 1-context.prec:
2285 exp = 1-context.prec
2286 context._raise_error(Rounded)
2287 else:
2288 context._raise_error(Inexact)
2289 context._raise_error(Rounded)
2290 exp = 1-context.prec
2291
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002292 return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002293
2294 # compute adjusted exponent of self
2295 self_adj = self.adjusted()
2296
2297 # self ** infinity is infinity if self > 1, 0 if self < 1
2298 # self ** -infinity is infinity if self < 1, 0 if self > 1
2299 if other._isinfinity():
2300 if (other._sign == 0) == (self_adj < 0):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002301 return _dec_from_triple(result_sign, '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002302 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002303 return _SignedInfinity[result_sign]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002304
2305 # from here on, the result always goes through the call
2306 # to _fix at the end of this function.
2307 ans = None
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002308 exact = False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002309
2310 # crude test to catch cases of extreme overflow/underflow. If
2311 # log10(self)*other >= 10**bound and bound >= len(str(Emax))
2312 # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
2313 # self**other >= 10**(Emax+1), so overflow occurs. The test
2314 # for underflow is similar.
2315 bound = self._log10_exp_bound() + other.adjusted()
2316 if (self_adj >= 0) == (other._sign == 0):
2317 # self > 1 and other +ve, or self < 1 and other -ve
2318 # possibility of overflow
2319 if bound >= len(str(context.Emax)):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002320 ans = _dec_from_triple(result_sign, '1', context.Emax+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002321 else:
2322 # self > 1 and other -ve, or self < 1 and other +ve
2323 # possibility of underflow to 0
2324 Etiny = context.Etiny()
2325 if bound >= len(str(-Etiny)):
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002326 ans = _dec_from_triple(result_sign, '1', Etiny-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002327
2328 # try for an exact result with precision +1
2329 if ans is None:
2330 ans = self._power_exact(other, context.prec + 1)
Mark Dickinsone42f1bb2010-07-08 19:09:16 +00002331 if ans is not None:
2332 if result_sign == 1:
2333 ans = _dec_from_triple(1, ans._int, ans._exp)
2334 exact = True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002335
2336 # usual case: inexact result, x**y computed directly as exp(y*log(x))
2337 if ans is None:
2338 p = context.prec
2339 x = _WorkRep(self)
2340 xc, xe = x.int, x.exp
2341 y = _WorkRep(other)
2342 yc, ye = y.int, y.exp
2343 if y.sign == 1:
2344 yc = -yc
2345
2346 # compute correctly rounded result: start with precision +3,
2347 # then increase precision until result is unambiguously roundable
2348 extra = 3
2349 while True:
2350 coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
2351 if coeff % (5*10**(len(str(coeff))-p-1)):
2352 break
2353 extra += 3
2354
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002355 ans = _dec_from_triple(result_sign, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002356
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002357 # unlike exp, ln and log10, the power function respects the
2358 # rounding mode; no need to switch to ROUND_HALF_EVEN here
2359
2360 # There's a difficulty here when 'other' is not an integer and
2361 # the result is exact. In this case, the specification
2362 # requires that the Inexact flag be raised (in spite of
2363 # exactness), but since the result is exact _fix won't do this
2364 # for us. (Correspondingly, the Underflow signal should also
2365 # be raised for subnormal results.) We can't directly raise
2366 # these signals either before or after calling _fix, since
2367 # that would violate the precedence for signals. So we wrap
2368 # the ._fix call in a temporary context, and reraise
2369 # afterwards.
2370 if exact and not other._isinteger():
2371 # pad with zeros up to length context.prec+1 if necessary; this
2372 # ensures that the Rounded signal will be raised.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002373 if len(ans._int) <= context.prec:
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002374 expdiff = context.prec + 1 - len(ans._int)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002375 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
2376 ans._exp-expdiff)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002377
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002378 # create a copy of the current context, with cleared flags/traps
2379 newcontext = context.copy()
2380 newcontext.clear_flags()
2381 for exception in _signals:
2382 newcontext.traps[exception] = 0
2383
2384 # round in the new context
2385 ans = ans._fix(newcontext)
2386
2387 # raise Inexact, and if necessary, Underflow
2388 newcontext._raise_error(Inexact)
2389 if newcontext.flags[Subnormal]:
2390 newcontext._raise_error(Underflow)
2391
2392 # propagate signals to the original context; _fix could
2393 # have raised any of Overflow, Underflow, Subnormal,
2394 # Inexact, Rounded, Clamped. Overflow needs the correct
2395 # arguments. Note that the order of the exceptions is
2396 # important here.
2397 if newcontext.flags[Overflow]:
2398 context._raise_error(Overflow, 'above Emax', ans._sign)
2399 for exception in Underflow, Subnormal, Inexact, Rounded, Clamped:
2400 if newcontext.flags[exception]:
2401 context._raise_error(exception)
2402
2403 else:
2404 ans = ans._fix(context)
2405
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002406 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002407
2408 def __rpow__(self, other, context=None):
2409 """Swaps self/other and returns __pow__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002410 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00002411 if other is NotImplemented:
2412 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002413 return other.__pow__(self, context=context)
2414
2415 def normalize(self, context=None):
2416 """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002417
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002418 if context is None:
2419 context = getcontext()
2420
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002421 if self._is_special:
2422 ans = self._check_nans(context=context)
2423 if ans:
2424 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002425
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002426 dup = self._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002427 if dup._isinfinity():
2428 return dup
2429
2430 if not dup:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002431 return _dec_from_triple(dup._sign, '0', 0)
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00002432 exp_max = [context.Emax, context.Etop()][context.clamp]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002433 end = len(dup._int)
2434 exp = dup._exp
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002435 while dup._int[end-1] == '0' and exp < exp_max:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002436 exp += 1
2437 end -= 1
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002438 return _dec_from_triple(dup._sign, dup._int[:end], exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002439
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002440 def quantize(self, exp, rounding=None, context=None, watchexp=True):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002441 """Quantize self so its exponent is the same as that of exp.
2442
2443 Similar to self._rescale(exp._exp) but with error checking.
2444 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002445 exp = _convert_other(exp, raiseit=True)
2446
2447 if context is None:
2448 context = getcontext()
2449 if rounding is None:
2450 rounding = context.rounding
2451
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002452 if self._is_special or exp._is_special:
2453 ans = self._check_nans(exp, context)
2454 if ans:
2455 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002456
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002457 if exp._isinfinity() or self._isinfinity():
2458 if exp._isinfinity() and self._isinfinity():
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002459 return Decimal(self) # if both are inf, it is OK
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002460 return context._raise_error(InvalidOperation,
2461 'quantize with one INF')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002462
2463 # if we're not watching exponents, do a simple rescale
2464 if not watchexp:
2465 ans = self._rescale(exp._exp, rounding)
2466 # raise Inexact and Rounded where appropriate
2467 if ans._exp > self._exp:
2468 context._raise_error(Rounded)
2469 if ans != self:
2470 context._raise_error(Inexact)
2471 return ans
2472
2473 # exp._exp should be between Etiny and Emax
2474 if not (context.Etiny() <= exp._exp <= context.Emax):
2475 return context._raise_error(InvalidOperation,
2476 'target exponent out of bounds in quantize')
2477
2478 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002479 ans = _dec_from_triple(self._sign, '0', exp._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002480 return ans._fix(context)
2481
2482 self_adjusted = self.adjusted()
2483 if self_adjusted > context.Emax:
2484 return context._raise_error(InvalidOperation,
2485 'exponent of quantize result too large for current context')
2486 if self_adjusted - exp._exp + 1 > context.prec:
2487 return context._raise_error(InvalidOperation,
2488 'quantize result has too many digits for current context')
2489
2490 ans = self._rescale(exp._exp, rounding)
2491 if ans.adjusted() > context.Emax:
2492 return context._raise_error(InvalidOperation,
2493 'exponent of quantize result too large for current context')
2494 if len(ans._int) > context.prec:
2495 return context._raise_error(InvalidOperation,
2496 'quantize result has too many digits for current context')
2497
2498 # raise appropriate flags
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002499 if ans and ans.adjusted() < context.Emin:
2500 context._raise_error(Subnormal)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002501 if ans._exp > self._exp:
2502 if ans != self:
2503 context._raise_error(Inexact)
2504 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002505
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002506 # call to fix takes care of any necessary folddown, and
2507 # signals Clamped if necessary
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002508 ans = ans._fix(context)
2509 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002510
2511 def same_quantum(self, other):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002512 """Return True if self and other have the same exponent; otherwise
2513 return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002514
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002515 If either operand is a special value, the following rules are used:
2516 * return True if both operands are infinities
2517 * return True if both operands are NaNs
2518 * otherwise, return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002519 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002520 other = _convert_other(other, raiseit=True)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002521 if self._is_special or other._is_special:
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002522 return (self.is_nan() and other.is_nan() or
2523 self.is_infinite() and other.is_infinite())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002524 return self._exp == other._exp
2525
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002526 def _rescale(self, exp, rounding):
2527 """Rescale self so that the exponent is exp, either by padding with zeros
2528 or by truncating digits, using the given rounding mode.
2529
2530 Specials are returned without change. This operation is
2531 quiet: it raises no flags, and uses no information from the
2532 context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002533
2534 exp = exp to scale to (an integer)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002535 rounding = rounding mode
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002536 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002537 if self._is_special:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002538 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002539 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002540 return _dec_from_triple(self._sign, '0', exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002541
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002542 if self._exp >= exp:
2543 # pad answer with zeros if necessary
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002544 return _dec_from_triple(self._sign,
2545 self._int + '0'*(self._exp - exp), exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002546
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002547 # too many digits; round and lose data. If self.adjusted() <
2548 # exp-1, replace self by 10**(exp-1) before rounding
2549 digits = len(self._int) + self._exp - exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002550 if digits < 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002551 self = _dec_from_triple(self._sign, '1', exp-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002552 digits = 0
2553 this_function = getattr(self, self._pick_rounding_function[rounding])
Christian Heimescbf3b5c2007-12-03 21:02:03 +00002554 changed = this_function(digits)
2555 coeff = self._int[:digits] or '0'
2556 if changed == 1:
2557 coeff = str(int(coeff)+1)
2558 return _dec_from_triple(self._sign, coeff, exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002559
Christian Heimesf16baeb2008-02-29 14:57:44 +00002560 def _round(self, places, rounding):
2561 """Round a nonzero, nonspecial Decimal to a fixed number of
2562 significant figures, using the given rounding mode.
2563
2564 Infinities, NaNs and zeros are returned unaltered.
2565
2566 This operation is quiet: it raises no flags, and uses no
2567 information from the context.
2568
2569 """
2570 if places <= 0:
2571 raise ValueError("argument should be at least 1 in _round")
2572 if self._is_special or not self:
2573 return Decimal(self)
2574 ans = self._rescale(self.adjusted()+1-places, rounding)
2575 # it can happen that the rescale alters the adjusted exponent;
2576 # for example when rounding 99.97 to 3 significant figures.
2577 # When this happens we end up with an extra 0 at the end of
2578 # the number; a second rescale fixes this.
2579 if ans.adjusted() != self.adjusted():
2580 ans = ans._rescale(ans.adjusted()+1-places, rounding)
2581 return ans
2582
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002583 def to_integral_exact(self, rounding=None, context=None):
2584 """Rounds to a nearby integer.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002585
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002586 If no rounding mode is specified, take the rounding mode from
2587 the context. This method raises the Rounded and Inexact flags
2588 when appropriate.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002589
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002590 See also: to_integral_value, which does exactly the same as
2591 this method except that it doesn't raise Inexact or Rounded.
2592 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002593 if self._is_special:
2594 ans = self._check_nans(context=context)
2595 if ans:
2596 return ans
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002597 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002598 if self._exp >= 0:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002599 return Decimal(self)
2600 if not self:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002601 return _dec_from_triple(self._sign, '0', 0)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002602 if context is None:
2603 context = getcontext()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002604 if rounding is None:
2605 rounding = context.rounding
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002606 ans = self._rescale(0, rounding)
2607 if ans != self:
2608 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00002609 context._raise_error(Rounded)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002610 return ans
2611
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002612 def to_integral_value(self, rounding=None, context=None):
2613 """Rounds to the nearest integer, without raising inexact, rounded."""
2614 if context is None:
2615 context = getcontext()
2616 if rounding is None:
2617 rounding = context.rounding
2618 if self._is_special:
2619 ans = self._check_nans(context=context)
2620 if ans:
2621 return ans
2622 return Decimal(self)
2623 if self._exp >= 0:
2624 return Decimal(self)
2625 else:
2626 return self._rescale(0, rounding)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002627
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002628 # the method name changed, but we provide also the old one, for compatibility
2629 to_integral = to_integral_value
2630
2631 def sqrt(self, context=None):
2632 """Return the square root of self."""
Christian Heimes0348fb62008-03-26 12:55:56 +00002633 if context is None:
2634 context = getcontext()
2635
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002636 if self._is_special:
2637 ans = self._check_nans(context=context)
2638 if ans:
2639 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002640
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002641 if self._isinfinity() and self._sign == 0:
2642 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002643
2644 if not self:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002645 # exponent = self._exp // 2. sqrt(-0) = -0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002646 ans = _dec_from_triple(self._sign, '0', self._exp // 2)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002647 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002648
2649 if self._sign == 1:
2650 return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
2651
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002652 # At this point self represents a positive number. Let p be
2653 # the desired precision and express self in the form c*100**e
2654 # with c a positive real number and e an integer, c and e
2655 # being chosen so that 100**(p-1) <= c < 100**p. Then the
2656 # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
2657 # <= sqrt(c) < 10**p, so the closest representable Decimal at
2658 # precision p is n*10**e where n = round_half_even(sqrt(c)),
2659 # the closest integer to sqrt(c) with the even integer chosen
2660 # in the case of a tie.
2661 #
2662 # To ensure correct rounding in all cases, we use the
2663 # following trick: we compute the square root to an extra
2664 # place (precision p+1 instead of precision p), rounding down.
2665 # Then, if the result is inexact and its last digit is 0 or 5,
2666 # we increase the last digit to 1 or 6 respectively; if it's
2667 # exact we leave the last digit alone. Now the final round to
2668 # p places (or fewer in the case of underflow) will round
2669 # correctly and raise the appropriate flags.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002670
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002671 # use an extra digit of precision
2672 prec = context.prec+1
2673
2674 # write argument in the form c*100**e where e = self._exp//2
2675 # is the 'ideal' exponent, to be used if the square root is
2676 # exactly representable. l is the number of 'digits' of c in
2677 # base 100, so that 100**(l-1) <= c < 100**l.
2678 op = _WorkRep(self)
2679 e = op.exp >> 1
2680 if op.exp & 1:
2681 c = op.int * 10
2682 l = (len(self._int) >> 1) + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002683 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002684 c = op.int
2685 l = len(self._int)+1 >> 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002686
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002687 # rescale so that c has exactly prec base 100 'digits'
2688 shift = prec-l
2689 if shift >= 0:
2690 c *= 100**shift
2691 exact = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002692 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002693 c, remainder = divmod(c, 100**-shift)
2694 exact = not remainder
2695 e -= shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002696
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002697 # find n = floor(sqrt(c)) using Newton's method
2698 n = 10**prec
2699 while True:
2700 q = c//n
2701 if n <= q:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002702 break
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002703 else:
2704 n = n + q >> 1
2705 exact = exact and n*n == c
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002706
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002707 if exact:
2708 # result is exact; rescale to use ideal exponent e
2709 if shift >= 0:
2710 # assert n % 10**shift == 0
2711 n //= 10**shift
2712 else:
2713 n *= 10**-shift
2714 e += shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002715 else:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002716 # result is not exact; fix last digit as described above
2717 if n % 5 == 0:
2718 n += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002719
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002720 ans = _dec_from_triple(0, str(n), e)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002721
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002722 # round, and fit to current context
2723 context = context._shallow_copy()
2724 rounding = context._set_rounding(ROUND_HALF_EVEN)
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002725 ans = ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002726 context.rounding = rounding
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002727
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002728 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002729
2730 def max(self, other, context=None):
2731 """Returns the larger value.
2732
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002733 Like max(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002734 NaN (and signals if one is sNaN). Also rounds.
2735 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002736 other = _convert_other(other, raiseit=True)
2737
2738 if context is None:
2739 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002740
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002741 if self._is_special or other._is_special:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002742 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002743 # number is always returned
2744 sn = self._isnan()
2745 on = other._isnan()
2746 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00002747 if on == 1 and sn == 0:
2748 return self._fix(context)
2749 if sn == 1 and on == 0:
2750 return other._fix(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002751 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002752
Christian Heimes77c02eb2008-02-09 02:18:51 +00002753 c = self._cmp(other)
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002754 if c == 0:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002755 # If both operands are finite and equal in numerical value
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002756 # then an ordering is applied:
2757 #
Guido van Rossumd8faa362007-04-27 19:54:29 +00002758 # If the signs differ then max returns the operand with the
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002759 # positive sign and min returns the operand with the negative sign
2760 #
Guido van Rossumd8faa362007-04-27 19:54:29 +00002761 # If the signs are the same then the exponent is used to select
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002762 # the result. This is exactly the ordering used in compare_total.
2763 c = self.compare_total(other)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002764
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002765 if c == -1:
2766 ans = other
2767 else:
2768 ans = self
2769
Christian Heimes2c181612007-12-17 20:04:13 +00002770 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002771
2772 def min(self, other, context=None):
2773 """Returns the smaller value.
2774
Guido van Rossumd8faa362007-04-27 19:54:29 +00002775 Like min(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002776 NaN (and signals if one is sNaN). Also rounds.
2777 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002778 other = _convert_other(other, raiseit=True)
2779
2780 if context is None:
2781 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002782
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002783 if self._is_special or other._is_special:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002784 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002785 # number is always returned
2786 sn = self._isnan()
2787 on = other._isnan()
2788 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00002789 if on == 1 and sn == 0:
2790 return self._fix(context)
2791 if sn == 1 and on == 0:
2792 return other._fix(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002793 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002794
Christian Heimes77c02eb2008-02-09 02:18:51 +00002795 c = self._cmp(other)
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002796 if c == 0:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002797 c = self.compare_total(other)
2798
2799 if c == -1:
2800 ans = self
2801 else:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002802 ans = other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002803
Christian Heimes2c181612007-12-17 20:04:13 +00002804 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002805
2806 def _isinteger(self):
2807 """Returns whether self is an integer"""
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002808 if self._is_special:
2809 return False
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002810 if self._exp >= 0:
2811 return True
2812 rest = self._int[self._exp:]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002813 return rest == '0'*len(rest)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002814
2815 def _iseven(self):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002816 """Returns True if self is even. Assumes self is an integer."""
2817 if not self or self._exp > 0:
2818 return True
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002819 return self._int[-1+self._exp] in '02468'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002820
2821 def adjusted(self):
2822 """Return the adjusted exponent of self"""
2823 try:
2824 return self._exp + len(self._int) - 1
Guido van Rossumd8faa362007-04-27 19:54:29 +00002825 # If NaN or Infinity, self._exp is string
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002826 except TypeError:
2827 return 0
2828
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002829 def canonical(self, context=None):
2830 """Returns the same Decimal object.
2831
2832 As we do not have different encodings for the same number, the
2833 received object already is in its canonical form.
2834 """
2835 return self
2836
2837 def compare_signal(self, other, context=None):
2838 """Compares self to the other operand numerically.
2839
2840 It's pretty much like compare(), but all NaNs signal, with signaling
2841 NaNs taking precedence over quiet NaNs.
2842 """
Christian Heimes77c02eb2008-02-09 02:18:51 +00002843 other = _convert_other(other, raiseit = True)
2844 ans = self._compare_check_nans(other, context)
2845 if ans:
2846 return ans
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002847 return self.compare(other, context=context)
2848
2849 def compare_total(self, other):
2850 """Compares self to other using the abstract representations.
2851
2852 This is not like the standard compare, which use their numerical
2853 value. Note that a total ordering is defined for all possible abstract
2854 representations.
2855 """
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00002856 other = _convert_other(other, raiseit=True)
2857
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002858 # if one is negative and the other is positive, it's easy
2859 if self._sign and not other._sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002860 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002861 if not self._sign and other._sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002862 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002863 sign = self._sign
2864
2865 # let's handle both NaN types
2866 self_nan = self._isnan()
2867 other_nan = other._isnan()
2868 if self_nan or other_nan:
2869 if self_nan == other_nan:
Mark Dickinsond314e1b2009-08-28 13:39:53 +00002870 # compare payloads as though they're integers
2871 self_key = len(self._int), self._int
2872 other_key = len(other._int), other._int
2873 if self_key < other_key:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002874 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002875 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002876 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002877 return _NegativeOne
Mark Dickinsond314e1b2009-08-28 13:39:53 +00002878 if self_key > other_key:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002879 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002880 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002881 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002882 return _One
2883 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002884
2885 if sign:
2886 if self_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002887 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002888 if other_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002889 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002890 if self_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002891 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002892 if other_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002893 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002894 else:
2895 if self_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002896 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002897 if other_nan == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002898 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002899 if self_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002900 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002901 if other_nan == 2:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002902 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002903
2904 if self < other:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002905 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002906 if self > other:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002907 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002908
2909 if self._exp < other._exp:
2910 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002911 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002912 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002913 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002914 if self._exp > other._exp:
2915 if sign:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002916 return _NegativeOne
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002917 else:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002918 return _One
2919 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002920
2921
2922 def compare_total_mag(self, other):
2923 """Compares self to other using abstract repr., ignoring sign.
2924
2925 Like compare_total, but with operand's sign ignored and assumed to be 0.
2926 """
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00002927 other = _convert_other(other, raiseit=True)
2928
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002929 s = self.copy_abs()
2930 o = other.copy_abs()
2931 return s.compare_total(o)
2932
2933 def copy_abs(self):
2934 """Returns a copy with the sign set to 0. """
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002935 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002936
2937 def copy_negate(self):
2938 """Returns a copy with the sign inverted."""
2939 if self._sign:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002940 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002941 else:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002942 return _dec_from_triple(1, self._int, self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002943
2944 def copy_sign(self, other):
2945 """Returns self with the sign of other."""
Mark Dickinson84230a12010-02-18 14:49:50 +00002946 other = _convert_other(other, raiseit=True)
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002947 return _dec_from_triple(other._sign, self._int,
2948 self._exp, self._is_special)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002949
2950 def exp(self, context=None):
2951 """Returns e ** self."""
2952
2953 if context is None:
2954 context = getcontext()
2955
2956 # exp(NaN) = NaN
2957 ans = self._check_nans(context=context)
2958 if ans:
2959 return ans
2960
2961 # exp(-Infinity) = 0
2962 if self._isinfinity() == -1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002963 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002964
2965 # exp(0) = 1
2966 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00002967 return _One
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002968
2969 # exp(Infinity) = Infinity
2970 if self._isinfinity() == 1:
2971 return Decimal(self)
2972
2973 # the result is now guaranteed to be inexact (the true
2974 # mathematical result is transcendental). There's no need to
2975 # raise Rounded and Inexact here---they'll always be raised as
2976 # a result of the call to _fix.
2977 p = context.prec
2978 adj = self.adjusted()
2979
2980 # we only need to do any computation for quite a small range
2981 # of adjusted exponents---for example, -29 <= adj <= 10 for
2982 # the default context. For smaller exponent the result is
2983 # indistinguishable from 1 at the given precision, while for
2984 # larger exponent the result either overflows or underflows.
2985 if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
2986 # overflow
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002987 ans = _dec_from_triple(0, '1', context.Emax+1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002988 elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
2989 # underflow to 0
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002990 ans = _dec_from_triple(0, '1', context.Etiny()-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002991 elif self._sign == 0 and adj < -p:
2992 # p+1 digits; final round will raise correct flags
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002993 ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002994 elif self._sign == 1 and adj < -p-1:
2995 # p+1 digits; final round will raise correct flags
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00002996 ans = _dec_from_triple(0, '9'*(p+1), -p-1)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002997 # general case
2998 else:
2999 op = _WorkRep(self)
3000 c, e = op.int, op.exp
3001 if op.sign == 1:
3002 c = -c
3003
3004 # compute correctly rounded result: increase precision by
3005 # 3 digits at a time until we get an unambiguously
3006 # roundable result
3007 extra = 3
3008 while True:
3009 coeff, exp = _dexp(c, e, p+extra)
3010 if coeff % (5*10**(len(str(coeff))-p-1)):
3011 break
3012 extra += 3
3013
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003014 ans = _dec_from_triple(0, str(coeff), exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003015
3016 # at this stage, ans should round correctly with *any*
3017 # rounding mode, not just with ROUND_HALF_EVEN
3018 context = context._shallow_copy()
3019 rounding = context._set_rounding(ROUND_HALF_EVEN)
3020 ans = ans._fix(context)
3021 context.rounding = rounding
3022
3023 return ans
3024
3025 def is_canonical(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003026 """Return True if self is canonical; otherwise return False.
3027
3028 Currently, the encoding of a Decimal instance is always
3029 canonical, so this method returns True for any Decimal.
3030 """
3031 return True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003032
3033 def is_finite(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003034 """Return True if self is finite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003035
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003036 A Decimal instance is considered finite if it is neither
3037 infinite nor a NaN.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003038 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003039 return not self._is_special
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003040
3041 def is_infinite(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003042 """Return True if self is infinite; otherwise return False."""
3043 return self._exp == 'F'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003044
3045 def is_nan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003046 """Return True if self is a qNaN or sNaN; otherwise return False."""
3047 return self._exp in ('n', 'N')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003048
3049 def is_normal(self, context=None):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003050 """Return True if self is a normal number; otherwise return False."""
3051 if self._is_special or not self:
3052 return False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003053 if context is None:
3054 context = getcontext()
Mark Dickinson06bb6742009-10-20 13:38:04 +00003055 return context.Emin <= self.adjusted()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003056
3057 def is_qnan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003058 """Return True if self is a quiet NaN; otherwise return False."""
3059 return self._exp == 'n'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003060
3061 def is_signed(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003062 """Return True if self is negative; otherwise return False."""
3063 return self._sign == 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003064
3065 def is_snan(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003066 """Return True if self is a signaling NaN; otherwise return False."""
3067 return self._exp == 'N'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003068
3069 def is_subnormal(self, context=None):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003070 """Return True if self is subnormal; otherwise return False."""
3071 if self._is_special or not self:
3072 return False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003073 if context is None:
3074 context = getcontext()
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003075 return self.adjusted() < context.Emin
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003076
3077 def is_zero(self):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00003078 """Return True if self is a zero; otherwise return False."""
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003079 return not self._is_special and self._int == '0'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003080
3081 def _ln_exp_bound(self):
3082 """Compute a lower bound for the adjusted exponent of self.ln().
3083 In other words, compute r such that self.ln() >= 10**r. Assumes
3084 that self is finite and positive and that self != 1.
3085 """
3086
3087 # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
3088 adj = self._exp + len(self._int) - 1
3089 if adj >= 1:
3090 # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
3091 return len(str(adj*23//10)) - 1
3092 if adj <= -2:
3093 # argument <= 0.1
3094 return len(str((-1-adj)*23//10)) - 1
3095 op = _WorkRep(self)
3096 c, e = op.int, op.exp
3097 if adj == 0:
3098 # 1 < self < 10
3099 num = str(c-10**-e)
3100 den = str(c)
3101 return len(num) - len(den) - (num < den)
3102 # adj == -1, 0.1 <= self < 1
3103 return e + len(str(10**-e - c)) - 1
3104
3105
3106 def ln(self, context=None):
3107 """Returns the natural (base e) logarithm of self."""
3108
3109 if context is None:
3110 context = getcontext()
3111
3112 # ln(NaN) = NaN
3113 ans = self._check_nans(context=context)
3114 if ans:
3115 return ans
3116
3117 # ln(0.0) == -Infinity
3118 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003119 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003120
3121 # ln(Infinity) = Infinity
3122 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003123 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003124
3125 # ln(1.0) == 0.0
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003126 if self == _One:
3127 return _Zero
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003128
3129 # ln(negative) raises InvalidOperation
3130 if self._sign == 1:
3131 return context._raise_error(InvalidOperation,
3132 'ln of a negative value')
3133
3134 # result is irrational, so necessarily inexact
3135 op = _WorkRep(self)
3136 c, e = op.int, op.exp
3137 p = context.prec
3138
3139 # correctly rounded result: repeatedly increase precision by 3
3140 # until we get an unambiguously roundable result
3141 places = p - self._ln_exp_bound() + 2 # at least p+3 places
3142 while True:
3143 coeff = _dlog(c, e, places)
3144 # assert len(str(abs(coeff)))-p >= 1
3145 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3146 break
3147 places += 3
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003148 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003149
3150 context = context._shallow_copy()
3151 rounding = context._set_rounding(ROUND_HALF_EVEN)
3152 ans = ans._fix(context)
3153 context.rounding = rounding
3154 return ans
3155
3156 def _log10_exp_bound(self):
3157 """Compute a lower bound for the adjusted exponent of self.log10().
3158 In other words, find r such that self.log10() >= 10**r.
3159 Assumes that self is finite and positive and that self != 1.
3160 """
3161
3162 # For x >= 10 or x < 0.1 we only need a bound on the integer
3163 # part of log10(self), and this comes directly from the
3164 # exponent of x. For 0.1 <= x <= 10 we use the inequalities
3165 # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
3166 # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0
3167
3168 adj = self._exp + len(self._int) - 1
3169 if adj >= 1:
3170 # self >= 10
3171 return len(str(adj))-1
3172 if adj <= -2:
3173 # self < 0.1
3174 return len(str(-1-adj))-1
3175 op = _WorkRep(self)
3176 c, e = op.int, op.exp
3177 if adj == 0:
3178 # 1 < self < 10
3179 num = str(c-10**-e)
3180 den = str(231*c)
3181 return len(num) - len(den) - (num < den) + 2
3182 # adj == -1, 0.1 <= self < 1
3183 num = str(10**-e-c)
3184 return len(num) + e - (num < "231") - 1
3185
3186 def log10(self, context=None):
3187 """Returns the base 10 logarithm of self."""
3188
3189 if context is None:
3190 context = getcontext()
3191
3192 # log10(NaN) = NaN
3193 ans = self._check_nans(context=context)
3194 if ans:
3195 return ans
3196
3197 # log10(0.0) == -Infinity
3198 if not self:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003199 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003200
3201 # log10(Infinity) = Infinity
3202 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003203 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003204
3205 # log10(negative or -Infinity) raises InvalidOperation
3206 if self._sign == 1:
3207 return context._raise_error(InvalidOperation,
3208 'log10 of a negative value')
3209
3210 # log10(10**n) = n
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003211 if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003212 # answer may need rounding
3213 ans = Decimal(self._exp + len(self._int) - 1)
3214 else:
3215 # result is irrational, so necessarily inexact
3216 op = _WorkRep(self)
3217 c, e = op.int, op.exp
3218 p = context.prec
3219
3220 # correctly rounded result: repeatedly increase precision
3221 # until result is unambiguously roundable
3222 places = p-self._log10_exp_bound()+2
3223 while True:
3224 coeff = _dlog10(c, e, places)
3225 # assert len(str(abs(coeff)))-p >= 1
3226 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3227 break
3228 places += 3
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003229 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003230
3231 context = context._shallow_copy()
3232 rounding = context._set_rounding(ROUND_HALF_EVEN)
3233 ans = ans._fix(context)
3234 context.rounding = rounding
3235 return ans
3236
3237 def logb(self, context=None):
3238 """ Returns the exponent of the magnitude of self's MSD.
3239
3240 The result is the integer which is the exponent of the magnitude
3241 of the most significant digit of self (as though it were truncated
3242 to a single digit while maintaining the value of that digit and
3243 without limiting the resulting exponent).
3244 """
3245 # logb(NaN) = NaN
3246 ans = self._check_nans(context=context)
3247 if ans:
3248 return ans
3249
3250 if context is None:
3251 context = getcontext()
3252
3253 # logb(+/-Inf) = +Inf
3254 if self._isinfinity():
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003255 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003256
3257 # logb(0) = -Inf, DivisionByZero
3258 if not self:
3259 return context._raise_error(DivisionByZero, 'logb(0)', 1)
3260
3261 # otherwise, simply return the adjusted exponent of self, as a
3262 # Decimal. Note that no attempt is made to fit the result
3263 # into the current context.
Mark Dickinson56df8872009-10-07 19:23:50 +00003264 ans = Decimal(self.adjusted())
3265 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003266
3267 def _islogical(self):
3268 """Return True if self is a logical operand.
3269
Christian Heimes679db4a2008-01-18 09:56:22 +00003270 For being logical, it must be a finite number with a sign of 0,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003271 an exponent of 0, and a coefficient whose digits must all be
3272 either 0 or 1.
3273 """
3274 if self._sign != 0 or self._exp != 0:
3275 return False
3276 for dig in self._int:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003277 if dig not in '01':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003278 return False
3279 return True
3280
3281 def _fill_logical(self, context, opa, opb):
3282 dif = context.prec - len(opa)
3283 if dif > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003284 opa = '0'*dif + opa
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003285 elif dif < 0:
3286 opa = opa[-context.prec:]
3287 dif = context.prec - len(opb)
3288 if dif > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003289 opb = '0'*dif + opb
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003290 elif dif < 0:
3291 opb = opb[-context.prec:]
3292 return opa, opb
3293
3294 def logical_and(self, other, context=None):
3295 """Applies an 'and' operation between self and other's digits."""
3296 if context is None:
3297 context = getcontext()
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003298
3299 other = _convert_other(other, raiseit=True)
3300
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003301 if not self._islogical() or not other._islogical():
3302 return context._raise_error(InvalidOperation)
3303
3304 # fill to context.prec
3305 (opa, opb) = self._fill_logical(context, self._int, other._int)
3306
3307 # make the operation, and clean starting zeroes
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003308 result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
3309 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003310
3311 def logical_invert(self, context=None):
3312 """Invert all its digits."""
3313 if context is None:
3314 context = getcontext()
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003315 return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
3316 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003317
3318 def logical_or(self, other, context=None):
3319 """Applies an 'or' operation between self and other's digits."""
3320 if context is None:
3321 context = getcontext()
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003322
3323 other = _convert_other(other, raiseit=True)
3324
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003325 if not self._islogical() or not other._islogical():
3326 return context._raise_error(InvalidOperation)
3327
3328 # fill to context.prec
3329 (opa, opb) = self._fill_logical(context, self._int, other._int)
3330
3331 # make the operation, and clean starting zeroes
Mark Dickinson315a20a2009-01-04 21:34:18 +00003332 result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)])
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003333 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003334
3335 def logical_xor(self, other, context=None):
3336 """Applies an 'xor' operation between self and other's digits."""
3337 if context is None:
3338 context = getcontext()
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003339
3340 other = _convert_other(other, raiseit=True)
3341
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003342 if not self._islogical() or not other._islogical():
3343 return context._raise_error(InvalidOperation)
3344
3345 # fill to context.prec
3346 (opa, opb) = self._fill_logical(context, self._int, other._int)
3347
3348 # make the operation, and clean starting zeroes
Mark Dickinson315a20a2009-01-04 21:34:18 +00003349 result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)])
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003350 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003351
3352 def max_mag(self, other, context=None):
3353 """Compares the values numerically with their sign ignored."""
3354 other = _convert_other(other, raiseit=True)
3355
3356 if context is None:
3357 context = getcontext()
3358
3359 if self._is_special or other._is_special:
3360 # If one operand is a quiet NaN and the other is number, then the
3361 # number is always returned
3362 sn = self._isnan()
3363 on = other._isnan()
3364 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00003365 if on == 1 and sn == 0:
3366 return self._fix(context)
3367 if sn == 1 and on == 0:
3368 return other._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003369 return self._check_nans(other, context)
3370
Christian Heimes77c02eb2008-02-09 02:18:51 +00003371 c = self.copy_abs()._cmp(other.copy_abs())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003372 if c == 0:
3373 c = self.compare_total(other)
3374
3375 if c == -1:
3376 ans = other
3377 else:
3378 ans = self
3379
Christian Heimes2c181612007-12-17 20:04:13 +00003380 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003381
3382 def min_mag(self, other, context=None):
3383 """Compares the values numerically with their sign ignored."""
3384 other = _convert_other(other, raiseit=True)
3385
3386 if context is None:
3387 context = getcontext()
3388
3389 if self._is_special or other._is_special:
3390 # If one operand is a quiet NaN and the other is number, then the
3391 # number is always returned
3392 sn = self._isnan()
3393 on = other._isnan()
3394 if sn or on:
Facundo Batista708d5812008-12-11 04:20:07 +00003395 if on == 1 and sn == 0:
3396 return self._fix(context)
3397 if sn == 1 and on == 0:
3398 return other._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003399 return self._check_nans(other, context)
3400
Christian Heimes77c02eb2008-02-09 02:18:51 +00003401 c = self.copy_abs()._cmp(other.copy_abs())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003402 if c == 0:
3403 c = self.compare_total(other)
3404
3405 if c == -1:
3406 ans = self
3407 else:
3408 ans = other
3409
Christian Heimes2c181612007-12-17 20:04:13 +00003410 return ans._fix(context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003411
3412 def next_minus(self, context=None):
3413 """Returns the largest representable number smaller than itself."""
3414 if context is None:
3415 context = getcontext()
3416
3417 ans = self._check_nans(context=context)
3418 if ans:
3419 return ans
3420
3421 if self._isinfinity() == -1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003422 return _NegativeInfinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003423 if self._isinfinity() == 1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003424 return _dec_from_triple(0, '9'*context.prec, context.Etop())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003425
3426 context = context.copy()
3427 context._set_rounding(ROUND_FLOOR)
3428 context._ignore_all_flags()
3429 new_self = self._fix(context)
3430 if new_self != self:
3431 return new_self
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003432 return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
3433 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003434
3435 def next_plus(self, context=None):
3436 """Returns the smallest representable number larger than itself."""
3437 if context is None:
3438 context = getcontext()
3439
3440 ans = self._check_nans(context=context)
3441 if ans:
3442 return ans
3443
3444 if self._isinfinity() == 1:
Mark Dickinson627cf6a2009-01-03 12:11:47 +00003445 return _Infinity
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003446 if self._isinfinity() == -1:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003447 return _dec_from_triple(1, '9'*context.prec, context.Etop())
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003448
3449 context = context.copy()
3450 context._set_rounding(ROUND_CEILING)
3451 context._ignore_all_flags()
3452 new_self = self._fix(context)
3453 if new_self != self:
3454 return new_self
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003455 return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
3456 context)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003457
3458 def next_toward(self, other, context=None):
3459 """Returns the number closest to self, in the direction towards other.
3460
3461 The result is the closest representable number to self
3462 (excluding self) that is in the direction towards other,
3463 unless both have the same value. If the two operands are
3464 numerically equal, then the result is a copy of self with the
3465 sign set to be the same as the sign of other.
3466 """
3467 other = _convert_other(other, raiseit=True)
3468
3469 if context is None:
3470 context = getcontext()
3471
3472 ans = self._check_nans(other, context)
3473 if ans:
3474 return ans
3475
Christian Heimes77c02eb2008-02-09 02:18:51 +00003476 comparison = self._cmp(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003477 if comparison == 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003478 return self.copy_sign(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003479
3480 if comparison == -1:
3481 ans = self.next_plus(context)
3482 else: # comparison == 1
3483 ans = self.next_minus(context)
3484
3485 # decide which flags to raise using value of ans
3486 if ans._isinfinity():
3487 context._raise_error(Overflow,
3488 'Infinite result from next_toward',
3489 ans._sign)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003490 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00003491 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003492 elif ans.adjusted() < context.Emin:
3493 context._raise_error(Underflow)
3494 context._raise_error(Subnormal)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003495 context._raise_error(Inexact)
Mark Dickinsonc69160e2010-05-04 14:35:33 +00003496 context._raise_error(Rounded)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003497 # if precision == 1 then we don't raise Clamped for a
3498 # result 0E-Etiny.
3499 if not ans:
3500 context._raise_error(Clamped)
3501
3502 return ans
3503
3504 def number_class(self, context=None):
3505 """Returns an indication of the class of self.
3506
3507 The class is one of the following strings:
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003508 sNaN
3509 NaN
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003510 -Infinity
3511 -Normal
3512 -Subnormal
3513 -Zero
3514 +Zero
3515 +Subnormal
3516 +Normal
3517 +Infinity
3518 """
3519 if self.is_snan():
3520 return "sNaN"
3521 if self.is_qnan():
3522 return "NaN"
3523 inf = self._isinfinity()
3524 if inf == 1:
3525 return "+Infinity"
3526 if inf == -1:
3527 return "-Infinity"
3528 if self.is_zero():
3529 if self._sign:
3530 return "-Zero"
3531 else:
3532 return "+Zero"
3533 if context is None:
3534 context = getcontext()
3535 if self.is_subnormal(context=context):
3536 if self._sign:
3537 return "-Subnormal"
3538 else:
3539 return "+Subnormal"
3540 # just a normal, regular, boring number, :)
3541 if self._sign:
3542 return "-Normal"
3543 else:
3544 return "+Normal"
3545
3546 def radix(self):
3547 """Just returns 10, as this is Decimal, :)"""
3548 return Decimal(10)
3549
3550 def rotate(self, other, context=None):
3551 """Returns a rotated copy of self, value-of-other times."""
3552 if context is None:
3553 context = getcontext()
3554
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003555 other = _convert_other(other, raiseit=True)
3556
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003557 ans = self._check_nans(other, context)
3558 if ans:
3559 return ans
3560
3561 if other._exp != 0:
3562 return context._raise_error(InvalidOperation)
3563 if not (-context.prec <= int(other) <= context.prec):
3564 return context._raise_error(InvalidOperation)
3565
3566 if self._isinfinity():
3567 return Decimal(self)
3568
3569 # get values, pad if necessary
3570 torot = int(other)
3571 rotdig = self._int
3572 topad = context.prec - len(rotdig)
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003573 if topad > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003574 rotdig = '0'*topad + rotdig
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003575 elif topad < 0:
3576 rotdig = rotdig[-topad:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003577
3578 # let's rotate!
3579 rotated = rotdig[torot:] + rotdig[:torot]
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003580 return _dec_from_triple(self._sign,
3581 rotated.lstrip('0') or '0', self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003582
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003583 def scaleb(self, other, context=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003584 """Returns self operand after adding the second value to its exp."""
3585 if context is None:
3586 context = getcontext()
3587
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003588 other = _convert_other(other, raiseit=True)
3589
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003590 ans = self._check_nans(other, context)
3591 if ans:
3592 return ans
3593
3594 if other._exp != 0:
3595 return context._raise_error(InvalidOperation)
3596 liminf = -2 * (context.Emax + context.prec)
3597 limsup = 2 * (context.Emax + context.prec)
3598 if not (liminf <= int(other) <= limsup):
3599 return context._raise_error(InvalidOperation)
3600
3601 if self._isinfinity():
3602 return Decimal(self)
3603
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003604 d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003605 d = d._fix(context)
3606 return d
3607
3608 def shift(self, other, context=None):
3609 """Returns a shifted copy of self, value-of-other times."""
3610 if context is None:
3611 context = getcontext()
3612
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003613 other = _convert_other(other, raiseit=True)
3614
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003615 ans = self._check_nans(other, context)
3616 if ans:
3617 return ans
3618
3619 if other._exp != 0:
3620 return context._raise_error(InvalidOperation)
3621 if not (-context.prec <= int(other) <= context.prec):
3622 return context._raise_error(InvalidOperation)
3623
3624 if self._isinfinity():
3625 return Decimal(self)
3626
3627 # get values, pad if necessary
3628 torot = int(other)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003629 rotdig = self._int
3630 topad = context.prec - len(rotdig)
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003631 if topad > 0:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003632 rotdig = '0'*topad + rotdig
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003633 elif topad < 0:
3634 rotdig = rotdig[-topad:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003635
3636 # let's shift!
3637 if torot < 0:
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003638 shifted = rotdig[:torot]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003639 else:
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003640 shifted = rotdig + '0'*torot
3641 shifted = shifted[-context.prec:]
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003642
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003643 return _dec_from_triple(self._sign,
Mark Dickinsona2d1fe02009-10-29 12:23:02 +00003644 shifted.lstrip('0') or '0', self._exp)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003645
Guido van Rossumd8faa362007-04-27 19:54:29 +00003646 # Support for pickling, copy, and deepcopy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003647 def __reduce__(self):
3648 return (self.__class__, (str(self),))
3649
3650 def __copy__(self):
Benjamin Petersond69fe2a2010-02-03 02:59:43 +00003651 if type(self) is Decimal:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003652 return self # I'm immutable; therefore I am my own clone
3653 return self.__class__(str(self))
3654
3655 def __deepcopy__(self, memo):
Benjamin Petersond69fe2a2010-02-03 02:59:43 +00003656 if type(self) is Decimal:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003657 return self # My components are also immutable
3658 return self.__class__(str(self))
3659
Mark Dickinson79f52032009-03-17 23:12:51 +00003660 # PEP 3101 support. the _localeconv keyword argument should be
3661 # considered private: it's provided for ease of testing only.
3662 def __format__(self, specifier, context=None, _localeconv=None):
Christian Heimesf16baeb2008-02-29 14:57:44 +00003663 """Format a Decimal instance according to the given specifier.
3664
3665 The specifier should be a standard format specifier, with the
3666 form described in PEP 3101. Formatting types 'e', 'E', 'f',
Mark Dickinson79f52032009-03-17 23:12:51 +00003667 'F', 'g', 'G', 'n' and '%' are supported. If the formatting
3668 type is omitted it defaults to 'g' or 'G', depending on the
3669 value of context.capitals.
Christian Heimesf16baeb2008-02-29 14:57:44 +00003670 """
3671
3672 # Note: PEP 3101 says that if the type is not present then
3673 # there should be at least one digit after the decimal point.
3674 # We take the liberty of ignoring this requirement for
3675 # Decimal---it's presumably there to make sure that
3676 # format(float, '') behaves similarly to str(float).
3677 if context is None:
3678 context = getcontext()
3679
Mark Dickinson79f52032009-03-17 23:12:51 +00003680 spec = _parse_format_specifier(specifier, _localeconv=_localeconv)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003681
Mark Dickinson79f52032009-03-17 23:12:51 +00003682 # special values don't care about the type or precision
Christian Heimesf16baeb2008-02-29 14:57:44 +00003683 if self._is_special:
Mark Dickinson79f52032009-03-17 23:12:51 +00003684 sign = _format_sign(self._sign, spec)
3685 body = str(self.copy_abs())
3686 return _format_align(sign, body, spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003687
3688 # a type of None defaults to 'g' or 'G', depending on context
Christian Heimesf16baeb2008-02-29 14:57:44 +00003689 if spec['type'] is None:
3690 spec['type'] = ['g', 'G'][context.capitals]
Mark Dickinson79f52032009-03-17 23:12:51 +00003691
3692 # if type is '%', adjust exponent of self accordingly
3693 if spec['type'] == '%':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003694 self = _dec_from_triple(self._sign, self._int, self._exp+2)
3695
3696 # round if necessary, taking rounding mode from the context
3697 rounding = context.rounding
3698 precision = spec['precision']
3699 if precision is not None:
3700 if spec['type'] in 'eE':
3701 self = self._round(precision+1, rounding)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003702 elif spec['type'] in 'fF%':
3703 self = self._rescale(-precision, rounding)
Mark Dickinson79f52032009-03-17 23:12:51 +00003704 elif spec['type'] in 'gG' and len(self._int) > precision:
3705 self = self._round(precision, rounding)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003706 # special case: zeros with a positive exponent can't be
3707 # represented in fixed point; rescale them to 0e0.
Mark Dickinson79f52032009-03-17 23:12:51 +00003708 if not self and self._exp > 0 and spec['type'] in 'fF%':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003709 self = self._rescale(0, rounding)
3710
3711 # figure out placement of the decimal point
3712 leftdigits = self._exp + len(self._int)
Mark Dickinson79f52032009-03-17 23:12:51 +00003713 if spec['type'] in 'eE':
Christian Heimesf16baeb2008-02-29 14:57:44 +00003714 if not self and precision is not None:
3715 dotplace = 1 - precision
3716 else:
3717 dotplace = 1
Mark Dickinson79f52032009-03-17 23:12:51 +00003718 elif spec['type'] in 'fF%':
3719 dotplace = leftdigits
Christian Heimesf16baeb2008-02-29 14:57:44 +00003720 elif spec['type'] in 'gG':
3721 if self._exp <= 0 and leftdigits > -6:
3722 dotplace = leftdigits
3723 else:
3724 dotplace = 1
3725
Mark Dickinson79f52032009-03-17 23:12:51 +00003726 # find digits before and after decimal point, and get exponent
3727 if dotplace < 0:
3728 intpart = '0'
3729 fracpart = '0'*(-dotplace) + self._int
3730 elif dotplace > len(self._int):
3731 intpart = self._int + '0'*(dotplace-len(self._int))
3732 fracpart = ''
Christian Heimesf16baeb2008-02-29 14:57:44 +00003733 else:
Mark Dickinson79f52032009-03-17 23:12:51 +00003734 intpart = self._int[:dotplace] or '0'
3735 fracpart = self._int[dotplace:]
3736 exp = leftdigits-dotplace
Christian Heimesf16baeb2008-02-29 14:57:44 +00003737
Mark Dickinson79f52032009-03-17 23:12:51 +00003738 # done with the decimal-specific stuff; hand over the rest
3739 # of the formatting to the _format_number function
3740 return _format_number(self._sign, intpart, fracpart, exp, spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00003741
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00003742def _dec_from_triple(sign, coefficient, exponent, special=False):
3743 """Create a decimal instance directly, without any validation,
3744 normalization (e.g. removal of leading zeros) or argument
3745 conversion.
3746
3747 This function is for *internal use only*.
3748 """
3749
3750 self = object.__new__(Decimal)
3751 self._sign = sign
3752 self._int = coefficient
3753 self._exp = exponent
3754 self._is_special = special
3755
3756 return self
3757
Raymond Hettinger82417ca2009-02-03 03:54:28 +00003758# Register Decimal as a kind of Number (an abstract base class).
3759# However, do not register it as Real (because Decimals are not
3760# interoperable with floats).
3761_numbers.Number.register(Decimal)
3762
3763
Guido van Rossumd8faa362007-04-27 19:54:29 +00003764##### Context class #######################################################
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003765
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003766
3767# get rounding method function:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003768rounding_functions = [name for name in Decimal.__dict__.keys()
3769 if name.startswith('_round_')]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003770for name in rounding_functions:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003771 # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003772 globalname = name[1:].upper()
3773 val = globals()[globalname]
3774 Decimal._pick_rounding_function[val] = name
3775
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003776del name, val, globalname, rounding_functions
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003777
Thomas Wouters89f507f2006-12-13 04:49:30 +00003778class _ContextManager(object):
3779 """Context manager class to support localcontext().
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003780
Thomas Wouters89f507f2006-12-13 04:49:30 +00003781 Sets a copy of the supplied context in __enter__() and restores
3782 the previous decimal context in __exit__()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003783 """
3784 def __init__(self, new_context):
Thomas Wouters89f507f2006-12-13 04:49:30 +00003785 self.new_context = new_context.copy()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003786 def __enter__(self):
3787 self.saved_context = getcontext()
3788 setcontext(self.new_context)
3789 return self.new_context
3790 def __exit__(self, t, v, tb):
3791 setcontext(self.saved_context)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003792
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003793class Context(object):
3794 """Contains the context for a Decimal instance.
3795
3796 Contains:
3797 prec - precision (for use in rounding, division, square roots..)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003798 rounding - rounding type (how you round)
Raymond Hettingerbf440692004-07-10 14:14:37 +00003799 traps - If traps[exception] = 1, then the exception is
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003800 raised when it is caused. Otherwise, a value is
3801 substituted in.
Raymond Hettinger86173da2008-02-01 20:38:12 +00003802 flags - When an exception is caused, flags[exception] is set.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003803 (Whether or not the trap_enabler is set)
3804 Should be reset by user of Decimal instance.
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003805 Emin - Minimum exponent
3806 Emax - Maximum exponent
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003807 capitals - If 1, 1*10^1 is printed as 1E+1.
3808 If 0, printed as 1e1
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003809 clamp - If 1, change exponents if too high (Default 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003810 """
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003811
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003812 def __init__(self, prec=None, rounding=None,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003813 traps=None, flags=None,
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003814 Emin=None, Emax=None,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003815 capitals=None, clamp=None,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003816 _ignored_flags=None):
Mark Dickinson0dd8f782010-07-08 21:15:36 +00003817 # Set defaults; for everything except flags and _ignored_flags,
3818 # inherit from DefaultContext.
3819 try:
3820 dc = DefaultContext
3821 except NameError:
3822 pass
3823
3824 self.prec = prec if prec is not None else dc.prec
3825 self.rounding = rounding if rounding is not None else dc.rounding
3826 self.Emin = Emin if Emin is not None else dc.Emin
3827 self.Emax = Emax if Emax is not None else dc.Emax
3828 self.capitals = capitals if capitals is not None else dc.capitals
3829 self.clamp = clamp if clamp is not None else dc.clamp
3830
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003831 if _ignored_flags is None:
Mark Dickinson0dd8f782010-07-08 21:15:36 +00003832 self._ignored_flags = []
3833 else:
3834 self._ignored_flags = _ignored_flags
3835
3836 if traps is None:
3837 self.traps = dc.traps.copy()
3838 elif not isinstance(traps, dict):
3839 self.traps = dict((s, int(s in traps)) for s in _signals)
3840 else:
3841 self.traps = traps
3842
3843 if flags is None:
3844 self.flags = dict.fromkeys(_signals, 0)
3845 elif not isinstance(flags, dict):
3846 self.flags = dict((s, int(s in flags)) for s in _signals)
3847 else:
3848 self.flags = flags
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003849
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003850 def __repr__(self):
Raymond Hettingerbf440692004-07-10 14:14:37 +00003851 """Show the current context."""
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003852 s = []
Guido van Rossumd8faa362007-04-27 19:54:29 +00003853 s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003854 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d, '
3855 'clamp=%(clamp)d'
Guido van Rossumd8faa362007-04-27 19:54:29 +00003856 % vars(self))
3857 names = [f.__name__ for f, v in self.flags.items() if v]
3858 s.append('flags=[' + ', '.join(names) + ']')
3859 names = [t.__name__ for t, v in self.traps.items() if v]
3860 s.append('traps=[' + ', '.join(names) + ']')
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003861 return ', '.join(s) + ')'
3862
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003863 def clear_flags(self):
3864 """Reset all flags to zero"""
3865 for flag in self.flags:
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003866 self.flags[flag] = 0
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003867
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003868 def _shallow_copy(self):
3869 """Returns a shallow copy from self."""
Christian Heimes2c181612007-12-17 20:04:13 +00003870 nc = Context(self.prec, self.rounding, self.traps,
3871 self.flags, self.Emin, self.Emax,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003872 self.capitals, self.clamp, self._ignored_flags)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003873 return nc
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003874
3875 def copy(self):
3876 """Returns a deep copy from self."""
Guido van Rossumd8faa362007-04-27 19:54:29 +00003877 nc = Context(self.prec, self.rounding, self.traps.copy(),
Christian Heimes2c181612007-12-17 20:04:13 +00003878 self.flags.copy(), self.Emin, self.Emax,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003879 self.capitals, self.clamp, self._ignored_flags)
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003880 return nc
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003881 __copy__ = copy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003882
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003883 # _clamp is provided for backwards compatibility with third-party
3884 # code. May be removed in Python >= 3.3.
3885 def _get_clamp(self):
3886 "_clamp mirrors the clamp attribute. Its use is deprecated."
3887 import warnings
3888 warnings.warn('Use of the _clamp attribute is deprecated. '
3889 'Please use clamp instead.',
3890 DeprecationWarning)
3891 return self.clamp
3892
3893 def _set_clamp(self, clamp):
3894 "_clamp mirrors the clamp attribute. Its use is deprecated."
3895 import warnings
3896 warnings.warn('Use of the _clamp attribute is deprecated. '
3897 'Please use clamp instead.',
3898 DeprecationWarning)
3899 self.clamp = clamp
3900
3901 # don't bother with _del_clamp; no sane 3rd party code should
3902 # be deleting the _clamp attribute
3903 _clamp = property(_get_clamp, _set_clamp)
3904
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003905 def _raise_error(self, condition, explanation = None, *args):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003906 """Handles an error
3907
3908 If the flag is in _ignored_flags, returns the default response.
Raymond Hettinger86173da2008-02-01 20:38:12 +00003909 Otherwise, it sets the flag, then, if the corresponding
Stefan Krah2eb4a072010-05-19 15:52:31 +00003910 trap_enabler is set, it reraises the exception. Otherwise, it returns
Raymond Hettinger86173da2008-02-01 20:38:12 +00003911 the default value after setting the flag.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003912 """
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003913 error = _condition_map.get(condition, condition)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003914 if error in self._ignored_flags:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003915 # Don't touch the flag
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003916 return error().handle(self, *args)
3917
Raymond Hettinger86173da2008-02-01 20:38:12 +00003918 self.flags[error] = 1
Raymond Hettingerbf440692004-07-10 14:14:37 +00003919 if not self.traps[error]:
Guido van Rossumd8faa362007-04-27 19:54:29 +00003920 # The errors define how to handle themselves.
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003921 return condition().handle(self, *args)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003922
3923 # Errors should only be risked on copies of the context
Guido van Rossumd8faa362007-04-27 19:54:29 +00003924 # self._ignored_flags = []
Collin Winterce36ad82007-08-30 01:19:48 +00003925 raise error(explanation)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003926
3927 def _ignore_all_flags(self):
3928 """Ignore all flags, if they are raised"""
Raymond Hettingerfed52962004-07-14 15:41:57 +00003929 return self._ignore_flags(*_signals)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003930
3931 def _ignore_flags(self, *flags):
3932 """Ignore the flags, if they are raised"""
3933 # Do not mutate-- This way, copies of a context leave the original
3934 # alone.
3935 self._ignored_flags = (self._ignored_flags + list(flags))
3936 return list(flags)
3937
3938 def _regard_flags(self, *flags):
3939 """Stop ignoring the flags, if they are raised"""
3940 if flags and isinstance(flags[0], (tuple,list)):
3941 flags = flags[0]
3942 for flag in flags:
3943 self._ignored_flags.remove(flag)
3944
Nick Coghland1abd252008-07-15 15:46:38 +00003945 # We inherit object.__hash__, so we must deny this explicitly
3946 __hash__ = None
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003947
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003948 def Etiny(self):
3949 """Returns Etiny (= Emin - prec + 1)"""
3950 return int(self.Emin - self.prec + 1)
3951
3952 def Etop(self):
Raymond Hettingere0f15812004-07-05 05:36:39 +00003953 """Returns maximum exponent (= Emax - prec + 1)"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003954 return int(self.Emax - self.prec + 1)
3955
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003956 def _set_rounding(self, type):
3957 """Sets the rounding type.
3958
3959 Sets the rounding type, and returns the current (previous)
3960 rounding type. Often used like:
3961
3962 context = context.copy()
3963 # so you don't change the calling context
3964 # if an error occurs in the middle.
3965 rounding = context._set_rounding(ROUND_UP)
3966 val = self.__sub__(other, context=context)
3967 context._set_rounding(rounding)
3968
3969 This will make it round up for that operation.
3970 """
3971 rounding = self.rounding
3972 self.rounding= type
3973 return rounding
3974
Raymond Hettingerfed52962004-07-14 15:41:57 +00003975 def create_decimal(self, num='0'):
Christian Heimesa62da1d2008-01-12 19:39:10 +00003976 """Creates a new Decimal instance but using self as context.
3977
3978 This method implements the to-number operation of the
3979 IBM Decimal specification."""
3980
3981 if isinstance(num, str) and num != num.strip():
3982 return self._raise_error(ConversionSyntax,
3983 "no trailing or leading whitespace is "
3984 "permitted.")
3985
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003986 d = Decimal(num, context=self)
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00003987 if d._isnan() and len(d._int) > self.prec - self.clamp:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00003988 return self._raise_error(ConversionSyntax,
3989 "diagnostic info too long in NaN")
Raymond Hettingerdab988d2004-10-09 07:10:44 +00003990 return d._fix(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003991
Raymond Hettinger771ed762009-01-03 19:20:32 +00003992 def create_decimal_from_float(self, f):
3993 """Creates a new Decimal instance from a float but rounding using self
3994 as the context.
3995
3996 >>> context = Context(prec=5, rounding=ROUND_DOWN)
3997 >>> context.create_decimal_from_float(3.1415926535897932)
3998 Decimal('3.1415')
3999 >>> context = Context(prec=5, traps=[Inexact])
4000 >>> context.create_decimal_from_float(3.1415926535897932)
4001 Traceback (most recent call last):
4002 ...
4003 decimal.Inexact: None
4004
4005 """
4006 d = Decimal.from_float(f) # An exact conversion
4007 return d._fix(self) # Apply the context rounding
4008
Guido van Rossumd8faa362007-04-27 19:54:29 +00004009 # Methods
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004010 def abs(self, a):
4011 """Returns the absolute value of the operand.
4012
4013 If the operand is negative, the result is the same as using the minus
Guido van Rossumd8faa362007-04-27 19:54:29 +00004014 operation on the operand. Otherwise, the result is the same as using
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004015 the plus operation on the operand.
4016
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004017 >>> ExtendedContext.abs(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004018 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004019 >>> ExtendedContext.abs(Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004020 Decimal('100')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004021 >>> ExtendedContext.abs(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004022 Decimal('101.5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004023 >>> ExtendedContext.abs(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004024 Decimal('101.5')
Mark Dickinson84230a12010-02-18 14:49:50 +00004025 >>> ExtendedContext.abs(-1)
4026 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004027 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004028 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004029 return a.__abs__(context=self)
4030
4031 def add(self, a, b):
4032 """Return the sum of the two operands.
4033
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004034 >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004035 Decimal('19.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004036 >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004037 Decimal('1.02E+4')
Mark Dickinson84230a12010-02-18 14:49:50 +00004038 >>> ExtendedContext.add(1, Decimal(2))
4039 Decimal('3')
4040 >>> ExtendedContext.add(Decimal(8), 5)
4041 Decimal('13')
4042 >>> ExtendedContext.add(5, 5)
4043 Decimal('10')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004044 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004045 a = _convert_other(a, raiseit=True)
4046 r = a.__add__(b, context=self)
4047 if r is NotImplemented:
4048 raise TypeError("Unable to convert %s to Decimal" % b)
4049 else:
4050 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004051
4052 def _apply(self, a):
Raymond Hettingerdab988d2004-10-09 07:10:44 +00004053 return str(a._fix(self))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004054
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004055 def canonical(self, a):
4056 """Returns the same Decimal object.
4057
4058 As we do not have different encodings for the same number, the
4059 received object already is in its canonical form.
4060
4061 >>> ExtendedContext.canonical(Decimal('2.50'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004062 Decimal('2.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004063 """
4064 return a.canonical(context=self)
4065
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004066 def compare(self, a, b):
4067 """Compares values numerically.
4068
4069 If the signs of the operands differ, a value representing each operand
4070 ('-1' if the operand is less than zero, '0' if the operand is zero or
4071 negative zero, or '1' if the operand is greater than zero) is used in
4072 place of that operand for the comparison instead of the actual
4073 operand.
4074
4075 The comparison is then effected by subtracting the second operand from
4076 the first and then returning a value according to the result of the
4077 subtraction: '-1' if the result is less than zero, '0' if the result is
4078 zero or negative zero, or '1' if the result is greater than zero.
4079
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004080 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004081 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004082 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004083 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004084 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004085 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004086 >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004087 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004088 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004089 Decimal('1')
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')
Mark Dickinson84230a12010-02-18 14:49:50 +00004092 >>> ExtendedContext.compare(1, 2)
4093 Decimal('-1')
4094 >>> ExtendedContext.compare(Decimal(1), 2)
4095 Decimal('-1')
4096 >>> ExtendedContext.compare(1, Decimal(2))
4097 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004098 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004099 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004100 return a.compare(b, context=self)
4101
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004102 def compare_signal(self, a, b):
4103 """Compares the values of the two operands numerically.
4104
4105 It's pretty much like compare(), but all NaNs signal, with signaling
4106 NaNs taking precedence over quiet NaNs.
4107
4108 >>> c = ExtendedContext
4109 >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004110 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004111 >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004112 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004113 >>> c.flags[InvalidOperation] = 0
4114 >>> print(c.flags[InvalidOperation])
4115 0
4116 >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004117 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004118 >>> print(c.flags[InvalidOperation])
4119 1
4120 >>> c.flags[InvalidOperation] = 0
4121 >>> print(c.flags[InvalidOperation])
4122 0
4123 >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004124 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004125 >>> print(c.flags[InvalidOperation])
4126 1
Mark Dickinson84230a12010-02-18 14:49:50 +00004127 >>> c.compare_signal(-1, 2)
4128 Decimal('-1')
4129 >>> c.compare_signal(Decimal(-1), 2)
4130 Decimal('-1')
4131 >>> c.compare_signal(-1, Decimal(2))
4132 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004133 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004134 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004135 return a.compare_signal(b, context=self)
4136
4137 def compare_total(self, a, b):
4138 """Compares two operands using their abstract representation.
4139
4140 This is not like the standard compare, which use their numerical
4141 value. Note that a total ordering is defined for all possible abstract
4142 representations.
4143
4144 >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004145 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004146 >>> ExtendedContext.compare_total(Decimal('-127'), Decimal('12'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004147 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004148 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004149 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004150 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004151 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004152 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('12.300'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004153 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004154 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004155 Decimal('-1')
Mark Dickinson84230a12010-02-18 14:49:50 +00004156 >>> ExtendedContext.compare_total(1, 2)
4157 Decimal('-1')
4158 >>> ExtendedContext.compare_total(Decimal(1), 2)
4159 Decimal('-1')
4160 >>> ExtendedContext.compare_total(1, Decimal(2))
4161 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004162 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004163 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004164 return a.compare_total(b)
4165
4166 def compare_total_mag(self, a, b):
4167 """Compares two operands using their abstract representation ignoring sign.
4168
4169 Like compare_total, but with operand's sign ignored and assumed to be 0.
4170 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004171 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004172 return a.compare_total_mag(b)
4173
4174 def copy_abs(self, a):
4175 """Returns a copy of the operand with the sign set to 0.
4176
4177 >>> ExtendedContext.copy_abs(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004178 Decimal('2.1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004179 >>> ExtendedContext.copy_abs(Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004180 Decimal('100')
Mark Dickinson84230a12010-02-18 14:49:50 +00004181 >>> ExtendedContext.copy_abs(-1)
4182 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004183 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004184 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004185 return a.copy_abs()
4186
4187 def copy_decimal(self, a):
Mark Dickinson84230a12010-02-18 14:49:50 +00004188 """Returns a copy of the decimal object.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004189
4190 >>> ExtendedContext.copy_decimal(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004191 Decimal('2.1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004192 >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004193 Decimal('-1.00')
Mark Dickinson84230a12010-02-18 14:49:50 +00004194 >>> ExtendedContext.copy_decimal(1)
4195 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004196 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004197 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004198 return Decimal(a)
4199
4200 def copy_negate(self, a):
4201 """Returns a copy of the operand with the sign inverted.
4202
4203 >>> ExtendedContext.copy_negate(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004204 Decimal('-101.5')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004205 >>> ExtendedContext.copy_negate(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004206 Decimal('101.5')
Mark Dickinson84230a12010-02-18 14:49:50 +00004207 >>> ExtendedContext.copy_negate(1)
4208 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004209 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004210 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004211 return a.copy_negate()
4212
4213 def copy_sign(self, a, b):
4214 """Copies the second operand's sign to the first one.
4215
4216 In detail, it returns a copy of the first operand with the sign
4217 equal to the sign of the second operand.
4218
4219 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004220 Decimal('1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004221 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004222 Decimal('1.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004223 >>> 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')
Mark Dickinson84230a12010-02-18 14:49:50 +00004227 >>> ExtendedContext.copy_sign(1, -2)
4228 Decimal('-1')
4229 >>> ExtendedContext.copy_sign(Decimal(1), -2)
4230 Decimal('-1')
4231 >>> ExtendedContext.copy_sign(1, Decimal(-2))
4232 Decimal('-1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004233 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004234 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004235 return a.copy_sign(b)
4236
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004237 def divide(self, a, b):
4238 """Decimal division in a specified context.
4239
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004240 >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004241 Decimal('0.333333333')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004242 >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004243 Decimal('0.666666667')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004244 >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004245 Decimal('2.5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004246 >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004247 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004248 >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004249 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004250 >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004251 Decimal('4.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004252 >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004253 Decimal('1.20')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004254 >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004255 Decimal('10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004256 >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004257 Decimal('1000')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004258 >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004259 Decimal('1.20E+6')
Mark Dickinson84230a12010-02-18 14:49:50 +00004260 >>> ExtendedContext.divide(5, 5)
4261 Decimal('1')
4262 >>> ExtendedContext.divide(Decimal(5), 5)
4263 Decimal('1')
4264 >>> ExtendedContext.divide(5, Decimal(5))
4265 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004266 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004267 a = _convert_other(a, raiseit=True)
4268 r = a.__truediv__(b, context=self)
4269 if r is NotImplemented:
4270 raise TypeError("Unable to convert %s to Decimal" % b)
4271 else:
4272 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004273
4274 def divide_int(self, a, b):
4275 """Divides two numbers and returns the integer part of the result.
4276
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004277 >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004278 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004279 >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004280 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004281 >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004282 Decimal('3')
Mark Dickinson84230a12010-02-18 14:49:50 +00004283 >>> ExtendedContext.divide_int(10, 3)
4284 Decimal('3')
4285 >>> ExtendedContext.divide_int(Decimal(10), 3)
4286 Decimal('3')
4287 >>> ExtendedContext.divide_int(10, Decimal(3))
4288 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004289 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004290 a = _convert_other(a, raiseit=True)
4291 r = a.__floordiv__(b, context=self)
4292 if r is NotImplemented:
4293 raise TypeError("Unable to convert %s to Decimal" % b)
4294 else:
4295 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004296
4297 def divmod(self, a, b):
Mark Dickinson84230a12010-02-18 14:49:50 +00004298 """Return (a // b, a % b).
Mark Dickinsonc53796e2010-01-06 16:22:15 +00004299
4300 >>> ExtendedContext.divmod(Decimal(8), Decimal(3))
4301 (Decimal('2'), Decimal('2'))
4302 >>> ExtendedContext.divmod(Decimal(8), Decimal(4))
4303 (Decimal('2'), Decimal('0'))
Mark Dickinson84230a12010-02-18 14:49:50 +00004304 >>> ExtendedContext.divmod(8, 4)
4305 (Decimal('2'), Decimal('0'))
4306 >>> ExtendedContext.divmod(Decimal(8), 4)
4307 (Decimal('2'), Decimal('0'))
4308 >>> ExtendedContext.divmod(8, Decimal(4))
4309 (Decimal('2'), Decimal('0'))
Mark Dickinsonc53796e2010-01-06 16:22:15 +00004310 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004311 a = _convert_other(a, raiseit=True)
4312 r = a.__divmod__(b, context=self)
4313 if r is NotImplemented:
4314 raise TypeError("Unable to convert %s to Decimal" % b)
4315 else:
4316 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004317
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004318 def exp(self, a):
4319 """Returns e ** a.
4320
4321 >>> c = ExtendedContext.copy()
4322 >>> c.Emin = -999
4323 >>> c.Emax = 999
4324 >>> c.exp(Decimal('-Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004325 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004326 >>> c.exp(Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004327 Decimal('0.367879441')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004328 >>> c.exp(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004329 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004330 >>> c.exp(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004331 Decimal('2.71828183')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004332 >>> c.exp(Decimal('0.693147181'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004333 Decimal('2.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004334 >>> c.exp(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004335 Decimal('Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004336 >>> c.exp(10)
4337 Decimal('22026.4658')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004338 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004339 a =_convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004340 return a.exp(context=self)
4341
4342 def fma(self, a, b, c):
4343 """Returns a multiplied by b, plus c.
4344
4345 The first two operands are multiplied together, using multiply,
4346 the third operand is then added to the result of that
4347 multiplication, using add, all with only one final rounding.
4348
4349 >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004350 Decimal('22')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004351 >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004352 Decimal('-8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004353 >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004354 Decimal('1.38435736E+12')
Mark Dickinson84230a12010-02-18 14:49:50 +00004355 >>> ExtendedContext.fma(1, 3, 4)
4356 Decimal('7')
4357 >>> ExtendedContext.fma(1, Decimal(3), 4)
4358 Decimal('7')
4359 >>> ExtendedContext.fma(1, 3, Decimal(4))
4360 Decimal('7')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004361 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004362 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004363 return a.fma(b, c, context=self)
4364
4365 def is_canonical(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004366 """Return True if the operand is canonical; otherwise return False.
4367
4368 Currently, the encoding of a Decimal instance is always
4369 canonical, so this method returns True for any Decimal.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004370
4371 >>> ExtendedContext.is_canonical(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004372 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004373 """
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004374 return a.is_canonical()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004375
4376 def is_finite(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004377 """Return True if the operand is finite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004378
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004379 A Decimal instance is considered finite if it is neither
4380 infinite nor a NaN.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004381
4382 >>> ExtendedContext.is_finite(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004383 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004384 >>> ExtendedContext.is_finite(Decimal('-0.3'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004385 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004386 >>> ExtendedContext.is_finite(Decimal('0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004387 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004388 >>> ExtendedContext.is_finite(Decimal('Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004389 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004390 >>> ExtendedContext.is_finite(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004391 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004392 >>> ExtendedContext.is_finite(1)
4393 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004394 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004395 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004396 return a.is_finite()
4397
4398 def is_infinite(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004399 """Return True if the operand is infinite; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004400
4401 >>> ExtendedContext.is_infinite(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004402 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004403 >>> ExtendedContext.is_infinite(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004404 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004405 >>> ExtendedContext.is_infinite(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004406 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004407 >>> ExtendedContext.is_infinite(1)
4408 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004409 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004410 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004411 return a.is_infinite()
4412
4413 def is_nan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004414 """Return True if the operand is a qNaN or sNaN;
4415 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004416
4417 >>> ExtendedContext.is_nan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004418 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004419 >>> ExtendedContext.is_nan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004420 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004421 >>> ExtendedContext.is_nan(Decimal('-sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004422 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004423 >>> ExtendedContext.is_nan(1)
4424 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004425 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004426 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004427 return a.is_nan()
4428
4429 def is_normal(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004430 """Return True if the operand is a normal number;
4431 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004432
4433 >>> c = ExtendedContext.copy()
4434 >>> c.Emin = -999
4435 >>> c.Emax = 999
4436 >>> c.is_normal(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004437 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004438 >>> c.is_normal(Decimal('0.1E-999'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004439 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004440 >>> c.is_normal(Decimal('0.00'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004441 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004442 >>> c.is_normal(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004443 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004444 >>> c.is_normal(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004445 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004446 >>> c.is_normal(1)
4447 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004448 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004449 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004450 return a.is_normal(context=self)
4451
4452 def is_qnan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004453 """Return True if the operand is a quiet NaN; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004454
4455 >>> ExtendedContext.is_qnan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004456 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004457 >>> ExtendedContext.is_qnan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004458 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004459 >>> ExtendedContext.is_qnan(Decimal('sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004460 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004461 >>> ExtendedContext.is_qnan(1)
4462 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004463 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004464 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004465 return a.is_qnan()
4466
4467 def is_signed(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004468 """Return True if the operand is negative; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004469
4470 >>> ExtendedContext.is_signed(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004471 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004472 >>> ExtendedContext.is_signed(Decimal('-12'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004473 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004474 >>> ExtendedContext.is_signed(Decimal('-0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004475 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004476 >>> ExtendedContext.is_signed(8)
4477 False
4478 >>> ExtendedContext.is_signed(-8)
4479 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004480 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004481 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004482 return a.is_signed()
4483
4484 def is_snan(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004485 """Return True if the operand is a signaling NaN;
4486 otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004487
4488 >>> ExtendedContext.is_snan(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004489 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004490 >>> ExtendedContext.is_snan(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004491 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004492 >>> ExtendedContext.is_snan(Decimal('sNaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004493 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004494 >>> ExtendedContext.is_snan(1)
4495 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004496 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004497 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004498 return a.is_snan()
4499
4500 def is_subnormal(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004501 """Return True if the operand is subnormal; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004502
4503 >>> c = ExtendedContext.copy()
4504 >>> c.Emin = -999
4505 >>> c.Emax = 999
4506 >>> c.is_subnormal(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004507 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004508 >>> c.is_subnormal(Decimal('0.1E-999'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004509 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004510 >>> c.is_subnormal(Decimal('0.00'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004511 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004512 >>> c.is_subnormal(Decimal('-Inf'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004513 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004514 >>> c.is_subnormal(Decimal('NaN'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004515 False
Mark Dickinson84230a12010-02-18 14:49:50 +00004516 >>> c.is_subnormal(1)
4517 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004518 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004519 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004520 return a.is_subnormal(context=self)
4521
4522 def is_zero(self, a):
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004523 """Return True if the operand is a zero; otherwise return False.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004524
4525 >>> ExtendedContext.is_zero(Decimal('0'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004526 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004527 >>> ExtendedContext.is_zero(Decimal('2.50'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004528 False
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004529 >>> ExtendedContext.is_zero(Decimal('-0E+2'))
Guido van Rossum8ce8a782007-11-01 19:42:39 +00004530 True
Mark Dickinson84230a12010-02-18 14:49:50 +00004531 >>> ExtendedContext.is_zero(1)
4532 False
4533 >>> ExtendedContext.is_zero(0)
4534 True
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004535 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004536 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004537 return a.is_zero()
4538
4539 def ln(self, a):
4540 """Returns the natural (base e) logarithm of the operand.
4541
4542 >>> c = ExtendedContext.copy()
4543 >>> c.Emin = -999
4544 >>> c.Emax = 999
4545 >>> c.ln(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004546 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004547 >>> c.ln(Decimal('1.000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004548 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004549 >>> c.ln(Decimal('2.71828183'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004550 Decimal('1.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004551 >>> c.ln(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004552 Decimal('2.30258509')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004553 >>> c.ln(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004554 Decimal('Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004555 >>> c.ln(1)
4556 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004557 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004558 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004559 return a.ln(context=self)
4560
4561 def log10(self, a):
4562 """Returns the base 10 logarithm of the operand.
4563
4564 >>> c = ExtendedContext.copy()
4565 >>> c.Emin = -999
4566 >>> c.Emax = 999
4567 >>> c.log10(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004568 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004569 >>> c.log10(Decimal('0.001'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004570 Decimal('-3')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004571 >>> c.log10(Decimal('1.000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004572 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004573 >>> c.log10(Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004574 Decimal('0.301029996')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004575 >>> c.log10(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004576 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004577 >>> c.log10(Decimal('70'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004578 Decimal('1.84509804')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004579 >>> c.log10(Decimal('+Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004580 Decimal('Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004581 >>> c.log10(0)
4582 Decimal('-Infinity')
4583 >>> c.log10(1)
4584 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004585 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004586 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004587 return a.log10(context=self)
4588
4589 def logb(self, a):
4590 """ Returns the exponent of the magnitude of the operand's MSD.
4591
4592 The result is the integer which is the exponent of the magnitude
4593 of the most significant digit of the operand (as though the
4594 operand were truncated to a single digit while maintaining the
4595 value of that digit and without limiting the resulting exponent).
4596
4597 >>> ExtendedContext.logb(Decimal('250'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004598 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004599 >>> ExtendedContext.logb(Decimal('2.50'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004600 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004601 >>> ExtendedContext.logb(Decimal('0.03'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004602 Decimal('-2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004603 >>> ExtendedContext.logb(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004604 Decimal('-Infinity')
Mark Dickinson84230a12010-02-18 14:49:50 +00004605 >>> ExtendedContext.logb(1)
4606 Decimal('0')
4607 >>> ExtendedContext.logb(10)
4608 Decimal('1')
4609 >>> ExtendedContext.logb(100)
4610 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004611 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004612 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004613 return a.logb(context=self)
4614
4615 def logical_and(self, a, b):
4616 """Applies the logical operation 'and' between each operand's digits.
4617
4618 The operands must be both logical numbers.
4619
4620 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004621 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004622 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004623 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004624 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004625 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004626 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004627 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004628 >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004629 Decimal('1000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004630 >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004631 Decimal('10')
Mark Dickinson84230a12010-02-18 14:49:50 +00004632 >>> ExtendedContext.logical_and(110, 1101)
4633 Decimal('100')
4634 >>> ExtendedContext.logical_and(Decimal(110), 1101)
4635 Decimal('100')
4636 >>> ExtendedContext.logical_and(110, Decimal(1101))
4637 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004638 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004639 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004640 return a.logical_and(b, context=self)
4641
4642 def logical_invert(self, a):
4643 """Invert all the digits in the operand.
4644
4645 The operand must be a logical number.
4646
4647 >>> ExtendedContext.logical_invert(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004648 Decimal('111111111')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004649 >>> ExtendedContext.logical_invert(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004650 Decimal('111111110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004651 >>> ExtendedContext.logical_invert(Decimal('111111111'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004652 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004653 >>> ExtendedContext.logical_invert(Decimal('101010101'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004654 Decimal('10101010')
Mark Dickinson84230a12010-02-18 14:49:50 +00004655 >>> ExtendedContext.logical_invert(1101)
4656 Decimal('111110010')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004657 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004658 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004659 return a.logical_invert(context=self)
4660
4661 def logical_or(self, a, b):
4662 """Applies the logical operation 'or' between each operand's digits.
4663
4664 The operands must be both logical numbers.
4665
4666 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004667 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004668 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004669 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004670 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004671 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004672 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004673 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004674 >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004675 Decimal('1110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004676 >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004677 Decimal('1110')
Mark Dickinson84230a12010-02-18 14:49:50 +00004678 >>> ExtendedContext.logical_or(110, 1101)
4679 Decimal('1111')
4680 >>> ExtendedContext.logical_or(Decimal(110), 1101)
4681 Decimal('1111')
4682 >>> ExtendedContext.logical_or(110, Decimal(1101))
4683 Decimal('1111')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004684 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004685 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004686 return a.logical_or(b, context=self)
4687
4688 def logical_xor(self, a, b):
4689 """Applies the logical operation 'xor' between each operand's digits.
4690
4691 The operands must be both logical numbers.
4692
4693 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004694 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004695 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004696 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004697 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004698 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004699 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004700 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004701 >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004702 Decimal('110')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004703 >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004704 Decimal('1101')
Mark Dickinson84230a12010-02-18 14:49:50 +00004705 >>> ExtendedContext.logical_xor(110, 1101)
4706 Decimal('1011')
4707 >>> ExtendedContext.logical_xor(Decimal(110), 1101)
4708 Decimal('1011')
4709 >>> ExtendedContext.logical_xor(110, Decimal(1101))
4710 Decimal('1011')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004711 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004712 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004713 return a.logical_xor(b, context=self)
4714
Mark Dickinson84230a12010-02-18 14:49:50 +00004715 def max(self, a, b):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004716 """max compares two values numerically and returns the maximum.
4717
4718 If either operand is a NaN then the general rules apply.
Christian Heimes679db4a2008-01-18 09:56:22 +00004719 Otherwise, the operands are compared as though by the compare
Guido van Rossumd8faa362007-04-27 19:54:29 +00004720 operation. If they are numerically equal then the left-hand operand
4721 is chosen as the result. Otherwise the maximum (closer to positive
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004722 infinity) of the two operands is chosen as the result.
4723
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004724 >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004725 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004726 >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004727 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004728 >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004729 Decimal('1')
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004730 >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004731 Decimal('7')
Mark Dickinson84230a12010-02-18 14:49:50 +00004732 >>> ExtendedContext.max(1, 2)
4733 Decimal('2')
4734 >>> ExtendedContext.max(Decimal(1), 2)
4735 Decimal('2')
4736 >>> ExtendedContext.max(1, Decimal(2))
4737 Decimal('2')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004738 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004739 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004740 return a.max(b, context=self)
4741
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004742 def max_mag(self, a, b):
Mark Dickinson84230a12010-02-18 14:49:50 +00004743 """Compares the values numerically with their sign ignored.
4744
4745 >>> ExtendedContext.max_mag(Decimal('7'), Decimal('NaN'))
4746 Decimal('7')
4747 >>> ExtendedContext.max_mag(Decimal('7'), Decimal('-10'))
4748 Decimal('-10')
4749 >>> ExtendedContext.max_mag(1, -2)
4750 Decimal('-2')
4751 >>> ExtendedContext.max_mag(Decimal(1), -2)
4752 Decimal('-2')
4753 >>> ExtendedContext.max_mag(1, Decimal(-2))
4754 Decimal('-2')
4755 """
4756 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004757 return a.max_mag(b, context=self)
4758
Mark Dickinson84230a12010-02-18 14:49:50 +00004759 def min(self, a, b):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004760 """min compares two values numerically and returns the minimum.
4761
4762 If either operand is a NaN then the general rules apply.
Christian Heimes679db4a2008-01-18 09:56:22 +00004763 Otherwise, the operands are compared as though by the compare
Guido van Rossumd8faa362007-04-27 19:54:29 +00004764 operation. If they are numerically equal then the left-hand operand
4765 is chosen as the result. Otherwise the minimum (closer to negative
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004766 infinity) of the two operands is chosen as the result.
4767
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004768 >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004769 Decimal('2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004770 >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004771 Decimal('-10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004772 >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004773 Decimal('1.0')
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004774 >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004775 Decimal('7')
Mark Dickinson84230a12010-02-18 14:49:50 +00004776 >>> ExtendedContext.min(1, 2)
4777 Decimal('1')
4778 >>> ExtendedContext.min(Decimal(1), 2)
4779 Decimal('1')
4780 >>> ExtendedContext.min(1, Decimal(29))
4781 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004782 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004783 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004784 return a.min(b, context=self)
4785
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004786 def min_mag(self, a, b):
Mark Dickinson84230a12010-02-18 14:49:50 +00004787 """Compares the values numerically with their sign ignored.
4788
4789 >>> ExtendedContext.min_mag(Decimal('3'), Decimal('-2'))
4790 Decimal('-2')
4791 >>> ExtendedContext.min_mag(Decimal('-3'), Decimal('NaN'))
4792 Decimal('-3')
4793 >>> ExtendedContext.min_mag(1, -2)
4794 Decimal('1')
4795 >>> ExtendedContext.min_mag(Decimal(1), -2)
4796 Decimal('1')
4797 >>> ExtendedContext.min_mag(1, Decimal(-2))
4798 Decimal('1')
4799 """
4800 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004801 return a.min_mag(b, context=self)
4802
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004803 def minus(self, a):
4804 """Minus corresponds to unary prefix minus in Python.
4805
4806 The operation is evaluated using the same rules as subtract; the
4807 operation minus(a) is calculated as subtract('0', a) where the '0'
4808 has the same exponent as the operand.
4809
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004810 >>> ExtendedContext.minus(Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004811 Decimal('-1.3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004812 >>> ExtendedContext.minus(Decimal('-1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004813 Decimal('1.3')
Mark Dickinson84230a12010-02-18 14:49:50 +00004814 >>> ExtendedContext.minus(1)
4815 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004816 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004817 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004818 return a.__neg__(context=self)
4819
4820 def multiply(self, a, b):
4821 """multiply multiplies two operands.
4822
4823 If either operand is a special value then the general rules apply.
Mark Dickinson84230a12010-02-18 14:49:50 +00004824 Otherwise, the operands are multiplied together
4825 ('long multiplication'), resulting in a number which may be as long as
4826 the sum of the lengths of the two operands.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004827
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004828 >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004829 Decimal('3.60')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004830 >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004831 Decimal('21')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004832 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004833 Decimal('0.72')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004834 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004835 Decimal('-0.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004836 >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004837 Decimal('4.28135971E+11')
Mark Dickinson84230a12010-02-18 14:49:50 +00004838 >>> ExtendedContext.multiply(7, 7)
4839 Decimal('49')
4840 >>> ExtendedContext.multiply(Decimal(7), 7)
4841 Decimal('49')
4842 >>> ExtendedContext.multiply(7, Decimal(7))
4843 Decimal('49')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004844 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004845 a = _convert_other(a, raiseit=True)
4846 r = a.__mul__(b, context=self)
4847 if r is NotImplemented:
4848 raise TypeError("Unable to convert %s to Decimal" % b)
4849 else:
4850 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004851
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004852 def next_minus(self, a):
4853 """Returns the largest representable number smaller than a.
4854
4855 >>> c = ExtendedContext.copy()
4856 >>> c.Emin = -999
4857 >>> c.Emax = 999
4858 >>> ExtendedContext.next_minus(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004859 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004860 >>> c.next_minus(Decimal('1E-1007'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004861 Decimal('0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004862 >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004863 Decimal('-1.00000004')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004864 >>> c.next_minus(Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004865 Decimal('9.99999999E+999')
Mark Dickinson84230a12010-02-18 14:49:50 +00004866 >>> c.next_minus(1)
4867 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004868 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004869 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004870 return a.next_minus(context=self)
4871
4872 def next_plus(self, a):
4873 """Returns the smallest representable number larger than a.
4874
4875 >>> c = ExtendedContext.copy()
4876 >>> c.Emin = -999
4877 >>> c.Emax = 999
4878 >>> ExtendedContext.next_plus(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004879 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004880 >>> c.next_plus(Decimal('-1E-1007'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004881 Decimal('-0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004882 >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004883 Decimal('-1.00000002')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004884 >>> c.next_plus(Decimal('-Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004885 Decimal('-9.99999999E+999')
Mark Dickinson84230a12010-02-18 14:49:50 +00004886 >>> c.next_plus(1)
4887 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004888 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004889 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004890 return a.next_plus(context=self)
4891
4892 def next_toward(self, a, b):
4893 """Returns the number closest to a, in direction towards b.
4894
4895 The result is the closest representable number from the first
4896 operand (but not the first operand) that is in the direction
4897 towards the second operand, unless the operands have the same
4898 value.
4899
4900 >>> c = ExtendedContext.copy()
4901 >>> c.Emin = -999
4902 >>> c.Emax = 999
4903 >>> c.next_toward(Decimal('1'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004904 Decimal('1.00000001')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004905 >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004906 Decimal('-0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004907 >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004908 Decimal('-1.00000002')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004909 >>> c.next_toward(Decimal('1'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004910 Decimal('0.999999999')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004911 >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004912 Decimal('0E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004913 >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004914 Decimal('-1.00000004')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004915 >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004916 Decimal('-0.00')
Mark Dickinson84230a12010-02-18 14:49:50 +00004917 >>> c.next_toward(0, 1)
4918 Decimal('1E-1007')
4919 >>> c.next_toward(Decimal(0), 1)
4920 Decimal('1E-1007')
4921 >>> c.next_toward(0, Decimal(1))
4922 Decimal('1E-1007')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004923 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004924 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004925 return a.next_toward(b, context=self)
4926
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004927 def normalize(self, a):
Raymond Hettingere0f15812004-07-05 05:36:39 +00004928 """normalize reduces an operand to its simplest form.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004929
4930 Essentially a plus operation with all trailing zeros removed from the
4931 result.
4932
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004933 >>> ExtendedContext.normalize(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004934 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004935 >>> ExtendedContext.normalize(Decimal('-2.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004936 Decimal('-2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004937 >>> ExtendedContext.normalize(Decimal('1.200'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004938 Decimal('1.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004939 >>> ExtendedContext.normalize(Decimal('-120'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004940 Decimal('-1.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004941 >>> ExtendedContext.normalize(Decimal('120.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004942 Decimal('1.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004943 >>> ExtendedContext.normalize(Decimal('0.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004944 Decimal('0')
Mark Dickinson84230a12010-02-18 14:49:50 +00004945 >>> ExtendedContext.normalize(6)
4946 Decimal('6')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004947 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004948 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004949 return a.normalize(context=self)
4950
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004951 def number_class(self, a):
4952 """Returns an indication of the class of the operand.
4953
4954 The class is one of the following strings:
4955 -sNaN
4956 -NaN
4957 -Infinity
4958 -Normal
4959 -Subnormal
4960 -Zero
4961 +Zero
4962 +Subnormal
4963 +Normal
4964 +Infinity
4965
4966 >>> c = Context(ExtendedContext)
4967 >>> c.Emin = -999
4968 >>> c.Emax = 999
4969 >>> c.number_class(Decimal('Infinity'))
4970 '+Infinity'
4971 >>> c.number_class(Decimal('1E-10'))
4972 '+Normal'
4973 >>> c.number_class(Decimal('2.50'))
4974 '+Normal'
4975 >>> c.number_class(Decimal('0.1E-999'))
4976 '+Subnormal'
4977 >>> c.number_class(Decimal('0'))
4978 '+Zero'
4979 >>> c.number_class(Decimal('-0'))
4980 '-Zero'
4981 >>> c.number_class(Decimal('-0.1E-999'))
4982 '-Subnormal'
4983 >>> c.number_class(Decimal('-1E-10'))
4984 '-Normal'
4985 >>> c.number_class(Decimal('-2.50'))
4986 '-Normal'
4987 >>> c.number_class(Decimal('-Infinity'))
4988 '-Infinity'
4989 >>> c.number_class(Decimal('NaN'))
4990 'NaN'
4991 >>> c.number_class(Decimal('-NaN'))
4992 'NaN'
4993 >>> c.number_class(Decimal('sNaN'))
4994 'sNaN'
Mark Dickinson84230a12010-02-18 14:49:50 +00004995 >>> c.number_class(123)
4996 '+Normal'
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004997 """
Mark Dickinson84230a12010-02-18 14:49:50 +00004998 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004999 return a.number_class(context=self)
5000
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005001 def plus(self, a):
5002 """Plus corresponds to unary prefix plus in Python.
5003
5004 The operation is evaluated using the same rules as add; the
5005 operation plus(a) is calculated as add('0', a) where the '0'
5006 has the same exponent as the operand.
5007
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005008 >>> ExtendedContext.plus(Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005009 Decimal('1.3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005010 >>> ExtendedContext.plus(Decimal('-1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005011 Decimal('-1.3')
Mark Dickinson84230a12010-02-18 14:49:50 +00005012 >>> ExtendedContext.plus(-1)
5013 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005014 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005015 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005016 return a.__pos__(context=self)
5017
5018 def power(self, a, b, modulo=None):
5019 """Raises a to the power of b, to modulo if given.
5020
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005021 With two arguments, compute a**b. If a is negative then b
5022 must be integral. The result will be inexact unless b is
5023 integral and the result is finite and can be expressed exactly
5024 in 'precision' digits.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005025
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005026 With three arguments, compute (a**b) % modulo. For the
5027 three argument form, the following restrictions on the
5028 arguments hold:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005029
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005030 - all three arguments must be integral
5031 - b must be nonnegative
5032 - at least one of a or b must be nonzero
5033 - modulo must be nonzero and have at most 'precision' digits
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005034
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005035 The result of pow(a, b, modulo) is identical to the result
5036 that would be obtained by computing (a**b) % modulo with
5037 unbounded precision, but is computed more efficiently. It is
5038 always exact.
5039
5040 >>> c = ExtendedContext.copy()
5041 >>> c.Emin = -999
5042 >>> c.Emax = 999
5043 >>> c.power(Decimal('2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005044 Decimal('8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005045 >>> c.power(Decimal('-2'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005046 Decimal('-8')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005047 >>> c.power(Decimal('2'), Decimal('-3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005048 Decimal('0.125')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005049 >>> c.power(Decimal('1.7'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005050 Decimal('69.7575744')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005051 >>> c.power(Decimal('10'), Decimal('0.301029996'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005052 Decimal('2.00000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005053 >>> c.power(Decimal('Infinity'), Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005054 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005055 >>> c.power(Decimal('Infinity'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005056 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005057 >>> c.power(Decimal('Infinity'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005058 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005059 >>> c.power(Decimal('-Infinity'), Decimal('-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005060 Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005061 >>> c.power(Decimal('-Infinity'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005062 Decimal('1')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005063 >>> c.power(Decimal('-Infinity'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005064 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005065 >>> c.power(Decimal('-Infinity'), Decimal('2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005066 Decimal('Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005067 >>> c.power(Decimal('0'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005068 Decimal('NaN')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005069
5070 >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005071 Decimal('11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005072 >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005073 Decimal('-11')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005074 >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005075 Decimal('1')
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('23E12345'), Decimal('67E189'), Decimal('123456789'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005079 Decimal('11729830')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005080 >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005081 Decimal('-0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005082 >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005083 Decimal('1')
Mark Dickinson84230a12010-02-18 14:49:50 +00005084 >>> ExtendedContext.power(7, 7)
5085 Decimal('823543')
5086 >>> ExtendedContext.power(Decimal(7), 7)
5087 Decimal('823543')
5088 >>> ExtendedContext.power(7, Decimal(7), 2)
5089 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005090 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005091 a = _convert_other(a, raiseit=True)
5092 r = a.__pow__(b, modulo, context=self)
5093 if r is NotImplemented:
5094 raise TypeError("Unable to convert %s to Decimal" % b)
5095 else:
5096 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005097
5098 def quantize(self, a, b):
Guido van Rossumd8faa362007-04-27 19:54:29 +00005099 """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005100
5101 The coefficient of the result is derived from that of the left-hand
Guido van Rossumd8faa362007-04-27 19:54:29 +00005102 operand. It may be rounded using the current rounding setting (if the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005103 exponent is being increased), multiplied by a positive power of ten (if
5104 the exponent is being decreased), or is unchanged (if the exponent is
5105 already equal to that of the right-hand operand).
5106
5107 Unlike other operations, if the length of the coefficient after the
5108 quantize operation would be greater than precision then an Invalid
Guido van Rossumd8faa362007-04-27 19:54:29 +00005109 operation condition is raised. This guarantees that, unless there is
5110 an error condition, the exponent of the result of a quantize is always
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005111 equal to that of the right-hand operand.
5112
5113 Also unlike other operations, quantize will never raise Underflow, even
5114 if the result is subnormal and inexact.
5115
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005116 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005117 Decimal('2.170')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005118 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005119 Decimal('2.17')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005120 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005121 Decimal('2.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005122 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005123 Decimal('2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005124 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005125 Decimal('0E+1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005126 >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005127 Decimal('-Infinity')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005128 >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005129 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005130 >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005131 Decimal('-0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005132 >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005133 Decimal('-0E+5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005134 >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005135 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005136 >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005137 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005138 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005139 Decimal('217.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005140 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005141 Decimal('217')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005142 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005143 Decimal('2.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005144 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005145 Decimal('2E+2')
Mark Dickinson84230a12010-02-18 14:49:50 +00005146 >>> ExtendedContext.quantize(1, 2)
5147 Decimal('1')
5148 >>> ExtendedContext.quantize(Decimal(1), 2)
5149 Decimal('1')
5150 >>> ExtendedContext.quantize(1, Decimal(2))
5151 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005152 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005153 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005154 return a.quantize(b, context=self)
5155
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005156 def radix(self):
5157 """Just returns 10, as this is Decimal, :)
5158
5159 >>> ExtendedContext.radix()
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005160 Decimal('10')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005161 """
5162 return Decimal(10)
5163
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005164 def remainder(self, a, b):
5165 """Returns the remainder from integer division.
5166
5167 The result is the residue of the dividend after the operation of
Guido van Rossumd8faa362007-04-27 19:54:29 +00005168 calculating integer division as described for divide-integer, rounded
5169 to precision digits if necessary. The sign of the result, if
5170 non-zero, is the same as that of the original dividend.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005171
5172 This operation will fail under the same conditions as integer division
5173 (that is, if integer division on the same two operands would fail, the
5174 remainder cannot be calculated).
5175
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005176 >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005177 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005178 >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005179 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005180 >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005181 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005182 >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005183 Decimal('0.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005184 >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005185 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005186 >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005187 Decimal('1.0')
Mark Dickinson84230a12010-02-18 14:49:50 +00005188 >>> ExtendedContext.remainder(22, 6)
5189 Decimal('4')
5190 >>> ExtendedContext.remainder(Decimal(22), 6)
5191 Decimal('4')
5192 >>> ExtendedContext.remainder(22, Decimal(6))
5193 Decimal('4')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005194 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005195 a = _convert_other(a, raiseit=True)
5196 r = a.__mod__(b, context=self)
5197 if r is NotImplemented:
5198 raise TypeError("Unable to convert %s to Decimal" % b)
5199 else:
5200 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005201
5202 def remainder_near(self, a, b):
5203 """Returns to be "a - b * n", where n is the integer nearest the exact
5204 value of "x / b" (if two integers are equally near then the even one
Guido van Rossumd8faa362007-04-27 19:54:29 +00005205 is chosen). If the result is equal to 0 then its sign will be the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005206 sign of a.
5207
5208 This operation will fail under the same conditions as integer division
5209 (that is, if integer division on the same two operands would fail, the
5210 remainder cannot be calculated).
5211
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005212 >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005213 Decimal('-0.9')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005214 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005215 Decimal('-2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005216 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005217 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005218 >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005219 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005220 >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005221 Decimal('0.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005222 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005223 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005224 >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005225 Decimal('-0.3')
Mark Dickinson84230a12010-02-18 14:49:50 +00005226 >>> ExtendedContext.remainder_near(3, 11)
5227 Decimal('3')
5228 >>> ExtendedContext.remainder_near(Decimal(3), 11)
5229 Decimal('3')
5230 >>> ExtendedContext.remainder_near(3, Decimal(11))
5231 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005232 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005233 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005234 return a.remainder_near(b, context=self)
5235
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005236 def rotate(self, a, b):
5237 """Returns a rotated copy of a, b times.
5238
5239 The coefficient of the result is a rotated copy of the digits in
5240 the coefficient of the first operand. The number of places of
5241 rotation is taken from the absolute value of the second operand,
5242 with the rotation being to the left if the second operand is
5243 positive or to the right otherwise.
5244
5245 >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005246 Decimal('400000003')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005247 >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005248 Decimal('12')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005249 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005250 Decimal('891234567')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005251 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005252 Decimal('123456789')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005253 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005254 Decimal('345678912')
Mark Dickinson84230a12010-02-18 14:49:50 +00005255 >>> ExtendedContext.rotate(1333333, 1)
5256 Decimal('13333330')
5257 >>> ExtendedContext.rotate(Decimal(1333333), 1)
5258 Decimal('13333330')
5259 >>> ExtendedContext.rotate(1333333, Decimal(1))
5260 Decimal('13333330')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005261 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005262 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005263 return a.rotate(b, context=self)
5264
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005265 def same_quantum(self, a, b):
5266 """Returns True if the two operands have the same exponent.
5267
5268 The result is never affected by either the sign or the coefficient of
5269 either operand.
5270
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005271 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005272 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005273 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005274 True
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005275 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005276 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005277 >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005278 True
Mark Dickinson84230a12010-02-18 14:49:50 +00005279 >>> ExtendedContext.same_quantum(10000, -1)
5280 True
5281 >>> ExtendedContext.same_quantum(Decimal(10000), -1)
5282 True
5283 >>> ExtendedContext.same_quantum(10000, Decimal(-1))
5284 True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005285 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005286 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005287 return a.same_quantum(b)
5288
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005289 def scaleb (self, a, b):
5290 """Returns the first operand after adding the second value its exp.
5291
5292 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005293 Decimal('0.0750')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005294 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005295 Decimal('7.50')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005296 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005297 Decimal('7.50E+3')
Mark Dickinson84230a12010-02-18 14:49:50 +00005298 >>> ExtendedContext.scaleb(1, 4)
5299 Decimal('1E+4')
5300 >>> ExtendedContext.scaleb(Decimal(1), 4)
5301 Decimal('1E+4')
5302 >>> ExtendedContext.scaleb(1, Decimal(4))
5303 Decimal('1E+4')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005304 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005305 a = _convert_other(a, raiseit=True)
5306 return a.scaleb(b, context=self)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005307
5308 def shift(self, a, b):
5309 """Returns a shifted copy of a, b times.
5310
5311 The coefficient of the result is a shifted copy of the digits
5312 in the coefficient of the first operand. The number of places
5313 to shift is taken from the absolute value of the second operand,
5314 with the shift being to the left if the second operand is
5315 positive or to the right otherwise. Digits shifted into the
5316 coefficient are zeros.
5317
5318 >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005319 Decimal('400000000')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005320 >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005321 Decimal('0')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005322 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005323 Decimal('1234567')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005324 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005325 Decimal('123456789')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005326 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005327 Decimal('345678900')
Mark Dickinson84230a12010-02-18 14:49:50 +00005328 >>> ExtendedContext.shift(88888888, 2)
5329 Decimal('888888800')
5330 >>> ExtendedContext.shift(Decimal(88888888), 2)
5331 Decimal('888888800')
5332 >>> ExtendedContext.shift(88888888, Decimal(2))
5333 Decimal('888888800')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005334 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005335 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005336 return a.shift(b, context=self)
5337
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005338 def sqrt(self, a):
Guido van Rossumd8faa362007-04-27 19:54:29 +00005339 """Square root of a non-negative number to context precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005340
5341 If the result must be inexact, it is rounded using the round-half-even
5342 algorithm.
5343
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005344 >>> ExtendedContext.sqrt(Decimal('0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005345 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005346 >>> ExtendedContext.sqrt(Decimal('-0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005347 Decimal('-0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005348 >>> ExtendedContext.sqrt(Decimal('0.39'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005349 Decimal('0.624499800')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005350 >>> ExtendedContext.sqrt(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005351 Decimal('10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005352 >>> ExtendedContext.sqrt(Decimal('1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005353 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005354 >>> ExtendedContext.sqrt(Decimal('1.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005355 Decimal('1.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005356 >>> ExtendedContext.sqrt(Decimal('1.00'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005357 Decimal('1.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005358 >>> ExtendedContext.sqrt(Decimal('7'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005359 Decimal('2.64575131')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005360 >>> ExtendedContext.sqrt(Decimal('10'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005361 Decimal('3.16227766')
Mark Dickinson84230a12010-02-18 14:49:50 +00005362 >>> ExtendedContext.sqrt(2)
5363 Decimal('1.41421356')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005364 >>> ExtendedContext.prec
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005365 9
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005366 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005367 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005368 return a.sqrt(context=self)
5369
5370 def subtract(self, a, b):
Georg Brandlf33d01d2005-08-22 19:35:18 +00005371 """Return the difference between the two operands.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005372
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005373 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005374 Decimal('0.23')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005375 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005376 Decimal('0.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005377 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005378 Decimal('-0.77')
Mark Dickinson84230a12010-02-18 14:49:50 +00005379 >>> ExtendedContext.subtract(8, 5)
5380 Decimal('3')
5381 >>> ExtendedContext.subtract(Decimal(8), 5)
5382 Decimal('3')
5383 >>> ExtendedContext.subtract(8, Decimal(5))
5384 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005385 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005386 a = _convert_other(a, raiseit=True)
5387 r = a.__sub__(b, context=self)
5388 if r is NotImplemented:
5389 raise TypeError("Unable to convert %s to Decimal" % b)
5390 else:
5391 return r
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005392
5393 def to_eng_string(self, a):
5394 """Converts a number to a string, using scientific notation.
5395
5396 The operation is not affected by the context.
5397 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005398 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005399 return a.to_eng_string(context=self)
5400
5401 def to_sci_string(self, a):
5402 """Converts a number to a string, using scientific notation.
5403
5404 The operation is not affected by the context.
5405 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005406 a = _convert_other(a, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005407 return a.__str__(context=self)
5408
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005409 def to_integral_exact(self, a):
5410 """Rounds to an integer.
5411
5412 When the operand has a negative exponent, the result is the same
5413 as using the quantize() operation using the given operand as the
5414 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
5415 of the operand as the precision setting; Inexact and Rounded flags
5416 are allowed in this operation. The rounding mode is taken from the
5417 context.
5418
5419 >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005420 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005421 >>> ExtendedContext.to_integral_exact(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005422 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005423 >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005424 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005425 >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005426 Decimal('102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005427 >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005428 Decimal('-102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005429 >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005430 Decimal('1.0E+6')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005431 >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005432 Decimal('7.89E+77')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005433 >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005434 Decimal('-Infinity')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005435 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005436 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005437 return a.to_integral_exact(context=self)
5438
5439 def to_integral_value(self, a):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005440 """Rounds to an integer.
5441
5442 When the operand has a negative exponent, the result is the same
5443 as using the quantize() operation using the given operand as the
5444 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
5445 of the operand as the precision setting, except that no flags will
Guido van Rossumd8faa362007-04-27 19:54:29 +00005446 be set. The rounding mode is taken from the context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005447
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005448 >>> ExtendedContext.to_integral_value(Decimal('2.1'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005449 Decimal('2')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005450 >>> ExtendedContext.to_integral_value(Decimal('100'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005451 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005452 >>> ExtendedContext.to_integral_value(Decimal('100.0'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005453 Decimal('100')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005454 >>> ExtendedContext.to_integral_value(Decimal('101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005455 Decimal('102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005456 >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005457 Decimal('-102')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005458 >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005459 Decimal('1.0E+6')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005460 >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005461 Decimal('7.89E+77')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005462 >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
Christian Heimes68f5fbe2008-02-14 08:27:37 +00005463 Decimal('-Infinity')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005464 """
Mark Dickinson84230a12010-02-18 14:49:50 +00005465 a = _convert_other(a, raiseit=True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005466 return a.to_integral_value(context=self)
5467
5468 # the method name changed, but we provide also the old one, for compatibility
5469 to_integral = to_integral_value
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005470
5471class _WorkRep(object):
5472 __slots__ = ('sign','int','exp')
Raymond Hettinger17931de2004-10-27 06:21:46 +00005473 # sign: 0 or 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005474 # int: int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005475 # exp: None, int, or string
5476
5477 def __init__(self, value=None):
5478 if value is None:
5479 self.sign = None
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005480 self.int = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005481 self.exp = None
Raymond Hettinger17931de2004-10-27 06:21:46 +00005482 elif isinstance(value, Decimal):
5483 self.sign = value._sign
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005484 self.int = int(value._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005485 self.exp = value._exp
Raymond Hettinger17931de2004-10-27 06:21:46 +00005486 else:
5487 # assert isinstance(value, tuple)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005488 self.sign = value[0]
5489 self.int = value[1]
5490 self.exp = value[2]
5491
5492 def __repr__(self):
5493 return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
5494
5495 __str__ = __repr__
5496
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005497
5498
Christian Heimes2c181612007-12-17 20:04:13 +00005499def _normalize(op1, op2, prec = 0):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005500 """Normalizes op1, op2 to have the same exp and length of coefficient.
5501
5502 Done during addition.
5503 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005504 if op1.exp < op2.exp:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005505 tmp = op2
5506 other = op1
5507 else:
5508 tmp = op1
5509 other = op2
5510
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005511 # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
5512 # Then adding 10**exp to tmp has the same effect (after rounding)
5513 # as adding any positive quantity smaller than 10**exp; similarly
5514 # for subtraction. So if other is smaller than 10**exp we replace
5515 # it with 10**exp. This avoids tmp.exp - other.exp getting too large.
Christian Heimes2c181612007-12-17 20:04:13 +00005516 tmp_len = len(str(tmp.int))
5517 other_len = len(str(other.int))
5518 exp = tmp.exp + min(-1, tmp_len - prec - 2)
5519 if other_len + other.exp - 1 < exp:
5520 other.int = 1
5521 other.exp = exp
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005522
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005523 tmp.int *= 10 ** (tmp.exp - other.exp)
5524 tmp.exp = other.exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005525 return op1, op2
5526
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005527##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005528
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005529# This function from Tim Peters was taken from here:
5530# http://mail.python.org/pipermail/python-list/1999-July/007758.html
5531# The correction being in the function definition is for speed, and
5532# the whole function is not resolved with math.log because of avoiding
5533# the use of floats.
5534def _nbits(n, correction = {
5535 '0': 4, '1': 3, '2': 2, '3': 2,
5536 '4': 1, '5': 1, '6': 1, '7': 1,
5537 '8': 0, '9': 0, 'a': 0, 'b': 0,
5538 'c': 0, 'd': 0, 'e': 0, 'f': 0}):
5539 """Number of bits in binary representation of the positive integer n,
5540 or 0 if n == 0.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005541 """
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005542 if n < 0:
5543 raise ValueError("The argument to _nbits should be nonnegative.")
5544 hex_n = "%x" % n
5545 return 4*len(hex_n) - correction[hex_n[0]]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005546
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005547def _sqrt_nearest(n, a):
5548 """Closest integer to the square root of the positive integer n. a is
5549 an initial approximation to the square root. Any positive integer
5550 will do for a, but the closer a is to the square root of n the
5551 faster convergence will be.
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005552
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005553 """
5554 if n <= 0 or a <= 0:
5555 raise ValueError("Both arguments to _sqrt_nearest should be positive.")
5556
5557 b=0
5558 while a != b:
5559 b, a = a, a--n//a>>1
5560 return a
5561
5562def _rshift_nearest(x, shift):
5563 """Given an integer x and a nonnegative integer shift, return closest
5564 integer to x / 2**shift; use round-to-even in case of a tie.
5565
5566 """
5567 b, q = 1 << shift, x >> shift
5568 return q + (2*(x & (b-1)) + (q&1) > b)
5569
5570def _div_nearest(a, b):
5571 """Closest integer to a/b, a and b positive integers; rounds to even
5572 in the case of a tie.
5573
5574 """
5575 q, r = divmod(a, b)
5576 return q + (2*r + (q&1) > b)
5577
5578def _ilog(x, M, L = 8):
5579 """Integer approximation to M*log(x/M), with absolute error boundable
5580 in terms only of x/M.
5581
5582 Given positive integers x and M, return an integer approximation to
5583 M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference
5584 between the approximation and the exact result is at most 22. For
5585 L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In
5586 both cases these are upper bounds on the error; it will usually be
5587 much smaller."""
5588
5589 # The basic algorithm is the following: let log1p be the function
5590 # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use
5591 # the reduction
5592 #
5593 # log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
5594 #
5595 # repeatedly until the argument to log1p is small (< 2**-L in
5596 # absolute value). For small y we can use the Taylor series
5597 # expansion
5598 #
5599 # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
5600 #
5601 # truncating at T such that y**T is small enough. The whole
5602 # computation is carried out in a form of fixed-point arithmetic,
5603 # with a real number z being represented by an integer
5604 # approximation to z*M. To avoid loss of precision, the y below
5605 # is actually an integer approximation to 2**R*y*M, where R is the
5606 # number of reductions performed so far.
5607
5608 y = x-M
5609 # argument reduction; R = number of reductions performed
5610 R = 0
5611 while (R <= L and abs(y) << L-R >= M or
5612 R > L and abs(y) >> R-L >= M):
5613 y = _div_nearest((M*y) << 1,
5614 M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
5615 R += 1
5616
5617 # Taylor series with T terms
5618 T = -int(-10*len(str(M))//(3*L))
5619 yshift = _rshift_nearest(y, R)
5620 w = _div_nearest(M, T)
5621 for k in range(T-1, 0, -1):
5622 w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
5623
5624 return _div_nearest(w*y, M)
5625
5626def _dlog10(c, e, p):
5627 """Given integers c, e and p with c > 0, p >= 0, compute an integer
5628 approximation to 10**p * log10(c*10**e), with an absolute error of
5629 at most 1. Assumes that c*10**e is not exactly 1."""
5630
5631 # increase precision by 2; compensate for this by dividing
5632 # final result by 100
5633 p += 2
5634
5635 # write c*10**e as d*10**f with either:
5636 # f >= 0 and 1 <= d <= 10, or
5637 # f <= 0 and 0.1 <= d <= 1.
5638 # Thus for c*10**e close to 1, f = 0
5639 l = len(str(c))
5640 f = e+l - (e+l >= 1)
5641
5642 if p > 0:
5643 M = 10**p
5644 k = e+p-f
5645 if k >= 0:
5646 c *= 10**k
5647 else:
5648 c = _div_nearest(c, 10**-k)
5649
5650 log_d = _ilog(c, M) # error < 5 + 22 = 27
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005651 log_10 = _log10_digits(p) # error < 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005652 log_d = _div_nearest(log_d*M, log_10)
5653 log_tenpower = f*M # exact
5654 else:
5655 log_d = 0 # error < 2.31
Neal Norwitz2f99b242008-08-24 05:48:10 +00005656 log_tenpower = _div_nearest(f, 10**-p) # error < 0.5
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005657
5658 return _div_nearest(log_tenpower+log_d, 100)
5659
5660def _dlog(c, e, p):
5661 """Given integers c, e and p with c > 0, compute an integer
5662 approximation to 10**p * log(c*10**e), with an absolute error of
5663 at most 1. Assumes that c*10**e is not exactly 1."""
5664
5665 # Increase precision by 2. The precision increase is compensated
5666 # for at the end with a division by 100.
5667 p += 2
5668
5669 # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
5670 # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e)
5671 # as 10**p * log(d) + 10**p*f * log(10).
5672 l = len(str(c))
5673 f = e+l - (e+l >= 1)
5674
5675 # compute approximation to 10**p*log(d), with error < 27
5676 if p > 0:
5677 k = e+p-f
5678 if k >= 0:
5679 c *= 10**k
5680 else:
5681 c = _div_nearest(c, 10**-k) # error of <= 0.5 in c
5682
5683 # _ilog magnifies existing error in c by a factor of at most 10
5684 log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
5685 else:
5686 # p <= 0: just approximate the whole thing by 0; error < 2.31
5687 log_d = 0
5688
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005689 # compute approximation to f*10**p*log(10), with error < 11.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005690 if f:
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005691 extra = len(str(abs(f)))-1
5692 if p + extra >= 0:
5693 # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
5694 # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
5695 f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005696 else:
5697 f_log_ten = 0
5698 else:
5699 f_log_ten = 0
5700
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005701 # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005702 return _div_nearest(f_log_ten + log_d, 100)
5703
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005704class _Log10Memoize(object):
5705 """Class to compute, store, and allow retrieval of, digits of the
5706 constant log(10) = 2.302585.... This constant is needed by
5707 Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
5708 def __init__(self):
5709 self.digits = "23025850929940456840179914546843642076011014886"
5710
5711 def getdigits(self, p):
5712 """Given an integer p >= 0, return floor(10**p)*log(10).
5713
5714 For example, self.getdigits(3) returns 2302.
5715 """
5716 # digits are stored as a string, for quick conversion to
5717 # integer in the case that we've already computed enough
5718 # digits; the stored digits should always be correct
5719 # (truncated, not rounded to nearest).
5720 if p < 0:
5721 raise ValueError("p should be nonnegative")
5722
5723 if p >= len(self.digits):
5724 # compute p+3, p+6, p+9, ... digits; continue until at
5725 # least one of the extra digits is nonzero
5726 extra = 3
5727 while True:
5728 # compute p+extra digits, correct to within 1ulp
5729 M = 10**(p+extra+2)
5730 digits = str(_div_nearest(_ilog(10*M, M), 100))
5731 if digits[-extra:] != '0'*extra:
5732 break
5733 extra += 3
5734 # keep all reliable digits so far; remove trailing zeros
5735 # and next nonzero digit
5736 self.digits = digits.rstrip('0')[:-1]
5737 return int(self.digits[:p+1])
5738
5739_log10_digits = _Log10Memoize().getdigits
5740
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005741def _iexp(x, M, L=8):
5742 """Given integers x and M, M > 0, such that x/M is small in absolute
5743 value, compute an integer approximation to M*exp(x/M). For 0 <=
5744 x/M <= 2.4, the absolute error in the result is bounded by 60 (and
5745 is usually much smaller)."""
5746
5747 # Algorithm: to compute exp(z) for a real number z, first divide z
5748 # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then
5749 # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
5750 # series
5751 #
5752 # expm1(x) = x + x**2/2! + x**3/3! + ...
5753 #
5754 # Now use the identity
5755 #
5756 # expm1(2x) = expm1(x)*(expm1(x)+2)
5757 #
5758 # R times to compute the sequence expm1(z/2**R),
5759 # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
5760
5761 # Find R such that x/2**R/M <= 2**-L
5762 R = _nbits((x<<L)//M)
5763
5764 # Taylor series. (2**L)**T > M
5765 T = -int(-10*len(str(M))//(3*L))
5766 y = _div_nearest(x, T)
5767 Mshift = M<<R
5768 for i in range(T-1, 0, -1):
5769 y = _div_nearest(x*(Mshift + y), Mshift * i)
5770
5771 # Expansion
5772 for k in range(R-1, -1, -1):
5773 Mshift = M<<(k+2)
5774 y = _div_nearest(y*(y+Mshift), Mshift)
5775
5776 return M+y
5777
5778def _dexp(c, e, p):
5779 """Compute an approximation to exp(c*10**e), with p decimal places of
5780 precision.
5781
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005782 Returns integers d, f such that:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005783
5784 10**(p-1) <= d <= 10**p, and
5785 (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
5786
5787 In other words, d*10**f is an approximation to exp(c*10**e) with p
5788 digits of precision, and with an error in d of at most 1. This is
5789 almost, but not quite, the same as the error being < 1ulp: when d
5790 = 10**(p-1) the error could be up to 10 ulp."""
5791
5792 # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
5793 p += 2
5794
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005795 # compute log(10) with extra precision = adjusted exponent of c*10**e
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005796 extra = max(0, e + len(str(c)) - 1)
5797 q = p + extra
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005798
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005799 # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005800 # rounding down
5801 shift = e+q
5802 if shift >= 0:
5803 cshift = c*10**shift
5804 else:
5805 cshift = c//10**-shift
Guido van Rossum8ce8a782007-11-01 19:42:39 +00005806 quot, rem = divmod(cshift, _log10_digits(q))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005807
5808 # reduce remainder back to original precision
5809 rem = _div_nearest(rem, 10**extra)
5810
5811 # error in result of _iexp < 120; error after division < 0.62
5812 return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
5813
5814def _dpower(xc, xe, yc, ye, p):
5815 """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
5816 y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that:
5817
5818 10**(p-1) <= c <= 10**p, and
5819 (c-1)*10**e < x**y < (c+1)*10**e
5820
5821 in other words, c*10**e is an approximation to x**y with p digits
5822 of precision, and with an error in c of at most 1. (This is
5823 almost, but not quite, the same as the error being < 1ulp: when c
5824 == 10**(p-1) we can only guarantee error < 10ulp.)
5825
5826 We assume that: x is positive and not equal to 1, and y is nonzero.
5827 """
5828
5829 # Find b such that 10**(b-1) <= |y| <= 10**b
5830 b = len(str(abs(yc))) + ye
5831
5832 # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
5833 lxc = _dlog(xc, xe, p+b+1)
5834
5835 # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
5836 shift = ye-b
5837 if shift >= 0:
5838 pc = lxc*yc*10**shift
5839 else:
5840 pc = _div_nearest(lxc*yc, 10**-shift)
5841
5842 if pc == 0:
5843 # we prefer a result that isn't exactly 1; this makes it
5844 # easier to compute a correctly rounded result in __pow__
5845 if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
5846 coeff, exp = 10**(p-1)+1, 1-p
5847 else:
5848 coeff, exp = 10**p-1, -p
5849 else:
5850 coeff, exp = _dexp(pc, -(p+1), p+1)
5851 coeff = _div_nearest(coeff, 10)
5852 exp += 1
5853
5854 return coeff, exp
5855
5856def _log10_lb(c, correction = {
5857 '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
5858 '6': 23, '7': 16, '8': 10, '9': 5}):
5859 """Compute a lower bound for 100*log10(c) for a positive integer c."""
5860 if c <= 0:
5861 raise ValueError("The argument to _log10_lb should be nonnegative.")
5862 str_c = str(c)
5863 return 100*len(str_c) - correction[str_c[0]]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005864
Guido van Rossumd8faa362007-04-27 19:54:29 +00005865##### Helper Functions ####################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005866
Mark Dickinsonac256ab2010-04-03 11:08:14 +00005867def _convert_other(other, raiseit=False, allow_float=False):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005868 """Convert other to Decimal.
5869
5870 Verifies that it's ok to use in an implicit construction.
Mark Dickinsonac256ab2010-04-03 11:08:14 +00005871 If allow_float is true, allow conversion from float; this
5872 is used in the comparison methods (__eq__ and friends).
5873
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005874 """
5875 if isinstance(other, Decimal):
5876 return other
Walter Dörwaldaa97f042007-05-03 21:05:51 +00005877 if isinstance(other, int):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005878 return Decimal(other)
Mark Dickinsonac256ab2010-04-03 11:08:14 +00005879 if allow_float and isinstance(other, float):
5880 return Decimal.from_float(other)
5881
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005882 if raiseit:
5883 raise TypeError("Unable to convert %s to Decimal" % other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00005884 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005885
Mark Dickinson08ade6f2010-06-11 10:44:52 +00005886def _convert_for_comparison(self, other, equality_op=False):
5887 """Given a Decimal instance self and a Python object other, return
Mark Dickinson1c164a62010-06-11 16:49:20 +00005888 a pair (s, o) of Decimal instances such that "s op o" is
Mark Dickinson08ade6f2010-06-11 10:44:52 +00005889 equivalent to "self op other" for any of the 6 comparison
5890 operators "op".
5891
5892 """
5893 if isinstance(other, Decimal):
5894 return self, other
5895
5896 # Comparison with a Rational instance (also includes integers):
5897 # self op n/d <=> self*d op n (for n and d integers, d positive).
5898 # A NaN or infinity can be left unchanged without affecting the
5899 # comparison result.
5900 if isinstance(other, _numbers.Rational):
5901 if not self._is_special:
5902 self = _dec_from_triple(self._sign,
5903 str(int(self._int) * other.denominator),
5904 self._exp)
5905 return self, Decimal(other.numerator)
5906
5907 # Comparisons with float and complex types. == and != comparisons
5908 # with complex numbers should succeed, returning either True or False
5909 # as appropriate. Other comparisons return NotImplemented.
5910 if equality_op and isinstance(other, _numbers.Complex) and other.imag == 0:
5911 other = other.real
5912 if isinstance(other, float):
5913 return self, Decimal.from_float(other)
5914 return NotImplemented, NotImplemented
5915
5916
Guido van Rossumd8faa362007-04-27 19:54:29 +00005917##### Setup Specific Contexts ############################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005918
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005919# The default context prototype used by Context()
Raymond Hettingerfed52962004-07-14 15:41:57 +00005920# Is mutable, so that new contexts can have different default values
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005921
5922DefaultContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005923 prec=28, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005924 traps=[DivisionByZero, Overflow, InvalidOperation],
5925 flags=[],
Raymond Hettinger99148e72004-07-14 19:56:56 +00005926 Emax=999999999,
5927 Emin=-999999999,
Mark Dickinsonb1d8e322010-05-22 18:35:36 +00005928 capitals=1,
5929 clamp=0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005930)
5931
5932# Pre-made alternate contexts offered by the specification
5933# Don't change these; the user should be able to select these
5934# contexts and be able to reproduce results from other implementations
5935# of the spec.
5936
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005937BasicContext = Context(
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005938 prec=9, rounding=ROUND_HALF_UP,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005939 traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
5940 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005941)
5942
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005943ExtendedContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005944 prec=9, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005945 traps=[],
5946 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005947)
5948
5949
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005950##### crud for parsing strings #############################################
Christian Heimes23daade02008-02-25 12:39:23 +00005951#
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005952# Regular expression used for parsing numeric strings. Additional
5953# comments:
5954#
5955# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
5956# whitespace. But note that the specification disallows whitespace in
5957# a numeric string.
5958#
5959# 2. For finite numbers (not infinities and NaNs) the body of the
5960# number between the optional sign and the optional exponent must have
5961# at least one decimal digit, possibly after the decimal point. The
Mark Dickinson345adc42009-08-02 10:14:23 +00005962# lookahead expression '(?=\d|\.\d)' checks this.
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005963
5964import re
Benjamin Peterson41181742008-07-02 20:22:54 +00005965_parser = re.compile(r""" # A numeric string consists of:
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005966# \s*
Benjamin Peterson41181742008-07-02 20:22:54 +00005967 (?P<sign>[-+])? # an optional sign, followed by either...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005968 (
Mark Dickinson345adc42009-08-02 10:14:23 +00005969 (?=\d|\.\d) # ...a number (with at least one digit)
5970 (?P<int>\d*) # having a (possibly empty) integer part
5971 (\.(?P<frac>\d*))? # followed by an optional fractional part
5972 (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005973 |
Benjamin Peterson41181742008-07-02 20:22:54 +00005974 Inf(inity)? # ...an infinity, or...
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005975 |
Benjamin Peterson41181742008-07-02 20:22:54 +00005976 (?P<signal>s)? # ...an (optionally signaling)
5977 NaN # NaN
Mark Dickinson345adc42009-08-02 10:14:23 +00005978 (?P<diag>\d*) # with (possibly empty) diagnostic info.
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005979 )
5980# \s*
Christian Heimesa62da1d2008-01-12 19:39:10 +00005981 \Z
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00005982""", re.VERBOSE | re.IGNORECASE).match
5983
Christian Heimescbf3b5c2007-12-03 21:02:03 +00005984_all_zeros = re.compile('0*$').match
5985_exact_half = re.compile('50*$').match
Christian Heimesf16baeb2008-02-29 14:57:44 +00005986
5987##### PEP3101 support functions ##############################################
Mark Dickinson79f52032009-03-17 23:12:51 +00005988# The functions in this section have little to do with the Decimal
5989# class, and could potentially be reused or adapted for other pure
Christian Heimesf16baeb2008-02-29 14:57:44 +00005990# Python numeric classes that want to implement __format__
5991#
5992# A format specifier for Decimal looks like:
5993#
Mark Dickinson79f52032009-03-17 23:12:51 +00005994# [[fill]align][sign][0][minimumwidth][,][.precision][type]
Christian Heimesf16baeb2008-02-29 14:57:44 +00005995
5996_parse_format_specifier_regex = re.compile(r"""\A
5997(?:
5998 (?P<fill>.)?
5999 (?P<align>[<>=^])
6000)?
6001(?P<sign>[-+ ])?
6002(?P<zeropad>0)?
6003(?P<minimumwidth>(?!0)\d+)?
Mark Dickinson79f52032009-03-17 23:12:51 +00006004(?P<thousands_sep>,)?
Christian Heimesf16baeb2008-02-29 14:57:44 +00006005(?:\.(?P<precision>0|(?!0)\d+))?
Mark Dickinson79f52032009-03-17 23:12:51 +00006006(?P<type>[eEfFgGn%])?
Christian Heimesf16baeb2008-02-29 14:57:44 +00006007\Z
6008""", re.VERBOSE)
6009
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00006010del re
6011
Mark Dickinson79f52032009-03-17 23:12:51 +00006012# The locale module is only needed for the 'n' format specifier. The
6013# rest of the PEP 3101 code functions quite happily without it, so we
6014# don't care too much if locale isn't present.
6015try:
6016 import locale as _locale
6017except ImportError:
6018 pass
6019
6020def _parse_format_specifier(format_spec, _localeconv=None):
Christian Heimesf16baeb2008-02-29 14:57:44 +00006021 """Parse and validate a format specifier.
6022
6023 Turns a standard numeric format specifier into a dict, with the
6024 following entries:
6025
6026 fill: fill character to pad field to minimum width
6027 align: alignment type, either '<', '>', '=' or '^'
6028 sign: either '+', '-' or ' '
6029 minimumwidth: nonnegative integer giving minimum width
Mark Dickinson79f52032009-03-17 23:12:51 +00006030 zeropad: boolean, indicating whether to pad with zeros
6031 thousands_sep: string to use as thousands separator, or ''
6032 grouping: grouping for thousands separators, in format
6033 used by localeconv
6034 decimal_point: string to use for decimal point
Christian Heimesf16baeb2008-02-29 14:57:44 +00006035 precision: nonnegative integer giving precision, or None
6036 type: one of the characters 'eEfFgG%', or None
Christian Heimesf16baeb2008-02-29 14:57:44 +00006037
6038 """
6039 m = _parse_format_specifier_regex.match(format_spec)
6040 if m is None:
6041 raise ValueError("Invalid format specifier: " + format_spec)
6042
6043 # get the dictionary
6044 format_dict = m.groupdict()
6045
Mark Dickinson79f52032009-03-17 23:12:51 +00006046 # zeropad; defaults for fill and alignment. If zero padding
6047 # is requested, the fill and align fields should be absent.
Christian Heimesf16baeb2008-02-29 14:57:44 +00006048 fill = format_dict['fill']
6049 align = format_dict['align']
Mark Dickinson79f52032009-03-17 23:12:51 +00006050 format_dict['zeropad'] = (format_dict['zeropad'] is not None)
6051 if format_dict['zeropad']:
6052 if fill is not None:
Christian Heimesf16baeb2008-02-29 14:57:44 +00006053 raise ValueError("Fill character conflicts with '0'"
6054 " in format specifier: " + format_spec)
Mark Dickinson79f52032009-03-17 23:12:51 +00006055 if align is not None:
Christian Heimesf16baeb2008-02-29 14:57:44 +00006056 raise ValueError("Alignment conflicts with '0' in "
6057 "format specifier: " + format_spec)
Christian Heimesf16baeb2008-02-29 14:57:44 +00006058 format_dict['fill'] = fill or ' '
Mark Dickinson46ab5d02009-09-08 20:22:46 +00006059 # PEP 3101 originally specified that the default alignment should
6060 # be left; it was later agreed that right-aligned makes more sense
6061 # for numeric types. See http://bugs.python.org/issue6857.
6062 format_dict['align'] = align or '>'
Christian Heimesf16baeb2008-02-29 14:57:44 +00006063
Mark Dickinson79f52032009-03-17 23:12:51 +00006064 # default sign handling: '-' for negative, '' for positive
Christian Heimesf16baeb2008-02-29 14:57:44 +00006065 if format_dict['sign'] is None:
6066 format_dict['sign'] = '-'
6067
Christian Heimesf16baeb2008-02-29 14:57:44 +00006068 # minimumwidth defaults to 0; precision remains None if not given
6069 format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
6070 if format_dict['precision'] is not None:
6071 format_dict['precision'] = int(format_dict['precision'])
6072
6073 # if format type is 'g' or 'G' then a precision of 0 makes little
6074 # sense; convert it to 1. Same if format type is unspecified.
6075 if format_dict['precision'] == 0:
Mark Dickinson7718d2b2009-09-07 16:21:56 +00006076 if format_dict['type'] is None or format_dict['type'] in 'gG':
Christian Heimesf16baeb2008-02-29 14:57:44 +00006077 format_dict['precision'] = 1
6078
Mark Dickinson79f52032009-03-17 23:12:51 +00006079 # determine thousands separator, grouping, and decimal separator, and
6080 # add appropriate entries to format_dict
6081 if format_dict['type'] == 'n':
6082 # apart from separators, 'n' behaves just like 'g'
6083 format_dict['type'] = 'g'
6084 if _localeconv is None:
6085 _localeconv = _locale.localeconv()
6086 if format_dict['thousands_sep'] is not None:
6087 raise ValueError("Explicit thousands separator conflicts with "
6088 "'n' type in format specifier: " + format_spec)
6089 format_dict['thousands_sep'] = _localeconv['thousands_sep']
6090 format_dict['grouping'] = _localeconv['grouping']
6091 format_dict['decimal_point'] = _localeconv['decimal_point']
6092 else:
6093 if format_dict['thousands_sep'] is None:
6094 format_dict['thousands_sep'] = ''
6095 format_dict['grouping'] = [3, 0]
6096 format_dict['decimal_point'] = '.'
Christian Heimesf16baeb2008-02-29 14:57:44 +00006097
6098 return format_dict
6099
Mark Dickinson79f52032009-03-17 23:12:51 +00006100def _format_align(sign, body, spec):
6101 """Given an unpadded, non-aligned numeric string 'body' and sign
6102 string 'sign', add padding and aligment conforming to the given
6103 format specifier dictionary 'spec' (as produced by
6104 parse_format_specifier).
Christian Heimesf16baeb2008-02-29 14:57:44 +00006105
6106 """
Christian Heimesf16baeb2008-02-29 14:57:44 +00006107 # how much extra space do we have to play with?
Mark Dickinson79f52032009-03-17 23:12:51 +00006108 minimumwidth = spec['minimumwidth']
6109 fill = spec['fill']
6110 padding = fill*(minimumwidth - len(sign) - len(body))
Christian Heimesf16baeb2008-02-29 14:57:44 +00006111
Mark Dickinson79f52032009-03-17 23:12:51 +00006112 align = spec['align']
Christian Heimesf16baeb2008-02-29 14:57:44 +00006113 if align == '<':
Christian Heimesf16baeb2008-02-29 14:57:44 +00006114 result = sign + body + padding
Mark Dickinsonad416342009-03-17 18:10:15 +00006115 elif align == '>':
6116 result = padding + sign + body
Christian Heimesf16baeb2008-02-29 14:57:44 +00006117 elif align == '=':
6118 result = sign + padding + body
Mark Dickinson79f52032009-03-17 23:12:51 +00006119 elif align == '^':
Christian Heimesf16baeb2008-02-29 14:57:44 +00006120 half = len(padding)//2
6121 result = padding[:half] + sign + body + padding[half:]
Mark Dickinson79f52032009-03-17 23:12:51 +00006122 else:
6123 raise ValueError('Unrecognised alignment field')
Christian Heimesf16baeb2008-02-29 14:57:44 +00006124
Christian Heimesf16baeb2008-02-29 14:57:44 +00006125 return result
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00006126
Mark Dickinson79f52032009-03-17 23:12:51 +00006127def _group_lengths(grouping):
6128 """Convert a localeconv-style grouping into a (possibly infinite)
6129 iterable of integers representing group lengths.
6130
6131 """
6132 # The result from localeconv()['grouping'], and the input to this
6133 # function, should be a list of integers in one of the
6134 # following three forms:
6135 #
6136 # (1) an empty list, or
6137 # (2) nonempty list of positive integers + [0]
6138 # (3) list of positive integers + [locale.CHAR_MAX], or
6139
6140 from itertools import chain, repeat
6141 if not grouping:
6142 return []
6143 elif grouping[-1] == 0 and len(grouping) >= 2:
6144 return chain(grouping[:-1], repeat(grouping[-2]))
6145 elif grouping[-1] == _locale.CHAR_MAX:
6146 return grouping[:-1]
6147 else:
6148 raise ValueError('unrecognised format for grouping')
6149
6150def _insert_thousands_sep(digits, spec, min_width=1):
6151 """Insert thousands separators into a digit string.
6152
6153 spec is a dictionary whose keys should include 'thousands_sep' and
6154 'grouping'; typically it's the result of parsing the format
6155 specifier using _parse_format_specifier.
6156
6157 The min_width keyword argument gives the minimum length of the
6158 result, which will be padded on the left with zeros if necessary.
6159
6160 If necessary, the zero padding adds an extra '0' on the left to
6161 avoid a leading thousands separator. For example, inserting
6162 commas every three digits in '123456', with min_width=8, gives
6163 '0,123,456', even though that has length 9.
6164
6165 """
6166
6167 sep = spec['thousands_sep']
6168 grouping = spec['grouping']
6169
6170 groups = []
6171 for l in _group_lengths(grouping):
Mark Dickinson79f52032009-03-17 23:12:51 +00006172 if l <= 0:
6173 raise ValueError("group length should be positive")
6174 # max(..., 1) forces at least 1 digit to the left of a separator
6175 l = min(max(len(digits), min_width, 1), l)
6176 groups.append('0'*(l - len(digits)) + digits[-l:])
6177 digits = digits[:-l]
6178 min_width -= l
6179 if not digits and min_width <= 0:
6180 break
Mark Dickinson7303b592009-03-18 08:25:36 +00006181 min_width -= len(sep)
Mark Dickinson79f52032009-03-17 23:12:51 +00006182 else:
6183 l = max(len(digits), min_width, 1)
6184 groups.append('0'*(l - len(digits)) + digits[-l:])
6185 return sep.join(reversed(groups))
6186
6187def _format_sign(is_negative, spec):
6188 """Determine sign character."""
6189
6190 if is_negative:
6191 return '-'
6192 elif spec['sign'] in ' +':
6193 return spec['sign']
6194 else:
6195 return ''
6196
6197def _format_number(is_negative, intpart, fracpart, exp, spec):
6198 """Format a number, given the following data:
6199
6200 is_negative: true if the number is negative, else false
6201 intpart: string of digits that must appear before the decimal point
6202 fracpart: string of digits that must come after the point
6203 exp: exponent, as an integer
6204 spec: dictionary resulting from parsing the format specifier
6205
6206 This function uses the information in spec to:
6207 insert separators (decimal separator and thousands separators)
6208 format the sign
6209 format the exponent
6210 add trailing '%' for the '%' type
6211 zero-pad if necessary
6212 fill and align if necessary
6213 """
6214
6215 sign = _format_sign(is_negative, spec)
6216
6217 if fracpart:
6218 fracpart = spec['decimal_point'] + fracpart
6219
6220 if exp != 0 or spec['type'] in 'eE':
6221 echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
6222 fracpart += "{0}{1:+}".format(echar, exp)
6223 if spec['type'] == '%':
6224 fracpart += '%'
6225
6226 if spec['zeropad']:
6227 min_width = spec['minimumwidth'] - len(fracpart) - len(sign)
6228 else:
6229 min_width = 0
6230 intpart = _insert_thousands_sep(intpart, spec, min_width)
6231
6232 return _format_align(sign, intpart+fracpart, spec)
6233
6234
Guido van Rossumd8faa362007-04-27 19:54:29 +00006235##### Useful Constants (internal use only) ################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006236
Guido van Rossumd8faa362007-04-27 19:54:29 +00006237# Reusable defaults
Mark Dickinson627cf6a2009-01-03 12:11:47 +00006238_Infinity = Decimal('Inf')
6239_NegativeInfinity = Decimal('-Inf')
Mark Dickinsonf9236412009-01-02 23:23:21 +00006240_NaN = Decimal('NaN')
Mark Dickinson627cf6a2009-01-03 12:11:47 +00006241_Zero = Decimal(0)
6242_One = Decimal(1)
6243_NegativeOne = Decimal(-1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006244
Mark Dickinson627cf6a2009-01-03 12:11:47 +00006245# _SignedInfinity[sign] is infinity w/ that sign
6246_SignedInfinity = (_Infinity, _NegativeInfinity)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006247
Mark Dickinsondc787d22010-05-23 13:33:13 +00006248# Constants related to the hash implementation; hash(x) is based
6249# on the reduction of x modulo _PyHASH_MODULUS
6250import sys
6251_PyHASH_MODULUS = sys.hash_info.modulus
6252# hash values to use for positive and negative infinities, and nans
6253_PyHASH_INF = sys.hash_info.inf
6254_PyHASH_NAN = sys.hash_info.nan
6255del sys
6256
6257# _PyHASH_10INV is the inverse of 10 modulo the prime _PyHASH_MODULUS
6258_PyHASH_10INV = pow(10, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006259
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00006260
6261if __name__ == '__main__':
6262 import doctest, sys
6263 doctest.testmod(sys.modules[__name__])