blob: cc2c5a52e2be5c2589ef87d320478b42daec436c [file] [log] [blame]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001# Copyright (c) 2004 Python Software Foundation.
2# All rights reserved.
3
4# Written by Eric Price <eprice at tjhsst.edu>
5# and Facundo Batista <facundo at taniquetil.com.ar>
6# and Raymond Hettinger <python at rcn.com>
Fred Drake1f34eb12004-07-01 14:28:36 +00007# and Aahz <aahz at pobox.com>
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00008# and Tim Peters
9
Raymond Hettinger27dbcf22004-08-19 22:39:55 +000010# This module is currently Py2.3 compatible and should be kept that way
11# unless a major compelling advantage arises. IOW, 2.3 compatibility is
12# strongly preferred, but not guaranteed.
13
14# Also, this module should be kept in sync with the latest updates of
15# the IBM specification as it evolves. Those updates will be treated
16# as bug fixes (deviation from the spec is a compatibility, usability
17# bug) and will be backported. At this point the spec is stabilizing
18# and the updates are becoming fewer, smaller, and less significant.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000019
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000020"""
21This is a Py2.3 implementation of decimal floating point arithmetic based on
22the General Decimal Arithmetic Specification:
23
24 www2.hursley.ibm.com/decimal/decarith.html
25
Raymond Hettinger0ea241e2004-07-04 13:53:24 +000026and IEEE standard 854-1987:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000027
28 www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
29
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000030Decimal floating point has finite precision with arbitrarily large bounds.
31
Facundo Batista59c58842007-04-10 12:58:45 +000032The purpose of this module is to support arithmetic using familiar
33"schoolhouse" rules and to avoid some of the tricky representation
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000034issues associated with binary floating point. The package is especially
35useful for financial applications or for contexts where users have
36expectations that are at odds with binary floating point (for instance,
37in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
Raymond Hettingerabe32372008-02-14 02:41:22 +000038of the expected Decimal('0.00') returned by decimal floating point).
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000039
40Here are some examples of using the decimal module:
41
42>>> from decimal import *
Raymond Hettingerbd7f76d2004-07-08 00:49:18 +000043>>> setcontext(ExtendedContext)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000044>>> Decimal(0)
Raymond Hettingerabe32372008-02-14 02:41:22 +000045Decimal('0')
46>>> Decimal('1')
47Decimal('1')
48>>> Decimal('-.0123')
49Decimal('-0.0123')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000050>>> Decimal(123456)
Raymond Hettingerabe32372008-02-14 02:41:22 +000051Decimal('123456')
52>>> Decimal('123.45e12345678901234567890')
53Decimal('1.2345E+12345678901234567892')
54>>> Decimal('1.33') + Decimal('1.27')
55Decimal('2.60')
56>>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41')
57Decimal('-2.20')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000058>>> dig = Decimal(1)
59>>> print dig / Decimal(3)
600.333333333
61>>> getcontext().prec = 18
62>>> print dig / Decimal(3)
630.333333333333333333
64>>> print dig.sqrt()
651
66>>> print Decimal(3).sqrt()
671.73205080756887729
68>>> print Decimal(3) ** 123
694.85192780976896427E+58
70>>> inf = Decimal(1) / Decimal(0)
71>>> print inf
72Infinity
73>>> neginf = Decimal(-1) / Decimal(0)
74>>> print neginf
75-Infinity
76>>> print neginf + inf
77NaN
78>>> print neginf * inf
79-Infinity
80>>> print dig / 0
81Infinity
Raymond Hettingerbf440692004-07-10 14:14:37 +000082>>> getcontext().traps[DivisionByZero] = 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +000083>>> print dig / 0
84Traceback (most recent call last):
85 ...
86 ...
87 ...
88DivisionByZero: x / 0
89>>> c = Context()
Raymond Hettingerbf440692004-07-10 14:14:37 +000090>>> c.traps[InvalidOperation] = 0
Raymond Hettinger5aa478b2004-07-09 10:02:53 +000091>>> print c.flags[InvalidOperation]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000920
93>>> c.divide(Decimal(0), Decimal(0))
Raymond Hettingerabe32372008-02-14 02:41:22 +000094Decimal('NaN')
Raymond Hettingerbf440692004-07-10 14:14:37 +000095>>> c.traps[InvalidOperation] = 1
Raymond Hettinger5aa478b2004-07-09 10:02:53 +000096>>> print c.flags[InvalidOperation]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000971
Raymond Hettinger5aa478b2004-07-09 10:02:53 +000098>>> c.flags[InvalidOperation] = 0
99>>> print c.flags[InvalidOperation]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001000
101>>> print c.divide(Decimal(0), Decimal(0))
102Traceback (most recent call last):
103 ...
104 ...
105 ...
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000106InvalidOperation: 0 / 0
107>>> print c.flags[InvalidOperation]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001081
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000109>>> c.flags[InvalidOperation] = 0
Raymond Hettingerbf440692004-07-10 14:14:37 +0000110>>> c.traps[InvalidOperation] = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000111>>> print c.divide(Decimal(0), Decimal(0))
112NaN
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000113>>> print c.flags[InvalidOperation]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001141
115>>>
116"""
117
118__all__ = [
119 # Two major classes
120 'Decimal', 'Context',
121
122 # Contexts
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +0000123 'DefaultContext', 'BasicContext', 'ExtendedContext',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000124
125 # Exceptions
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +0000126 'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
127 'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000128
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000129 # Constants for use in setting up contexts
130 'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
Facundo Batista353750c2007-09-13 18:13:15 +0000131 'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP',
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000132
133 # Functions for manipulating contexts
Nick Coghlan8b6999b2006-08-31 12:00:43 +0000134 'setcontext', 'getcontext', 'localcontext'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000135]
136
Raymond Hettingera016deb2009-04-27 21:12:27 +0000137__version__ = '1.70' # Highest version of the spec this complies with
Raymond Hettingerdaeceb22009-03-10 04:49:21 +0000138
Raymond Hettingereb260842005-06-07 18:52:34 +0000139import copy as _copy
Raymond Hettingerf4d85972009-01-03 19:02:23 +0000140import math as _math
Raymond Hettinger2c8585b2009-02-03 03:37:03 +0000141import numbers as _numbers
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000142
Raymond Hettinger097a1902008-01-11 02:24:13 +0000143try:
144 from collections import namedtuple as _namedtuple
145 DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
146except ImportError:
147 DecimalTuple = lambda *args: args
148
Facundo Batista59c58842007-04-10 12:58:45 +0000149# Rounding
Raymond Hettinger0ea241e2004-07-04 13:53:24 +0000150ROUND_DOWN = 'ROUND_DOWN'
151ROUND_HALF_UP = 'ROUND_HALF_UP'
152ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
153ROUND_CEILING = 'ROUND_CEILING'
154ROUND_FLOOR = 'ROUND_FLOOR'
155ROUND_UP = 'ROUND_UP'
156ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
Facundo Batista353750c2007-09-13 18:13:15 +0000157ROUND_05UP = 'ROUND_05UP'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000158
Facundo Batista59c58842007-04-10 12:58:45 +0000159# Errors
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000160
161class DecimalException(ArithmeticError):
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000162 """Base exception class.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000163
164 Used exceptions derive from this.
165 If an exception derives from another exception besides this (such as
166 Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
167 called if the others are present. This isn't actually used for
168 anything, though.
169
Martin v. Löwiscfe31282006-07-19 17:18:32 +0000170 handle -- Called when context._raise_error is called and the
171 trap_enabler is set. First argument is self, second is the
172 context. More arguments can be given, those being after
173 the explanation in _raise_error (For example,
174 context._raise_error(NewError, '(-x)!', self._sign) would
175 call NewError().handle(context, self._sign).)
176
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000177 To define a new exception, it should be sufficient to have it derive
178 from DecimalException.
179 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000180 def handle(self, context, *args):
181 pass
182
183
184class Clamped(DecimalException):
185 """Exponent of a 0 changed to fit bounds.
186
187 This occurs and signals clamped if the exponent of a result has been
188 altered in order to fit the constraints of a specific concrete
Facundo Batista59c58842007-04-10 12:58:45 +0000189 representation. This may occur when the exponent of a zero result would
190 be outside the bounds of a representation, or when a large normal
191 number would have an encoded exponent that cannot be represented. In
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000192 this latter case, the exponent is reduced to fit and the corresponding
193 number of zero digits are appended to the coefficient ("fold-down").
194 """
195
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000196class InvalidOperation(DecimalException):
197 """An invalid operation was performed.
198
199 Various bad things cause this:
200
201 Something creates a signaling NaN
202 -INF + INF
Facundo Batista59c58842007-04-10 12:58:45 +0000203 0 * (+-)INF
204 (+-)INF / (+-)INF
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000205 x % 0
206 (+-)INF % x
207 x._rescale( non-integer )
208 sqrt(-x) , x > 0
209 0 ** 0
210 x ** (non-integer)
211 x ** (+-)INF
212 An operand is invalid
Facundo Batista353750c2007-09-13 18:13:15 +0000213
214 The result of the operation after these is a quiet positive NaN,
215 except when the cause is a signaling NaN, in which case the result is
216 also a quiet NaN, but with the original sign, and an optional
217 diagnostic information.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000218 """
219 def handle(self, context, *args):
220 if args:
Facundo Batista0f5e7bf2007-12-19 12:53:01 +0000221 ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
222 return ans._fix_nan(context)
Mark Dickinsonc5de0962009-01-02 23:07:08 +0000223 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000224
225class ConversionSyntax(InvalidOperation):
226 """Trying to convert badly formed string.
227
228 This occurs and signals invalid-operation if an string is being
229 converted to a number and it does not conform to the numeric string
Facundo Batista59c58842007-04-10 12:58:45 +0000230 syntax. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000231 """
Martin v. Löwiscfe31282006-07-19 17:18:32 +0000232 def handle(self, context, *args):
Mark Dickinsonc5de0962009-01-02 23:07:08 +0000233 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000234
235class DivisionByZero(DecimalException, ZeroDivisionError):
236 """Division by 0.
237
238 This occurs and signals division-by-zero if division of a finite number
239 by zero was attempted (during a divide-integer or divide operation, or a
240 power operation with negative right-hand operand), and the dividend was
241 not zero.
242
243 The result of the operation is [sign,inf], where sign is the exclusive
244 or of the signs of the operands for divide, or is 1 for an odd power of
245 -0, for power.
246 """
Martin v. Löwiscfe31282006-07-19 17:18:32 +0000247
Facundo Batistacce8df22007-09-18 16:53:18 +0000248 def handle(self, context, sign, *args):
Raymond Hettingerb7e835b2009-01-03 19:08:10 +0000249 return _SignedInfinity[sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000250
251class DivisionImpossible(InvalidOperation):
252 """Cannot perform the division adequately.
253
254 This occurs and signals invalid-operation if the integer result of a
255 divide-integer or remainder operation had too many digits (would be
Facundo Batista59c58842007-04-10 12:58:45 +0000256 longer than precision). The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000257 """
Martin v. Löwiscfe31282006-07-19 17:18:32 +0000258
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000259 def handle(self, context, *args):
Mark Dickinsonc5de0962009-01-02 23:07:08 +0000260 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000261
262class DivisionUndefined(InvalidOperation, ZeroDivisionError):
263 """Undefined result of division.
264
265 This occurs and signals invalid-operation if division by zero was
266 attempted (during a divide-integer, divide, or remainder operation), and
Facundo Batista59c58842007-04-10 12:58:45 +0000267 the dividend is also zero. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000268 """
Martin v. Löwiscfe31282006-07-19 17:18:32 +0000269
Facundo Batistacce8df22007-09-18 16:53:18 +0000270 def handle(self, context, *args):
Mark Dickinsonc5de0962009-01-02 23:07:08 +0000271 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000272
273class Inexact(DecimalException):
274 """Had to round, losing information.
275
276 This occurs and signals inexact whenever the result of an operation is
277 not exact (that is, it needed to be rounded and any discarded digits
Facundo Batista59c58842007-04-10 12:58:45 +0000278 were non-zero), or if an overflow or underflow condition occurs. The
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000279 result in all cases is unchanged.
280
281 The inexact signal may be tested (or trapped) to determine if a given
282 operation (or sequence of operations) was inexact.
283 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000284
285class InvalidContext(InvalidOperation):
286 """Invalid context. Unknown rounding, for example.
287
288 This occurs and signals invalid-operation if an invalid context was
Facundo Batista59c58842007-04-10 12:58:45 +0000289 detected during an operation. This can occur if contexts are not checked
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000290 on creation and either the precision exceeds the capability of the
291 underlying concrete representation or an unknown or unsupported rounding
Facundo Batista59c58842007-04-10 12:58:45 +0000292 was specified. These aspects of the context need only be checked when
293 the values are required to be used. The result is [0,qNaN].
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000294 """
Martin v. Löwiscfe31282006-07-19 17:18:32 +0000295
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000296 def handle(self, context, *args):
Mark Dickinsonc5de0962009-01-02 23:07:08 +0000297 return _NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000298
299class Rounded(DecimalException):
300 """Number got rounded (not necessarily changed during rounding).
301
302 This occurs and signals rounded whenever the result of an operation is
303 rounded (that is, some zero or non-zero digits were discarded from the
Facundo Batista59c58842007-04-10 12:58:45 +0000304 coefficient), or if an overflow or underflow condition occurs. The
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000305 result in all cases is unchanged.
306
307 The rounded signal may be tested (or trapped) to determine if a given
308 operation (or sequence of operations) caused a loss of precision.
309 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000310
311class Subnormal(DecimalException):
312 """Exponent < Emin before rounding.
313
314 This occurs and signals subnormal whenever the result of a conversion or
315 operation is subnormal (that is, its adjusted exponent is less than
Facundo Batista59c58842007-04-10 12:58:45 +0000316 Emin, before any rounding). The result in all cases is unchanged.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000317
318 The subnormal signal may be tested (or trapped) to determine if a given
319 or operation (or sequence of operations) yielded a subnormal result.
320 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000321
322class Overflow(Inexact, Rounded):
323 """Numerical overflow.
324
325 This occurs and signals overflow if the adjusted exponent of a result
326 (from a conversion or from an operation that is not an attempt to divide
327 by zero), after rounding, would be greater than the largest value that
328 can be handled by the implementation (the value Emax).
329
330 The result depends on the rounding mode:
331
332 For round-half-up and round-half-even (and for round-half-down and
333 round-up, if implemented), the result of the operation is [sign,inf],
Facundo Batista59c58842007-04-10 12:58:45 +0000334 where sign is the sign of the intermediate result. For round-down, the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000335 result is the largest finite number that can be represented in the
Facundo Batista59c58842007-04-10 12:58:45 +0000336 current precision, with the sign of the intermediate result. For
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000337 round-ceiling, the result is the same as for round-down if the sign of
Facundo Batista59c58842007-04-10 12:58:45 +0000338 the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000339 the result is the same as for round-down if the sign of the intermediate
Facundo Batista59c58842007-04-10 12:58:45 +0000340 result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000341 will also be raised.
Facundo Batista0f5e7bf2007-12-19 12:53:01 +0000342 """
Martin v. Löwiscfe31282006-07-19 17:18:32 +0000343
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000344 def handle(self, context, sign, *args):
345 if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
Facundo Batista353750c2007-09-13 18:13:15 +0000346 ROUND_HALF_DOWN, ROUND_UP):
Raymond Hettingerb7e835b2009-01-03 19:08:10 +0000347 return _SignedInfinity[sign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000348 if sign == 0:
349 if context.rounding == ROUND_CEILING:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +0000350 return _SignedInfinity[sign]
Facundo Batista72bc54f2007-11-23 17:59:00 +0000351 return _dec_from_triple(sign, '9'*context.prec,
352 context.Emax-context.prec+1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000353 if sign == 1:
354 if context.rounding == ROUND_FLOOR:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +0000355 return _SignedInfinity[sign]
Facundo Batista72bc54f2007-11-23 17:59:00 +0000356 return _dec_from_triple(sign, '9'*context.prec,
357 context.Emax-context.prec+1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000358
359
360class Underflow(Inexact, Rounded, Subnormal):
361 """Numerical underflow with result rounded to 0.
362
363 This occurs and signals underflow if a result is inexact and the
364 adjusted exponent of the result would be smaller (more negative) than
365 the smallest value that can be handled by the implementation (the value
Facundo Batista59c58842007-04-10 12:58:45 +0000366 Emin). That is, the result is both inexact and subnormal.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000367
368 The result after an underflow will be a subnormal number rounded, if
Facundo Batista59c58842007-04-10 12:58:45 +0000369 necessary, so that its exponent is not less than Etiny. This may result
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000370 in 0 with the sign of the intermediate result and an exponent of Etiny.
371
372 In all cases, Inexact, Rounded, and Subnormal will also be raised.
373 """
374
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000375# List of public traps and flags
Raymond Hettingerfed52962004-07-14 15:41:57 +0000376_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
Martin v. Löwiscfe31282006-07-19 17:18:32 +0000377 Underflow, InvalidOperation, Subnormal]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000378
Raymond Hettinger5aa478b2004-07-09 10:02:53 +0000379# Map conditions (per the spec) to signals
380_condition_map = {ConversionSyntax:InvalidOperation,
381 DivisionImpossible:InvalidOperation,
382 DivisionUndefined:InvalidOperation,
383 InvalidContext:InvalidOperation}
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000384
Facundo Batista59c58842007-04-10 12:58:45 +0000385##### Context Functions ##################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000386
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000387# The getcontext() and setcontext() function manage access to a thread-local
388# current context. Py2.4 offers direct support for thread locals. If that
389# is not available, use threading.currentThread() which is slower but will
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000390# work for older Pythons. If threads are not part of the build, create a
Martin v. Löwiscfe31282006-07-19 17:18:32 +0000391# mock threading object with threading.local() returning the module namespace.
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000392
393try:
394 import threading
395except ImportError:
396 # Python was compiled without threads; create a mock object instead
397 import sys
Facundo Batista59c58842007-04-10 12:58:45 +0000398 class MockThreading(object):
Raymond Hettinger7e71fa52004-12-18 19:07:19 +0000399 def local(self, sys=sys):
400 return sys.modules[__name__]
401 threading = MockThreading()
402 del sys, MockThreading
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000403
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000404try:
405 threading.local
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000406
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000407except AttributeError:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000408
Facundo Batista59c58842007-04-10 12:58:45 +0000409 # To fix reloading, force it to create a new context
410 # Old contexts have different exceptions in their dicts, making problems.
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000411 if hasattr(threading.currentThread(), '__decimal_context__'):
412 del threading.currentThread().__decimal_context__
413
414 def setcontext(context):
415 """Set this thread's context to context."""
416 if context in (DefaultContext, BasicContext, ExtendedContext):
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000417 context = context.copy()
Raymond Hettinger61992ef2004-08-06 23:42:16 +0000418 context.clear_flags()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000419 threading.currentThread().__decimal_context__ = context
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000420
421 def getcontext():
422 """Returns this thread's context.
423
424 If this thread does not yet have a context, returns
425 a new context and sets this thread's context.
426 New contexts are copies of DefaultContext.
427 """
428 try:
429 return threading.currentThread().__decimal_context__
430 except AttributeError:
431 context = Context()
432 threading.currentThread().__decimal_context__ = context
433 return context
434
435else:
436
437 local = threading.local()
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000438 if hasattr(local, '__decimal_context__'):
439 del local.__decimal_context__
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000440
441 def getcontext(_local=local):
442 """Returns this thread's context.
443
444 If this thread does not yet have a context, returns
445 a new context and sets this thread's context.
446 New contexts are copies of DefaultContext.
447 """
448 try:
449 return _local.__decimal_context__
450 except AttributeError:
451 context = Context()
452 _local.__decimal_context__ = context
453 return context
454
455 def setcontext(context, _local=local):
456 """Set this thread's context to context."""
457 if context in (DefaultContext, BasicContext, ExtendedContext):
Raymond Hettinger9fce44b2004-08-08 04:03:24 +0000458 context = context.copy()
Raymond Hettinger61992ef2004-08-06 23:42:16 +0000459 context.clear_flags()
Raymond Hettingeref66deb2004-07-14 21:04:27 +0000460 _local.__decimal_context__ = context
461
Martin v. Löwiscfe31282006-07-19 17:18:32 +0000462 del threading, local # Don't contaminate the namespace
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000463
Nick Coghlan8b6999b2006-08-31 12:00:43 +0000464def localcontext(ctx=None):
465 """Return a context manager for a copy of the supplied context
466
467 Uses a copy of the current context if no context is specified
468 The returned context manager creates a local decimal context
469 in a with statement:
470 def sin(x):
471 with localcontext() as ctx:
472 ctx.prec += 2
473 # Rest of sin calculation algorithm
474 # uses a precision 2 greater than normal
Facundo Batista59c58842007-04-10 12:58:45 +0000475 return +s # Convert result to normal precision
Nick Coghlan8b6999b2006-08-31 12:00:43 +0000476
477 def sin(x):
478 with localcontext(ExtendedContext):
479 # Rest of sin calculation algorithm
480 # uses the Extended Context from the
481 # General Decimal Arithmetic Specification
Facundo Batista59c58842007-04-10 12:58:45 +0000482 return +s # Convert result to normal context
Nick Coghlan8b6999b2006-08-31 12:00:43 +0000483
Facundo Batistaee340e52008-05-02 17:39:00 +0000484 >>> setcontext(DefaultContext)
Nick Coghlan8b6999b2006-08-31 12:00:43 +0000485 >>> print getcontext().prec
486 28
487 >>> with localcontext():
488 ... ctx = getcontext()
Raymond Hettinger495df472007-02-08 01:42:35 +0000489 ... ctx.prec += 2
Nick Coghlan8b6999b2006-08-31 12:00:43 +0000490 ... print ctx.prec
491 ...
492 30
493 >>> with localcontext(ExtendedContext):
494 ... print getcontext().prec
495 ...
496 9
497 >>> print getcontext().prec
498 28
499 """
Nick Coghlanced12182006-09-02 03:54:17 +0000500 if ctx is None: ctx = getcontext()
501 return _ContextManager(ctx)
Nick Coghlan8b6999b2006-08-31 12:00:43 +0000502
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000503
Facundo Batista59c58842007-04-10 12:58:45 +0000504##### Decimal class #######################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000505
506class Decimal(object):
507 """Floating point class for decimal arithmetic."""
508
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000509 __slots__ = ('_exp','_int','_sign', '_is_special')
510 # Generally, the value of the Decimal instance is given by
511 # (-1)**_sign * _int * 10**_exp
512 # Special values are signified by _is_special == True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000513
Raymond Hettingerdab988d2004-10-09 07:10:44 +0000514 # We're immutable, so use __new__ not __init__
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000515 def __new__(cls, value="0", context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000516 """Create a decimal point instance.
517
518 >>> Decimal('3.14') # string input
Raymond Hettingerabe32372008-02-14 02:41:22 +0000519 Decimal('3.14')
Facundo Batista59c58842007-04-10 12:58:45 +0000520 >>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent)
Raymond Hettingerabe32372008-02-14 02:41:22 +0000521 Decimal('3.14')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000522 >>> Decimal(314) # int or long
Raymond Hettingerabe32372008-02-14 02:41:22 +0000523 Decimal('314')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000524 >>> Decimal(Decimal(314)) # another decimal instance
Raymond Hettingerabe32372008-02-14 02:41:22 +0000525 Decimal('314')
Mark Dickinson59bc20b2008-01-12 01:56:00 +0000526 >>> Decimal(' 3.14 \\n') # leading and trailing whitespace okay
Raymond Hettingerabe32372008-02-14 02:41:22 +0000527 Decimal('3.14')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000528 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000529
Facundo Batista72bc54f2007-11-23 17:59:00 +0000530 # Note that the coefficient, self._int, is actually stored as
531 # a string rather than as a tuple of digits. This speeds up
532 # the "digits to integer" and "integer to digits" conversions
533 # that are used in almost every arithmetic operation on
534 # Decimals. This is an internal detail: the as_tuple function
535 # and the Decimal constructor still deal with tuples of
536 # digits.
537
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000538 self = object.__new__(cls)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000539
Facundo Batista0d157a02007-11-30 17:15:25 +0000540 # From a string
541 # REs insist on real strings, so we can too.
542 if isinstance(value, basestring):
Mark Dickinson59bc20b2008-01-12 01:56:00 +0000543 m = _parser(value.strip())
Facundo Batista0d157a02007-11-30 17:15:25 +0000544 if m is None:
545 if context is None:
546 context = getcontext()
547 return context._raise_error(ConversionSyntax,
548 "Invalid literal for Decimal: %r" % value)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000549
Facundo Batista0d157a02007-11-30 17:15:25 +0000550 if m.group('sign') == "-":
551 self._sign = 1
552 else:
553 self._sign = 0
554 intpart = m.group('int')
555 if intpart is not None:
556 # finite number
557 fracpart = m.group('frac')
558 exp = int(m.group('exp') or '0')
559 if fracpart is not None:
Mark Dickinson8e85ffa2008-03-25 18:47:59 +0000560 self._int = str((intpart+fracpart).lstrip('0') or '0')
Facundo Batista0d157a02007-11-30 17:15:25 +0000561 self._exp = exp - len(fracpart)
562 else:
Mark Dickinson8e85ffa2008-03-25 18:47:59 +0000563 self._int = str(intpart.lstrip('0') or '0')
Facundo Batista0d157a02007-11-30 17:15:25 +0000564 self._exp = exp
565 self._is_special = False
566 else:
567 diag = m.group('diag')
568 if diag is not None:
569 # NaN
Mark Dickinson8e85ffa2008-03-25 18:47:59 +0000570 self._int = str(diag.lstrip('0'))
Facundo Batista0d157a02007-11-30 17:15:25 +0000571 if m.group('signal'):
572 self._exp = 'N'
573 else:
574 self._exp = 'n'
575 else:
576 # infinity
577 self._int = '0'
578 self._exp = 'F'
579 self._is_special = True
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000580 return self
581
582 # From an integer
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000583 if isinstance(value, (int,long)):
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000584 if value >= 0:
585 self._sign = 0
586 else:
587 self._sign = 1
588 self._exp = 0
Facundo Batista72bc54f2007-11-23 17:59:00 +0000589 self._int = str(abs(value))
Facundo Batista0d157a02007-11-30 17:15:25 +0000590 self._is_special = False
591 return self
592
593 # From another decimal
594 if isinstance(value, Decimal):
595 self._exp = value._exp
596 self._sign = value._sign
597 self._int = value._int
598 self._is_special = value._is_special
599 return self
600
601 # From an internal working value
602 if isinstance(value, _WorkRep):
603 self._sign = value.sign
604 self._int = str(value.int)
605 self._exp = int(value.exp)
606 self._is_special = False
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000607 return self
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000608
609 # tuple/list conversion (possibly from as_tuple())
610 if isinstance(value, (list,tuple)):
611 if len(value) != 3:
Facundo Batista9b5e2312007-10-19 19:25:57 +0000612 raise ValueError('Invalid tuple size in creation of Decimal '
613 'from list or tuple. The list or tuple '
614 'should have exactly three elements.')
615 # process sign. The isinstance test rejects floats
616 if not (isinstance(value[0], (int, long)) and value[0] in (0,1)):
617 raise ValueError("Invalid sign. The first value in the tuple "
618 "should be an integer; either 0 for a "
619 "positive number or 1 for a negative number.")
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000620 self._sign = value[0]
Facundo Batista9b5e2312007-10-19 19:25:57 +0000621 if value[2] == 'F':
622 # infinity: value[1] is ignored
Facundo Batista72bc54f2007-11-23 17:59:00 +0000623 self._int = '0'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000624 self._exp = value[2]
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000625 self._is_special = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000626 else:
Facundo Batista9b5e2312007-10-19 19:25:57 +0000627 # process and validate the digits in value[1]
628 digits = []
629 for digit in value[1]:
630 if isinstance(digit, (int, long)) and 0 <= digit <= 9:
631 # skip leading zeros
632 if digits or digit != 0:
633 digits.append(digit)
634 else:
635 raise ValueError("The second value in the tuple must "
636 "be composed of integers in the range "
637 "0 through 9.")
638 if value[2] in ('n', 'N'):
639 # NaN: digits form the diagnostic
Facundo Batista72bc54f2007-11-23 17:59:00 +0000640 self._int = ''.join(map(str, digits))
Facundo Batista9b5e2312007-10-19 19:25:57 +0000641 self._exp = value[2]
642 self._is_special = True
643 elif isinstance(value[2], (int, long)):
644 # finite number: digits give the coefficient
Facundo Batista72bc54f2007-11-23 17:59:00 +0000645 self._int = ''.join(map(str, digits or [0]))
Facundo Batista9b5e2312007-10-19 19:25:57 +0000646 self._exp = value[2]
647 self._is_special = False
648 else:
649 raise ValueError("The third value in the tuple must "
650 "be an integer, or one of the "
651 "strings 'F', 'n', 'N'.")
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000652 return self
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000653
Raymond Hettingerbf440692004-07-10 14:14:37 +0000654 if isinstance(value, float):
655 raise TypeError("Cannot convert float to Decimal. " +
656 "First convert the float to a string")
657
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000658 raise TypeError("Cannot convert %r to Decimal" % value)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000659
Mark Dickinson6a961632009-01-04 21:10:56 +0000660 # @classmethod, but @decorator is not valid Python 2.3 syntax, so
661 # don't use it (see notes on Py2.3 compatibility at top of file)
Raymond Hettingerf4d85972009-01-03 19:02:23 +0000662 def from_float(cls, f):
663 """Converts a float to a decimal number, exactly.
664
665 Note that Decimal.from_float(0.1) is not the same as Decimal('0.1').
666 Since 0.1 is not exactly representable in binary floating point, the
667 value is stored as the nearest representable value which is
668 0x1.999999999999ap-4. The exact equivalent of the value in decimal
669 is 0.1000000000000000055511151231257827021181583404541015625.
670
671 >>> Decimal.from_float(0.1)
672 Decimal('0.1000000000000000055511151231257827021181583404541015625')
673 >>> Decimal.from_float(float('nan'))
674 Decimal('NaN')
675 >>> Decimal.from_float(float('inf'))
676 Decimal('Infinity')
677 >>> Decimal.from_float(-float('inf'))
678 Decimal('-Infinity')
679 >>> Decimal.from_float(-0.0)
680 Decimal('-0')
681
682 """
683 if isinstance(f, (int, long)): # handle integer inputs
684 return cls(f)
685 if _math.isinf(f) or _math.isnan(f): # raises TypeError if not a float
686 return cls(repr(f))
Mark Dickinson6a961632009-01-04 21:10:56 +0000687 if _math.copysign(1.0, f) == 1.0:
688 sign = 0
689 else:
690 sign = 1
Raymond Hettingerf4d85972009-01-03 19:02:23 +0000691 n, d = abs(f).as_integer_ratio()
692 k = d.bit_length() - 1
693 result = _dec_from_triple(sign, str(n*5**k), -k)
Mark Dickinson6a961632009-01-04 21:10:56 +0000694 if cls is Decimal:
695 return result
696 else:
697 return cls(result)
698 from_float = classmethod(from_float)
Raymond Hettingerf4d85972009-01-03 19:02:23 +0000699
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000700 def _isnan(self):
701 """Returns whether the number is not actually one.
702
703 0 if a number
Facundo Batista0f5e7bf2007-12-19 12:53:01 +0000704 1 if NaN
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000705 2 if sNaN
706 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000707 if self._is_special:
708 exp = self._exp
709 if exp == 'n':
710 return 1
711 elif exp == 'N':
712 return 2
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000713 return 0
714
715 def _isinfinity(self):
716 """Returns whether the number is infinite
717
718 0 if finite or not a number
719 1 if +INF
720 -1 if -INF
721 """
722 if self._exp == 'F':
723 if self._sign:
724 return -1
725 return 1
726 return 0
727
Facundo Batista353750c2007-09-13 18:13:15 +0000728 def _check_nans(self, other=None, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000729 """Returns whether the number is not actually one.
730
731 if self, other are sNaN, signal
732 if self, other are NaN return nan
733 return 0
734
735 Done before operations.
736 """
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000737
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000738 self_is_nan = self._isnan()
739 if other is None:
740 other_is_nan = False
741 else:
742 other_is_nan = other._isnan()
743
744 if self_is_nan or other_is_nan:
745 if context is None:
746 context = getcontext()
747
748 if self_is_nan == 2:
749 return context._raise_error(InvalidOperation, 'sNaN',
Facundo Batista0f5e7bf2007-12-19 12:53:01 +0000750 self)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000751 if other_is_nan == 2:
752 return context._raise_error(InvalidOperation, 'sNaN',
Facundo Batista0f5e7bf2007-12-19 12:53:01 +0000753 other)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000754 if self_is_nan:
Facundo Batista353750c2007-09-13 18:13:15 +0000755 return self._fix_nan(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000756
Facundo Batista353750c2007-09-13 18:13:15 +0000757 return other._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000758 return 0
759
Mark Dickinson2fc92632008-02-06 22:10:50 +0000760 def _compare_check_nans(self, other, context):
761 """Version of _check_nans used for the signaling comparisons
762 compare_signal, __le__, __lt__, __ge__, __gt__.
763
764 Signal InvalidOperation if either self or other is a (quiet
765 or signaling) NaN. Signaling NaNs take precedence over quiet
766 NaNs.
767
768 Return 0 if neither operand is a NaN.
769
770 """
771 if context is None:
772 context = getcontext()
773
774 if self._is_special or other._is_special:
775 if self.is_snan():
776 return context._raise_error(InvalidOperation,
777 'comparison involving sNaN',
778 self)
779 elif other.is_snan():
780 return context._raise_error(InvalidOperation,
781 'comparison involving sNaN',
782 other)
783 elif self.is_qnan():
784 return context._raise_error(InvalidOperation,
785 'comparison involving NaN',
786 self)
787 elif other.is_qnan():
788 return context._raise_error(InvalidOperation,
789 'comparison involving NaN',
790 other)
791 return 0
792
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000793 def __nonzero__(self):
Facundo Batista1a191df2007-10-02 17:01:24 +0000794 """Return True if self is nonzero; otherwise return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000795
Facundo Batista1a191df2007-10-02 17:01:24 +0000796 NaNs and infinities are considered nonzero.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000797 """
Facundo Batista72bc54f2007-11-23 17:59:00 +0000798 return self._is_special or self._int != '0'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000799
Mark Dickinson2fc92632008-02-06 22:10:50 +0000800 def _cmp(self, other):
801 """Compare the two non-NaN decimal instances self and other.
802
803 Returns -1 if self < other, 0 if self == other and 1
804 if self > other. This routine is for internal use only."""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000805
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000806 if self._is_special or other._is_special:
Mark Dickinsone52c3142009-01-25 10:39:15 +0000807 self_inf = self._isinfinity()
808 other_inf = other._isinfinity()
809 if self_inf == other_inf:
810 return 0
811 elif self_inf < other_inf:
812 return -1
813 else:
814 return 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000815
Mark Dickinsone52c3142009-01-25 10:39:15 +0000816 # check for zeros; Decimal('0') == Decimal('-0')
Facundo Batista353750c2007-09-13 18:13:15 +0000817 if not self:
818 if not other:
819 return 0
820 else:
821 return -((-1)**other._sign)
822 if not other:
823 return (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000824
Facundo Batista59c58842007-04-10 12:58:45 +0000825 # If different signs, neg one is less
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000826 if other._sign < self._sign:
827 return -1
828 if self._sign < other._sign:
829 return 1
830
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000831 self_adjusted = self.adjusted()
832 other_adjusted = other.adjusted()
Facundo Batista353750c2007-09-13 18:13:15 +0000833 if self_adjusted == other_adjusted:
Facundo Batista72bc54f2007-11-23 17:59:00 +0000834 self_padded = self._int + '0'*(self._exp - other._exp)
835 other_padded = other._int + '0'*(other._exp - self._exp)
Mark Dickinsone52c3142009-01-25 10:39:15 +0000836 if self_padded == other_padded:
837 return 0
838 elif self_padded < other_padded:
839 return -(-1)**self._sign
840 else:
841 return (-1)**self._sign
Facundo Batista353750c2007-09-13 18:13:15 +0000842 elif self_adjusted > other_adjusted:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000843 return (-1)**self._sign
Facundo Batista353750c2007-09-13 18:13:15 +0000844 else: # self_adjusted < other_adjusted
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000845 return -((-1)**self._sign)
846
Mark Dickinson2fc92632008-02-06 22:10:50 +0000847 # Note: The Decimal standard doesn't cover rich comparisons for
848 # Decimals. In particular, the specification is silent on the
849 # subject of what should happen for a comparison involving a NaN.
850 # We take the following approach:
851 #
852 # == comparisons involving a NaN always return False
853 # != comparisons involving a NaN always return True
854 # <, >, <= and >= comparisons involving a (quiet or signaling)
855 # NaN signal InvalidOperation, and return False if the
Mark Dickinson3a94ee02008-02-10 15:19:58 +0000856 # InvalidOperation is not trapped.
Mark Dickinson2fc92632008-02-06 22:10:50 +0000857 #
858 # This behavior is designed to conform as closely as possible to
859 # that specified by IEEE 754.
860
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000861 def __eq__(self, other):
Mark Dickinson2fc92632008-02-06 22:10:50 +0000862 other = _convert_other(other)
863 if other is NotImplemented:
864 return other
865 if self.is_nan() or other.is_nan():
866 return False
867 return self._cmp(other) == 0
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000868
869 def __ne__(self, other):
Mark Dickinson2fc92632008-02-06 22:10:50 +0000870 other = _convert_other(other)
871 if other is NotImplemented:
872 return other
873 if self.is_nan() or other.is_nan():
874 return True
875 return self._cmp(other) != 0
876
877 def __lt__(self, other, context=None):
878 other = _convert_other(other)
879 if other is NotImplemented:
880 return other
881 ans = self._compare_check_nans(other, context)
882 if ans:
883 return False
884 return self._cmp(other) < 0
885
886 def __le__(self, other, context=None):
887 other = _convert_other(other)
888 if other is NotImplemented:
889 return other
890 ans = self._compare_check_nans(other, context)
891 if ans:
892 return False
893 return self._cmp(other) <= 0
894
895 def __gt__(self, other, context=None):
896 other = _convert_other(other)
897 if other is NotImplemented:
898 return other
899 ans = self._compare_check_nans(other, context)
900 if ans:
901 return False
902 return self._cmp(other) > 0
903
904 def __ge__(self, other, context=None):
905 other = _convert_other(other)
906 if other is NotImplemented:
907 return other
908 ans = self._compare_check_nans(other, context)
909 if ans:
910 return False
911 return self._cmp(other) >= 0
Raymond Hettinger0aeac102004-07-05 22:53:03 +0000912
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000913 def compare(self, other, context=None):
914 """Compares one to another.
915
916 -1 => a < b
917 0 => a = b
918 1 => a > b
919 NaN => one is NaN
920 Like __cmp__, but returns Decimal instances.
921 """
Facundo Batista353750c2007-09-13 18:13:15 +0000922 other = _convert_other(other, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000923
Facundo Batista59c58842007-04-10 12:58:45 +0000924 # Compare(NaN, NaN) = NaN
Raymond Hettinger636a6b12004-09-19 01:54:09 +0000925 if (self._is_special or other and other._is_special):
926 ans = self._check_nans(other, context)
927 if ans:
928 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000929
Mark Dickinson2fc92632008-02-06 22:10:50 +0000930 return Decimal(self._cmp(other))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000931
932 def __hash__(self):
933 """x.__hash__() <==> hash(x)"""
934 # Decimal integers must hash the same as the ints
Facundo Batista52b25792008-01-08 12:25:20 +0000935 #
936 # The hash of a nonspecial noninteger Decimal must depend only
937 # on the value of that Decimal, and not on its representation.
Raymond Hettingerabe32372008-02-14 02:41:22 +0000938 # For example: hash(Decimal('100E-1')) == hash(Decimal('10')).
Raymond Hettingerbea3f6f2005-03-15 04:59:17 +0000939 if self._is_special:
940 if self._isnan():
941 raise TypeError('Cannot hash a NaN value.')
942 return hash(str(self))
Facundo Batista8c202442007-09-19 17:53:25 +0000943 if not self:
944 return 0
945 if self._isinteger():
946 op = _WorkRep(self.to_integral_value())
947 # to make computation feasible for Decimals with large
948 # exponent, we use the fact that hash(n) == hash(m) for
949 # any two nonzero integers n and m such that (i) n and m
950 # have the same sign, and (ii) n is congruent to m modulo
951 # 2**64-1. So we can replace hash((-1)**s*c*10**e) with
952 # hash((-1)**s*c*pow(10, e, 2**64-1).
953 return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1))
Facundo Batista52b25792008-01-08 12:25:20 +0000954 # The value of a nonzero nonspecial Decimal instance is
955 # faithfully represented by the triple consisting of its sign,
956 # its adjusted exponent, and its coefficient with trailing
957 # zeros removed.
958 return hash((self._sign,
959 self._exp+len(self._int),
960 self._int.rstrip('0')))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000961
962 def as_tuple(self):
963 """Represents the number as a triple tuple.
964
965 To show the internals exactly as they are.
966 """
Raymond Hettinger097a1902008-01-11 02:24:13 +0000967 return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000968
969 def __repr__(self):
970 """Represents the number as an instance of Decimal."""
971 # Invariant: eval(repr(d)) == d
Raymond Hettingerabe32372008-02-14 02:41:22 +0000972 return "Decimal('%s')" % str(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000973
Facundo Batista353750c2007-09-13 18:13:15 +0000974 def __str__(self, eng=False, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000975 """Return string representation of the number in scientific notation.
976
977 Captures all of the information in the underlying representation.
978 """
979
Facundo Batista62edb712007-12-03 16:29:52 +0000980 sign = ['', '-'][self._sign]
Raymond Hettingere5a0a962005-06-20 09:49:42 +0000981 if self._is_special:
Facundo Batista62edb712007-12-03 16:29:52 +0000982 if self._exp == 'F':
983 return sign + 'Infinity'
984 elif self._exp == 'n':
985 return sign + 'NaN' + self._int
986 else: # self._exp == 'N'
987 return sign + 'sNaN' + self._int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000988
Facundo Batista62edb712007-12-03 16:29:52 +0000989 # number of digits of self._int to left of decimal point
990 leftdigits = self._exp + len(self._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +0000991
Facundo Batista62edb712007-12-03 16:29:52 +0000992 # dotplace is number of digits of self._int to the left of the
993 # decimal point in the mantissa of the output string (that is,
994 # after adjusting the exponent)
995 if self._exp <= 0 and leftdigits > -6:
996 # no exponent required
997 dotplace = leftdigits
998 elif not eng:
999 # usual scientific notation: 1 digit on left of the point
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001000 dotplace = 1
Facundo Batista62edb712007-12-03 16:29:52 +00001001 elif self._int == '0':
1002 # engineering notation, zero
1003 dotplace = (leftdigits + 1) % 3 - 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001004 else:
Facundo Batista62edb712007-12-03 16:29:52 +00001005 # engineering notation, nonzero
1006 dotplace = (leftdigits - 1) % 3 + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001007
Facundo Batista62edb712007-12-03 16:29:52 +00001008 if dotplace <= 0:
1009 intpart = '0'
1010 fracpart = '.' + '0'*(-dotplace) + self._int
1011 elif dotplace >= len(self._int):
1012 intpart = self._int+'0'*(dotplace-len(self._int))
1013 fracpart = ''
1014 else:
1015 intpart = self._int[:dotplace]
1016 fracpart = '.' + self._int[dotplace:]
1017 if leftdigits == dotplace:
1018 exp = ''
1019 else:
1020 if context is None:
1021 context = getcontext()
1022 exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
1023
1024 return sign + intpart + fracpart + exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001025
1026 def to_eng_string(self, context=None):
1027 """Convert to engineering-type string.
1028
1029 Engineering notation has an exponent which is a multiple of 3, so there
1030 are up to 3 digits left of the decimal place.
1031
1032 Same rules for when in exponential and when as a value as in __str__.
1033 """
Facundo Batista353750c2007-09-13 18:13:15 +00001034 return self.__str__(eng=True, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001035
1036 def __neg__(self, context=None):
1037 """Returns a copy with the sign switched.
1038
1039 Rounds, if it has reason.
1040 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001041 if self._is_special:
1042 ans = self._check_nans(context=context)
1043 if ans:
1044 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001045
1046 if not self:
1047 # -Decimal('0') is Decimal('0'), not Decimal('-0')
Facundo Batista0f5e7bf2007-12-19 12:53:01 +00001048 ans = self.copy_abs()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001049 else:
Facundo Batista353750c2007-09-13 18:13:15 +00001050 ans = self.copy_negate()
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001051
1052 if context is None:
1053 context = getcontext()
Facundo Batistae64acfa2007-12-17 14:18:42 +00001054 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001055
1056 def __pos__(self, context=None):
1057 """Returns a copy, unless it is a sNaN.
1058
1059 Rounds the number (if more then precision digits)
1060 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001061 if self._is_special:
1062 ans = self._check_nans(context=context)
1063 if ans:
1064 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001065
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001066 if not self:
1067 # + (-0) = 0
Facundo Batista0f5e7bf2007-12-19 12:53:01 +00001068 ans = self.copy_abs()
Facundo Batista353750c2007-09-13 18:13:15 +00001069 else:
1070 ans = Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001071
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001072 if context is None:
1073 context = getcontext()
Facundo Batistae64acfa2007-12-17 14:18:42 +00001074 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001075
Facundo Batistae64acfa2007-12-17 14:18:42 +00001076 def __abs__(self, round=True, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001077 """Returns the absolute value of self.
1078
Facundo Batistae64acfa2007-12-17 14:18:42 +00001079 If the keyword argument 'round' is false, do not round. The
1080 expression self.__abs__(round=False) is equivalent to
1081 self.copy_abs().
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001082 """
Facundo Batistae64acfa2007-12-17 14:18:42 +00001083 if not round:
1084 return self.copy_abs()
1085
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001086 if self._is_special:
1087 ans = self._check_nans(context=context)
1088 if ans:
1089 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001090
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001091 if self._sign:
1092 ans = self.__neg__(context=context)
1093 else:
1094 ans = self.__pos__(context=context)
1095
1096 return ans
1097
1098 def __add__(self, other, context=None):
1099 """Returns self + other.
1100
1101 -INF + INF (or the reverse) cause InvalidOperation errors.
1102 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001103 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001104 if other is NotImplemented:
1105 return other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001106
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001107 if context is None:
1108 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001109
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001110 if self._is_special or other._is_special:
1111 ans = self._check_nans(other, context)
1112 if ans:
1113 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001114
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001115 if self._isinfinity():
Facundo Batista59c58842007-04-10 12:58:45 +00001116 # If both INF, same sign => same as both, opposite => error.
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001117 if self._sign != other._sign and other._isinfinity():
1118 return context._raise_error(InvalidOperation, '-INF + INF')
1119 return Decimal(self)
1120 if other._isinfinity():
Facundo Batista59c58842007-04-10 12:58:45 +00001121 return Decimal(other) # Can't both be infinity here
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001122
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001123 exp = min(self._exp, other._exp)
1124 negativezero = 0
1125 if context.rounding == ROUND_FLOOR and self._sign != other._sign:
Facundo Batista59c58842007-04-10 12:58:45 +00001126 # If the answer is 0, the sign should be negative, in this case.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001127 negativezero = 1
1128
1129 if not self and not other:
1130 sign = min(self._sign, other._sign)
1131 if negativezero:
1132 sign = 1
Facundo Batista72bc54f2007-11-23 17:59:00 +00001133 ans = _dec_from_triple(sign, '0', exp)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001134 ans = ans._fix(context)
Facundo Batista353750c2007-09-13 18:13:15 +00001135 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001136 if not self:
Facundo Batista99b55482004-10-26 23:38:46 +00001137 exp = max(exp, other._exp - context.prec-1)
Facundo Batista353750c2007-09-13 18:13:15 +00001138 ans = other._rescale(exp, context.rounding)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001139 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001140 return ans
1141 if not other:
Facundo Batista99b55482004-10-26 23:38:46 +00001142 exp = max(exp, self._exp - context.prec-1)
Facundo Batista353750c2007-09-13 18:13:15 +00001143 ans = self._rescale(exp, context.rounding)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001144 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001145 return ans
1146
1147 op1 = _WorkRep(self)
1148 op2 = _WorkRep(other)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001149 op1, op2 = _normalize(op1, op2, context.prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001150
1151 result = _WorkRep()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001152 if op1.sign != op2.sign:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001153 # Equal and opposite
Raymond Hettinger17931de2004-10-27 06:21:46 +00001154 if op1.int == op2.int:
Facundo Batista72bc54f2007-11-23 17:59:00 +00001155 ans = _dec_from_triple(negativezero, '0', exp)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001156 ans = ans._fix(context)
Facundo Batista353750c2007-09-13 18:13:15 +00001157 return ans
Raymond Hettinger17931de2004-10-27 06:21:46 +00001158 if op1.int < op2.int:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001159 op1, op2 = op2, op1
Facundo Batista59c58842007-04-10 12:58:45 +00001160 # OK, now abs(op1) > abs(op2)
Raymond Hettinger17931de2004-10-27 06:21:46 +00001161 if op1.sign == 1:
1162 result.sign = 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001163 op1.sign, op2.sign = op2.sign, op1.sign
1164 else:
Raymond Hettinger17931de2004-10-27 06:21:46 +00001165 result.sign = 0
Facundo Batista59c58842007-04-10 12:58:45 +00001166 # So we know the sign, and op1 > 0.
Raymond Hettinger17931de2004-10-27 06:21:46 +00001167 elif op1.sign == 1:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001168 result.sign = 1
Raymond Hettinger17931de2004-10-27 06:21:46 +00001169 op1.sign, op2.sign = (0, 0)
1170 else:
1171 result.sign = 0
Facundo Batista59c58842007-04-10 12:58:45 +00001172 # Now, op1 > abs(op2) > 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001173
Raymond Hettinger17931de2004-10-27 06:21:46 +00001174 if op2.sign == 0:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001175 result.int = op1.int + op2.int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001176 else:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001177 result.int = op1.int - op2.int
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001178
1179 result.exp = op1.exp
1180 ans = Decimal(result)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001181 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001182 return ans
1183
1184 __radd__ = __add__
1185
1186 def __sub__(self, other, context=None):
Facundo Batista353750c2007-09-13 18:13:15 +00001187 """Return self - other"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001188 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001189 if other is NotImplemented:
1190 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001191
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001192 if self._is_special or other._is_special:
1193 ans = self._check_nans(other, context=context)
1194 if ans:
1195 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001196
Facundo Batista353750c2007-09-13 18:13:15 +00001197 # self - other is computed as self + other.copy_negate()
1198 return self.__add__(other.copy_negate(), context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001199
1200 def __rsub__(self, other, context=None):
Facundo Batista353750c2007-09-13 18:13:15 +00001201 """Return other - self"""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001202 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001203 if other is NotImplemented:
1204 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001205
Facundo Batista353750c2007-09-13 18:13:15 +00001206 return other.__sub__(self, context=context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001207
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001208 def __mul__(self, other, context=None):
1209 """Return self * other.
1210
1211 (+-) INF * 0 (or its reverse) raise InvalidOperation.
1212 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001213 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001214 if other is NotImplemented:
1215 return other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001216
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001217 if context is None:
1218 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001219
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +00001220 resultsign = self._sign ^ other._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001221
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001222 if self._is_special or other._is_special:
1223 ans = self._check_nans(other, context)
1224 if ans:
1225 return ans
1226
1227 if self._isinfinity():
1228 if not other:
1229 return context._raise_error(InvalidOperation, '(+-)INF * 0')
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00001230 return _SignedInfinity[resultsign]
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001231
1232 if other._isinfinity():
1233 if not self:
1234 return context._raise_error(InvalidOperation, '0 * (+-)INF')
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00001235 return _SignedInfinity[resultsign]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001236
1237 resultexp = self._exp + other._exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001238
1239 # Special case for multiplying by zero
1240 if not self or not other:
Facundo Batista72bc54f2007-11-23 17:59:00 +00001241 ans = _dec_from_triple(resultsign, '0', resultexp)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001242 # Fixing in case the exponent is out of bounds
1243 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001244 return ans
1245
1246 # Special case for multiplying by power of 10
Facundo Batista72bc54f2007-11-23 17:59:00 +00001247 if self._int == '1':
1248 ans = _dec_from_triple(resultsign, other._int, resultexp)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001249 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001250 return ans
Facundo Batista72bc54f2007-11-23 17:59:00 +00001251 if other._int == '1':
1252 ans = _dec_from_triple(resultsign, self._int, resultexp)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001253 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001254 return ans
1255
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001256 op1 = _WorkRep(self)
1257 op2 = _WorkRep(other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001258
Facundo Batista72bc54f2007-11-23 17:59:00 +00001259 ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001260 ans = ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001261
1262 return ans
1263 __rmul__ = __mul__
1264
Mark Dickinson8aca9d02008-05-04 02:05:06 +00001265 def __truediv__(self, other, context=None):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001266 """Return self / other."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001267 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001268 if other is NotImplemented:
Facundo Batistacce8df22007-09-18 16:53:18 +00001269 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001270
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001271 if context is None:
1272 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001273
Raymond Hettingerd87ac8f2004-07-09 10:52:54 +00001274 sign = self._sign ^ other._sign
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001275
1276 if self._is_special or other._is_special:
1277 ans = self._check_nans(other, context)
1278 if ans:
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001279 return ans
1280
1281 if self._isinfinity() and other._isinfinity():
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001282 return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001283
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001284 if self._isinfinity():
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00001285 return _SignedInfinity[sign]
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001286
1287 if other._isinfinity():
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001288 context._raise_error(Clamped, 'Division by infinity')
Facundo Batista72bc54f2007-11-23 17:59:00 +00001289 return _dec_from_triple(sign, '0', context.Etiny())
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001290
1291 # Special cases for zeroes
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001292 if not other:
Facundo Batistacce8df22007-09-18 16:53:18 +00001293 if not self:
1294 return context._raise_error(DivisionUndefined, '0 / 0')
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001295 return context._raise_error(DivisionByZero, 'x / 0', sign)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001296
Facundo Batistacce8df22007-09-18 16:53:18 +00001297 if not self:
1298 exp = self._exp - other._exp
1299 coeff = 0
1300 else:
1301 # OK, so neither = 0, INF or NaN
1302 shift = len(other._int) - len(self._int) + context.prec + 1
1303 exp = self._exp - other._exp - shift
1304 op1 = _WorkRep(self)
1305 op2 = _WorkRep(other)
1306 if shift >= 0:
1307 coeff, remainder = divmod(op1.int * 10**shift, op2.int)
1308 else:
1309 coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
1310 if remainder:
1311 # result is not exact; adjust to ensure correct rounding
1312 if coeff % 5 == 0:
1313 coeff += 1
1314 else:
1315 # result is exact; get as close to ideal exponent as possible
1316 ideal_exp = self._exp - other._exp
1317 while exp < ideal_exp and coeff % 10 == 0:
1318 coeff //= 10
1319 exp += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001320
Facundo Batista72bc54f2007-11-23 17:59:00 +00001321 ans = _dec_from_triple(sign, str(coeff), exp)
Facundo Batistacce8df22007-09-18 16:53:18 +00001322 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001323
Facundo Batistacce8df22007-09-18 16:53:18 +00001324 def _divide(self, other, context):
1325 """Return (self // other, self % other), to context.prec precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001326
Facundo Batistacce8df22007-09-18 16:53:18 +00001327 Assumes that neither self nor other is a NaN, that self is not
1328 infinite and that other is nonzero.
1329 """
1330 sign = self._sign ^ other._sign
1331 if other._isinfinity():
1332 ideal_exp = self._exp
1333 else:
1334 ideal_exp = min(self._exp, other._exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001335
Facundo Batistacce8df22007-09-18 16:53:18 +00001336 expdiff = self.adjusted() - other.adjusted()
1337 if not self or other._isinfinity() or expdiff <= -2:
Facundo Batista72bc54f2007-11-23 17:59:00 +00001338 return (_dec_from_triple(sign, '0', 0),
Facundo Batistacce8df22007-09-18 16:53:18 +00001339 self._rescale(ideal_exp, context.rounding))
1340 if expdiff <= context.prec:
1341 op1 = _WorkRep(self)
1342 op2 = _WorkRep(other)
1343 if op1.exp >= op2.exp:
1344 op1.int *= 10**(op1.exp - op2.exp)
1345 else:
1346 op2.int *= 10**(op2.exp - op1.exp)
1347 q, r = divmod(op1.int, op2.int)
1348 if q < 10**context.prec:
Facundo Batista72bc54f2007-11-23 17:59:00 +00001349 return (_dec_from_triple(sign, str(q), 0),
1350 _dec_from_triple(self._sign, str(r), ideal_exp))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001351
Facundo Batistacce8df22007-09-18 16:53:18 +00001352 # Here the quotient is too large to be representable
1353 ans = context._raise_error(DivisionImpossible,
1354 'quotient too large in //, % or divmod')
1355 return ans, ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001356
Mark Dickinson8aca9d02008-05-04 02:05:06 +00001357 def __rtruediv__(self, other, context=None):
1358 """Swaps self/other and returns __truediv__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001359 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001360 if other is NotImplemented:
1361 return other
Mark Dickinson8aca9d02008-05-04 02:05:06 +00001362 return other.__truediv__(self, context=context)
1363
1364 __div__ = __truediv__
1365 __rdiv__ = __rtruediv__
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001366
1367 def __divmod__(self, other, context=None):
1368 """
Facundo Batistacce8df22007-09-18 16:53:18 +00001369 Return (self // other, self % other)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001370 """
Facundo Batistacce8df22007-09-18 16:53:18 +00001371 other = _convert_other(other)
1372 if other is NotImplemented:
1373 return other
1374
1375 if context is None:
1376 context = getcontext()
1377
1378 ans = self._check_nans(other, context)
1379 if ans:
1380 return (ans, ans)
1381
1382 sign = self._sign ^ other._sign
1383 if self._isinfinity():
1384 if other._isinfinity():
1385 ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
1386 return ans, ans
1387 else:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00001388 return (_SignedInfinity[sign],
Facundo Batistacce8df22007-09-18 16:53:18 +00001389 context._raise_error(InvalidOperation, 'INF % x'))
1390
1391 if not other:
1392 if not self:
1393 ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
1394 return ans, ans
1395 else:
1396 return (context._raise_error(DivisionByZero, 'x // 0', sign),
1397 context._raise_error(InvalidOperation, 'x % 0'))
1398
1399 quotient, remainder = self._divide(other, context)
Facundo Batistae64acfa2007-12-17 14:18:42 +00001400 remainder = remainder._fix(context)
Facundo Batistacce8df22007-09-18 16:53:18 +00001401 return quotient, remainder
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001402
1403 def __rdivmod__(self, other, context=None):
1404 """Swaps self/other and returns __divmod__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001405 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001406 if other is NotImplemented:
1407 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001408 return other.__divmod__(self, context=context)
1409
1410 def __mod__(self, other, context=None):
1411 """
1412 self % other
1413 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001414 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001415 if other is NotImplemented:
1416 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001417
Facundo Batistacce8df22007-09-18 16:53:18 +00001418 if context is None:
1419 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001420
Facundo Batistacce8df22007-09-18 16:53:18 +00001421 ans = self._check_nans(other, context)
1422 if ans:
1423 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001424
Facundo Batistacce8df22007-09-18 16:53:18 +00001425 if self._isinfinity():
1426 return context._raise_error(InvalidOperation, 'INF % x')
1427 elif not other:
1428 if self:
1429 return context._raise_error(InvalidOperation, 'x % 0')
1430 else:
1431 return context._raise_error(DivisionUndefined, '0 % 0')
1432
1433 remainder = self._divide(other, context)[1]
Facundo Batistae64acfa2007-12-17 14:18:42 +00001434 remainder = remainder._fix(context)
Facundo Batistacce8df22007-09-18 16:53:18 +00001435 return remainder
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001436
1437 def __rmod__(self, other, context=None):
1438 """Swaps self/other and returns __mod__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001439 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001440 if other is NotImplemented:
1441 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001442 return other.__mod__(self, context=context)
1443
1444 def remainder_near(self, other, context=None):
1445 """
1446 Remainder nearest to 0- abs(remainder-near) <= other/2
1447 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001448 if context is None:
1449 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001450
Facundo Batista353750c2007-09-13 18:13:15 +00001451 other = _convert_other(other, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001452
Facundo Batista353750c2007-09-13 18:13:15 +00001453 ans = self._check_nans(other, context)
1454 if ans:
1455 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001456
Facundo Batista353750c2007-09-13 18:13:15 +00001457 # self == +/-infinity -> InvalidOperation
1458 if self._isinfinity():
1459 return context._raise_error(InvalidOperation,
1460 'remainder_near(infinity, x)')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001461
Facundo Batista353750c2007-09-13 18:13:15 +00001462 # other == 0 -> either InvalidOperation or DivisionUndefined
1463 if not other:
1464 if self:
1465 return context._raise_error(InvalidOperation,
1466 'remainder_near(x, 0)')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001467 else:
Facundo Batista353750c2007-09-13 18:13:15 +00001468 return context._raise_error(DivisionUndefined,
1469 'remainder_near(0, 0)')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001470
Facundo Batista353750c2007-09-13 18:13:15 +00001471 # other = +/-infinity -> remainder = self
1472 if other._isinfinity():
1473 ans = Decimal(self)
1474 return ans._fix(context)
1475
1476 # self = 0 -> remainder = self, with ideal exponent
1477 ideal_exponent = min(self._exp, other._exp)
1478 if not self:
Facundo Batista72bc54f2007-11-23 17:59:00 +00001479 ans = _dec_from_triple(self._sign, '0', ideal_exponent)
Facundo Batista353750c2007-09-13 18:13:15 +00001480 return ans._fix(context)
1481
1482 # catch most cases of large or small quotient
1483 expdiff = self.adjusted() - other.adjusted()
1484 if expdiff >= context.prec + 1:
1485 # expdiff >= prec+1 => abs(self/other) > 10**prec
Facundo Batistacce8df22007-09-18 16:53:18 +00001486 return context._raise_error(DivisionImpossible)
Facundo Batista353750c2007-09-13 18:13:15 +00001487 if expdiff <= -2:
1488 # expdiff <= -2 => abs(self/other) < 0.1
1489 ans = self._rescale(ideal_exponent, context.rounding)
1490 return ans._fix(context)
1491
1492 # adjust both arguments to have the same exponent, then divide
1493 op1 = _WorkRep(self)
1494 op2 = _WorkRep(other)
1495 if op1.exp >= op2.exp:
1496 op1.int *= 10**(op1.exp - op2.exp)
1497 else:
1498 op2.int *= 10**(op2.exp - op1.exp)
1499 q, r = divmod(op1.int, op2.int)
1500 # remainder is r*10**ideal_exponent; other is +/-op2.int *
1501 # 10**ideal_exponent. Apply correction to ensure that
1502 # abs(remainder) <= abs(other)/2
1503 if 2*r + (q&1) > op2.int:
1504 r -= op2.int
1505 q += 1
1506
1507 if q >= 10**context.prec:
Facundo Batistacce8df22007-09-18 16:53:18 +00001508 return context._raise_error(DivisionImpossible)
Facundo Batista353750c2007-09-13 18:13:15 +00001509
1510 # result has same sign as self unless r is negative
1511 sign = self._sign
1512 if r < 0:
1513 sign = 1-sign
1514 r = -r
1515
Facundo Batista72bc54f2007-11-23 17:59:00 +00001516 ans = _dec_from_triple(sign, str(r), ideal_exponent)
Facundo Batista353750c2007-09-13 18:13:15 +00001517 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001518
1519 def __floordiv__(self, other, context=None):
1520 """self // other"""
Facundo Batistacce8df22007-09-18 16:53:18 +00001521 other = _convert_other(other)
1522 if other is NotImplemented:
1523 return other
1524
1525 if context is None:
1526 context = getcontext()
1527
1528 ans = self._check_nans(other, context)
1529 if ans:
1530 return ans
1531
1532 if self._isinfinity():
1533 if other._isinfinity():
1534 return context._raise_error(InvalidOperation, 'INF // INF')
1535 else:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00001536 return _SignedInfinity[self._sign ^ other._sign]
Facundo Batistacce8df22007-09-18 16:53:18 +00001537
1538 if not other:
1539 if self:
1540 return context._raise_error(DivisionByZero, 'x // 0',
1541 self._sign ^ other._sign)
1542 else:
1543 return context._raise_error(DivisionUndefined, '0 // 0')
1544
1545 return self._divide(other, context)[0]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001546
1547 def __rfloordiv__(self, other, context=None):
1548 """Swaps self/other and returns __floordiv__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001549 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00001550 if other is NotImplemented:
1551 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001552 return other.__floordiv__(self, context=context)
1553
1554 def __float__(self):
1555 """Float representation."""
1556 return float(str(self))
1557
1558 def __int__(self):
Brett Cannon46b08022005-03-01 03:12:26 +00001559 """Converts self to an int, truncating if necessary."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001560 if self._is_special:
1561 if self._isnan():
1562 context = getcontext()
1563 return context._raise_error(InvalidContext)
1564 elif self._isinfinity():
Mark Dickinson8aca9d02008-05-04 02:05:06 +00001565 raise OverflowError("Cannot convert infinity to int")
Facundo Batista353750c2007-09-13 18:13:15 +00001566 s = (-1)**self._sign
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001567 if self._exp >= 0:
Facundo Batista72bc54f2007-11-23 17:59:00 +00001568 return s*int(self._int)*10**self._exp
Raymond Hettinger605ed022004-11-24 07:28:48 +00001569 else:
Facundo Batista72bc54f2007-11-23 17:59:00 +00001570 return s*int(self._int[:self._exp] or '0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001571
Raymond Hettinger5a053642008-01-24 19:05:29 +00001572 __trunc__ = __int__
1573
Raymond Hettinger116f72f2008-02-12 01:18:03 +00001574 def real(self):
1575 return self
Mark Dickinson65808ff2009-01-04 21:22:02 +00001576 real = property(real)
Raymond Hettinger116f72f2008-02-12 01:18:03 +00001577
Raymond Hettinger116f72f2008-02-12 01:18:03 +00001578 def imag(self):
1579 return Decimal(0)
Mark Dickinson65808ff2009-01-04 21:22:02 +00001580 imag = property(imag)
Raymond Hettinger116f72f2008-02-12 01:18:03 +00001581
1582 def conjugate(self):
1583 return self
1584
1585 def __complex__(self):
1586 return complex(float(self))
1587
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001588 def __long__(self):
1589 """Converts to a long.
1590
1591 Equivalent to long(int(self))
1592 """
1593 return long(self.__int__())
1594
Facundo Batista353750c2007-09-13 18:13:15 +00001595 def _fix_nan(self, context):
1596 """Decapitate the payload of a NaN to fit the context"""
1597 payload = self._int
1598
1599 # maximum length of payload is precision if _clamp=0,
1600 # precision-1 if _clamp=1.
1601 max_payload_len = context.prec - context._clamp
1602 if len(payload) > max_payload_len:
Facundo Batista72bc54f2007-11-23 17:59:00 +00001603 payload = payload[len(payload)-max_payload_len:].lstrip('0')
1604 return _dec_from_triple(self._sign, payload, self._exp, True)
Facundo Batista6c398da2007-09-17 17:30:13 +00001605 return Decimal(self)
Facundo Batista353750c2007-09-13 18:13:15 +00001606
Raymond Hettingerdab988d2004-10-09 07:10:44 +00001607 def _fix(self, context):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001608 """Round if it is necessary to keep self within prec precision.
1609
1610 Rounds and fixes the exponent. Does not raise on a sNaN.
1611
1612 Arguments:
1613 self - Decimal instance
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001614 context - context used.
1615 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00001616
Facundo Batista353750c2007-09-13 18:13:15 +00001617 if self._is_special:
1618 if self._isnan():
1619 # decapitate payload if necessary
1620 return self._fix_nan(context)
1621 else:
1622 # self is +/-Infinity; return unaltered
Facundo Batista6c398da2007-09-17 17:30:13 +00001623 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001624
Facundo Batista353750c2007-09-13 18:13:15 +00001625 # if self is zero then exponent should be between Etiny and
1626 # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.
1627 Etiny = context.Etiny()
1628 Etop = context.Etop()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001629 if not self:
Facundo Batista353750c2007-09-13 18:13:15 +00001630 exp_max = [context.Emax, Etop][context._clamp]
1631 new_exp = min(max(self._exp, Etiny), exp_max)
1632 if new_exp != self._exp:
1633 context._raise_error(Clamped)
Facundo Batista72bc54f2007-11-23 17:59:00 +00001634 return _dec_from_triple(self._sign, '0', new_exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001635 else:
Facundo Batista6c398da2007-09-17 17:30:13 +00001636 return Decimal(self)
Facundo Batista353750c2007-09-13 18:13:15 +00001637
1638 # exp_min is the smallest allowable exponent of the result,
1639 # equal to max(self.adjusted()-context.prec+1, Etiny)
1640 exp_min = len(self._int) + self._exp - context.prec
1641 if exp_min > Etop:
1642 # overflow: exp_min > Etop iff self.adjusted() > Emax
1643 context._raise_error(Inexact)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001644 context._raise_error(Rounded)
Facundo Batista353750c2007-09-13 18:13:15 +00001645 return context._raise_error(Overflow, 'above Emax', self._sign)
1646 self_is_subnormal = exp_min < Etiny
1647 if self_is_subnormal:
1648 context._raise_error(Subnormal)
1649 exp_min = Etiny
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001650
Facundo Batista353750c2007-09-13 18:13:15 +00001651 # round if self has too many digits
1652 if self._exp < exp_min:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001653 context._raise_error(Rounded)
Facundo Batista2ec74152007-12-03 17:55:00 +00001654 digits = len(self._int) + self._exp - exp_min
1655 if digits < 0:
1656 self = _dec_from_triple(self._sign, '1', exp_min-1)
1657 digits = 0
1658 this_function = getattr(self, self._pick_rounding_function[context.rounding])
1659 changed = this_function(digits)
1660 coeff = self._int[:digits] or '0'
1661 if changed == 1:
1662 coeff = str(int(coeff)+1)
1663 ans = _dec_from_triple(self._sign, coeff, exp_min)
1664
1665 if changed:
Facundo Batista353750c2007-09-13 18:13:15 +00001666 context._raise_error(Inexact)
1667 if self_is_subnormal:
1668 context._raise_error(Underflow)
1669 if not ans:
1670 # raise Clamped on underflow to 0
1671 context._raise_error(Clamped)
1672 elif len(ans._int) == context.prec+1:
1673 # we get here only if rescaling rounds the
1674 # cofficient up to exactly 10**context.prec
1675 if ans._exp < Etop:
Facundo Batista72bc54f2007-11-23 17:59:00 +00001676 ans = _dec_from_triple(ans._sign,
1677 ans._int[:-1], ans._exp+1)
Facundo Batista353750c2007-09-13 18:13:15 +00001678 else:
1679 # Inexact and Rounded have already been raised
1680 ans = context._raise_error(Overflow, 'above Emax',
1681 self._sign)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001682 return ans
1683
Facundo Batista353750c2007-09-13 18:13:15 +00001684 # fold down if _clamp == 1 and self has too few digits
1685 if context._clamp == 1 and self._exp > Etop:
1686 context._raise_error(Clamped)
Facundo Batista72bc54f2007-11-23 17:59:00 +00001687 self_padded = self._int + '0'*(self._exp - Etop)
1688 return _dec_from_triple(self._sign, self_padded, Etop)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001689
Facundo Batista353750c2007-09-13 18:13:15 +00001690 # here self was representable to begin with; return unchanged
Facundo Batista6c398da2007-09-17 17:30:13 +00001691 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001692
1693 _pick_rounding_function = {}
1694
Facundo Batista353750c2007-09-13 18:13:15 +00001695 # for each of the rounding functions below:
1696 # self is a finite, nonzero Decimal
1697 # prec is an integer satisfying 0 <= prec < len(self._int)
Facundo Batista2ec74152007-12-03 17:55:00 +00001698 #
1699 # each function returns either -1, 0, or 1, as follows:
1700 # 1 indicates that self should be rounded up (away from zero)
1701 # 0 indicates that self should be truncated, and that all the
1702 # digits to be truncated are zeros (so the value is unchanged)
1703 # -1 indicates that there are nonzero digits to be truncated
Facundo Batista353750c2007-09-13 18:13:15 +00001704
1705 def _round_down(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001706 """Also known as round-towards-0, truncate."""
Facundo Batista2ec74152007-12-03 17:55:00 +00001707 if _all_zeros(self._int, prec):
1708 return 0
1709 else:
1710 return -1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001711
Facundo Batista353750c2007-09-13 18:13:15 +00001712 def _round_up(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001713 """Rounds away from 0."""
Facundo Batista2ec74152007-12-03 17:55:00 +00001714 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001715
Facundo Batista353750c2007-09-13 18:13:15 +00001716 def _round_half_up(self, prec):
1717 """Rounds 5 up (away from 0)"""
Facundo Batista72bc54f2007-11-23 17:59:00 +00001718 if self._int[prec] in '56789':
Facundo Batista2ec74152007-12-03 17:55:00 +00001719 return 1
1720 elif _all_zeros(self._int, prec):
1721 return 0
Facundo Batista353750c2007-09-13 18:13:15 +00001722 else:
Facundo Batista2ec74152007-12-03 17:55:00 +00001723 return -1
Facundo Batista353750c2007-09-13 18:13:15 +00001724
1725 def _round_half_down(self, prec):
1726 """Round 5 down"""
Facundo Batista2ec74152007-12-03 17:55:00 +00001727 if _exact_half(self._int, prec):
1728 return -1
1729 else:
1730 return self._round_half_up(prec)
Facundo Batista353750c2007-09-13 18:13:15 +00001731
1732 def _round_half_even(self, prec):
1733 """Round 5 to even, rest to nearest."""
Facundo Batista2ec74152007-12-03 17:55:00 +00001734 if _exact_half(self._int, prec) and \
1735 (prec == 0 or self._int[prec-1] in '02468'):
1736 return -1
Facundo Batista353750c2007-09-13 18:13:15 +00001737 else:
Facundo Batista2ec74152007-12-03 17:55:00 +00001738 return self._round_half_up(prec)
Facundo Batista353750c2007-09-13 18:13:15 +00001739
1740 def _round_ceiling(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001741 """Rounds up (not away from 0 if negative.)"""
1742 if self._sign:
Facundo Batista353750c2007-09-13 18:13:15 +00001743 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001744 else:
Facundo Batista2ec74152007-12-03 17:55:00 +00001745 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001746
Facundo Batista353750c2007-09-13 18:13:15 +00001747 def _round_floor(self, prec):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001748 """Rounds down (not towards 0 if negative)"""
1749 if not self._sign:
Facundo Batista353750c2007-09-13 18:13:15 +00001750 return self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001751 else:
Facundo Batista2ec74152007-12-03 17:55:00 +00001752 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001753
Facundo Batista353750c2007-09-13 18:13:15 +00001754 def _round_05up(self, prec):
1755 """Round down unless digit prec-1 is 0 or 5."""
Facundo Batista2ec74152007-12-03 17:55:00 +00001756 if prec and self._int[prec-1] not in '05':
Facundo Batista353750c2007-09-13 18:13:15 +00001757 return self._round_down(prec)
Facundo Batista2ec74152007-12-03 17:55:00 +00001758 else:
1759 return -self._round_down(prec)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001760
Facundo Batista353750c2007-09-13 18:13:15 +00001761 def fma(self, other, third, context=None):
1762 """Fused multiply-add.
1763
1764 Returns self*other+third with no rounding of the intermediate
1765 product self*other.
1766
1767 self and other are multiplied together, with no rounding of
1768 the result. The third operand is then added to the result,
1769 and a single final rounding is performed.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001770 """
Facundo Batista353750c2007-09-13 18:13:15 +00001771
1772 other = _convert_other(other, raiseit=True)
Facundo Batista58f6f2e2007-12-04 16:31:53 +00001773
1774 # compute product; raise InvalidOperation if either operand is
1775 # a signaling NaN or if the product is zero times infinity.
1776 if self._is_special or other._is_special:
1777 if context is None:
1778 context = getcontext()
1779 if self._exp == 'N':
Facundo Batista0f5e7bf2007-12-19 12:53:01 +00001780 return context._raise_error(InvalidOperation, 'sNaN', self)
Facundo Batista58f6f2e2007-12-04 16:31:53 +00001781 if other._exp == 'N':
Facundo Batista0f5e7bf2007-12-19 12:53:01 +00001782 return context._raise_error(InvalidOperation, 'sNaN', other)
Facundo Batista58f6f2e2007-12-04 16:31:53 +00001783 if self._exp == 'n':
1784 product = self
1785 elif other._exp == 'n':
1786 product = other
1787 elif self._exp == 'F':
1788 if not other:
1789 return context._raise_error(InvalidOperation,
1790 'INF * 0 in fma')
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00001791 product = _SignedInfinity[self._sign ^ other._sign]
Facundo Batista58f6f2e2007-12-04 16:31:53 +00001792 elif other._exp == 'F':
1793 if not self:
1794 return context._raise_error(InvalidOperation,
1795 '0 * INF in fma')
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00001796 product = _SignedInfinity[self._sign ^ other._sign]
Facundo Batista58f6f2e2007-12-04 16:31:53 +00001797 else:
1798 product = _dec_from_triple(self._sign ^ other._sign,
1799 str(int(self._int) * int(other._int)),
1800 self._exp + other._exp)
1801
Facundo Batista353750c2007-09-13 18:13:15 +00001802 third = _convert_other(third, raiseit=True)
Facundo Batista58f6f2e2007-12-04 16:31:53 +00001803 return product.__add__(third, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001804
Facundo Batista353750c2007-09-13 18:13:15 +00001805 def _power_modulo(self, other, modulo, context=None):
1806 """Three argument version of __pow__"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001807
Facundo Batista353750c2007-09-13 18:13:15 +00001808 # if can't convert other and modulo to Decimal, raise
1809 # TypeError; there's no point returning NotImplemented (no
1810 # equivalent of __rpow__ for three argument pow)
1811 other = _convert_other(other, raiseit=True)
1812 modulo = _convert_other(modulo, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001813
Facundo Batista353750c2007-09-13 18:13:15 +00001814 if context is None:
1815 context = getcontext()
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001816
Facundo Batista353750c2007-09-13 18:13:15 +00001817 # deal with NaNs: if there are any sNaNs then first one wins,
1818 # (i.e. behaviour for NaNs is identical to that of fma)
1819 self_is_nan = self._isnan()
1820 other_is_nan = other._isnan()
1821 modulo_is_nan = modulo._isnan()
1822 if self_is_nan or other_is_nan or modulo_is_nan:
1823 if self_is_nan == 2:
1824 return context._raise_error(InvalidOperation, 'sNaN',
Facundo Batista0f5e7bf2007-12-19 12:53:01 +00001825 self)
Facundo Batista353750c2007-09-13 18:13:15 +00001826 if other_is_nan == 2:
1827 return context._raise_error(InvalidOperation, 'sNaN',
Facundo Batista0f5e7bf2007-12-19 12:53:01 +00001828 other)
Facundo Batista353750c2007-09-13 18:13:15 +00001829 if modulo_is_nan == 2:
1830 return context._raise_error(InvalidOperation, 'sNaN',
Facundo Batista0f5e7bf2007-12-19 12:53:01 +00001831 modulo)
Facundo Batista353750c2007-09-13 18:13:15 +00001832 if self_is_nan:
Facundo Batista6c398da2007-09-17 17:30:13 +00001833 return self._fix_nan(context)
Facundo Batista353750c2007-09-13 18:13:15 +00001834 if other_is_nan:
Facundo Batista6c398da2007-09-17 17:30:13 +00001835 return other._fix_nan(context)
1836 return modulo._fix_nan(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00001837
Facundo Batista353750c2007-09-13 18:13:15 +00001838 # check inputs: we apply same restrictions as Python's pow()
1839 if not (self._isinteger() and
1840 other._isinteger() and
1841 modulo._isinteger()):
1842 return context._raise_error(InvalidOperation,
1843 'pow() 3rd argument not allowed '
1844 'unless all arguments are integers')
1845 if other < 0:
1846 return context._raise_error(InvalidOperation,
1847 'pow() 2nd argument cannot be '
1848 'negative when 3rd argument specified')
1849 if not modulo:
1850 return context._raise_error(InvalidOperation,
1851 'pow() 3rd argument cannot be 0')
1852
1853 # additional restriction for decimal: the modulus must be less
1854 # than 10**prec in absolute value
1855 if modulo.adjusted() >= context.prec:
1856 return context._raise_error(InvalidOperation,
1857 'insufficient precision: pow() 3rd '
1858 'argument must not have more than '
1859 'precision digits')
1860
1861 # define 0**0 == NaN, for consistency with two-argument pow
1862 # (even though it hurts!)
1863 if not other and not self:
1864 return context._raise_error(InvalidOperation,
1865 'at least one of pow() 1st argument '
1866 'and 2nd argument must be nonzero ;'
1867 '0**0 is not defined')
1868
1869 # compute sign of result
1870 if other._iseven():
1871 sign = 0
1872 else:
1873 sign = self._sign
1874
1875 # convert modulo to a Python integer, and self and other to
1876 # Decimal integers (i.e. force their exponents to be >= 0)
1877 modulo = abs(int(modulo))
1878 base = _WorkRep(self.to_integral_value())
1879 exponent = _WorkRep(other.to_integral_value())
1880
1881 # compute result using integer pow()
1882 base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
1883 for i in xrange(exponent.exp):
1884 base = pow(base, 10, modulo)
1885 base = pow(base, exponent.int, modulo)
1886
Facundo Batista72bc54f2007-11-23 17:59:00 +00001887 return _dec_from_triple(sign, str(base), 0)
Facundo Batista353750c2007-09-13 18:13:15 +00001888
1889 def _power_exact(self, other, p):
1890 """Attempt to compute self**other exactly.
1891
1892 Given Decimals self and other and an integer p, attempt to
1893 compute an exact result for the power self**other, with p
1894 digits of precision. Return None if self**other is not
1895 exactly representable in p digits.
1896
1897 Assumes that elimination of special cases has already been
1898 performed: self and other must both be nonspecial; self must
1899 be positive and not numerically equal to 1; other must be
1900 nonzero. For efficiency, other._exp should not be too large,
1901 so that 10**abs(other._exp) is a feasible calculation."""
1902
1903 # In the comments below, we write x for the value of self and
1904 # y for the value of other. Write x = xc*10**xe and y =
1905 # yc*10**ye.
1906
1907 # The main purpose of this method is to identify the *failure*
1908 # of x**y to be exactly representable with as little effort as
1909 # possible. So we look for cheap and easy tests that
1910 # eliminate the possibility of x**y being exact. Only if all
1911 # these tests are passed do we go on to actually compute x**y.
1912
1913 # Here's the main idea. First normalize both x and y. We
1914 # express y as a rational m/n, with m and n relatively prime
1915 # and n>0. Then for x**y to be exactly representable (at
1916 # *any* precision), xc must be the nth power of a positive
1917 # integer and xe must be divisible by n. If m is negative
1918 # then additionally xc must be a power of either 2 or 5, hence
1919 # a power of 2**n or 5**n.
1920 #
1921 # There's a limit to how small |y| can be: if y=m/n as above
1922 # then:
1923 #
1924 # (1) if xc != 1 then for the result to be representable we
1925 # need xc**(1/n) >= 2, and hence also xc**|y| >= 2. So
1926 # if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
1927 # 2**(1/|y|), hence xc**|y| < 2 and the result is not
1928 # representable.
1929 #
1930 # (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1. Hence if
1931 # |y| < 1/|xe| then the result is not representable.
1932 #
1933 # Note that since x is not equal to 1, at least one of (1) and
1934 # (2) must apply. Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
1935 # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
1936 #
1937 # There's also a limit to how large y can be, at least if it's
1938 # positive: the normalized result will have coefficient xc**y,
1939 # so if it's representable then xc**y < 10**p, and y <
1940 # p/log10(xc). Hence if y*log10(xc) >= p then the result is
1941 # not exactly representable.
1942
1943 # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
1944 # so |y| < 1/xe and the result is not representable.
1945 # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
1946 # < 1/nbits(xc).
1947
1948 x = _WorkRep(self)
1949 xc, xe = x.int, x.exp
1950 while xc % 10 == 0:
1951 xc //= 10
1952 xe += 1
1953
1954 y = _WorkRep(other)
1955 yc, ye = y.int, y.exp
1956 while yc % 10 == 0:
1957 yc //= 10
1958 ye += 1
1959
1960 # case where xc == 1: result is 10**(xe*y), with xe*y
1961 # required to be an integer
1962 if xc == 1:
1963 if ye >= 0:
1964 exponent = xe*yc*10**ye
1965 else:
1966 exponent, remainder = divmod(xe*yc, 10**-ye)
1967 if remainder:
1968 return None
1969 if y.sign == 1:
1970 exponent = -exponent
1971 # if other is a nonnegative integer, use ideal exponent
1972 if other._isinteger() and other._sign == 0:
1973 ideal_exponent = self._exp*int(other)
1974 zeros = min(exponent-ideal_exponent, p-1)
1975 else:
1976 zeros = 0
Facundo Batista72bc54f2007-11-23 17:59:00 +00001977 return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
Facundo Batista353750c2007-09-13 18:13:15 +00001978
1979 # case where y is negative: xc must be either a power
1980 # of 2 or a power of 5.
1981 if y.sign == 1:
1982 last_digit = xc % 10
1983 if last_digit in (2,4,6,8):
1984 # quick test for power of 2
1985 if xc & -xc != xc:
1986 return None
1987 # now xc is a power of 2; e is its exponent
1988 e = _nbits(xc)-1
1989 # find e*y and xe*y; both must be integers
1990 if ye >= 0:
1991 y_as_int = yc*10**ye
1992 e = e*y_as_int
1993 xe = xe*y_as_int
1994 else:
1995 ten_pow = 10**-ye
1996 e, remainder = divmod(e*yc, ten_pow)
1997 if remainder:
1998 return None
1999 xe, remainder = divmod(xe*yc, ten_pow)
2000 if remainder:
2001 return None
2002
2003 if e*65 >= p*93: # 93/65 > log(10)/log(5)
2004 return None
2005 xc = 5**e
2006
2007 elif last_digit == 5:
2008 # e >= log_5(xc) if xc is a power of 5; we have
2009 # equality all the way up to xc=5**2658
2010 e = _nbits(xc)*28//65
2011 xc, remainder = divmod(5**e, xc)
2012 if remainder:
2013 return None
2014 while xc % 5 == 0:
2015 xc //= 5
2016 e -= 1
2017 if ye >= 0:
2018 y_as_integer = yc*10**ye
2019 e = e*y_as_integer
2020 xe = xe*y_as_integer
2021 else:
2022 ten_pow = 10**-ye
2023 e, remainder = divmod(e*yc, ten_pow)
2024 if remainder:
2025 return None
2026 xe, remainder = divmod(xe*yc, ten_pow)
2027 if remainder:
2028 return None
2029 if e*3 >= p*10: # 10/3 > log(10)/log(2)
2030 return None
2031 xc = 2**e
2032 else:
2033 return None
2034
2035 if xc >= 10**p:
2036 return None
2037 xe = -e-xe
Facundo Batista72bc54f2007-11-23 17:59:00 +00002038 return _dec_from_triple(0, str(xc), xe)
Facundo Batista353750c2007-09-13 18:13:15 +00002039
2040 # now y is positive; find m and n such that y = m/n
2041 if ye >= 0:
2042 m, n = yc*10**ye, 1
2043 else:
2044 if xe != 0 and len(str(abs(yc*xe))) <= -ye:
2045 return None
2046 xc_bits = _nbits(xc)
2047 if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
2048 return None
2049 m, n = yc, 10**(-ye)
2050 while m % 2 == n % 2 == 0:
2051 m //= 2
2052 n //= 2
2053 while m % 5 == n % 5 == 0:
2054 m //= 5
2055 n //= 5
2056
2057 # compute nth root of xc*10**xe
2058 if n > 1:
2059 # if 1 < xc < 2**n then xc isn't an nth power
2060 if xc != 1 and xc_bits <= n:
2061 return None
2062
2063 xe, rem = divmod(xe, n)
2064 if rem != 0:
2065 return None
2066
2067 # compute nth root of xc using Newton's method
2068 a = 1L << -(-_nbits(xc)//n) # initial estimate
2069 while True:
2070 q, r = divmod(xc, a**(n-1))
2071 if a <= q:
2072 break
2073 else:
2074 a = (a*(n-1) + q)//n
2075 if not (a == q and r == 0):
2076 return None
2077 xc = a
2078
2079 # now xc*10**xe is the nth root of the original xc*10**xe
2080 # compute mth power of xc*10**xe
2081
2082 # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
2083 # 10**p and the result is not representable.
2084 if xc > 1 and m > p*100//_log10_lb(xc):
2085 return None
2086 xc = xc**m
2087 xe *= m
2088 if xc > 10**p:
2089 return None
2090
2091 # by this point the result *is* exactly representable
2092 # adjust the exponent to get as close as possible to the ideal
2093 # exponent, if necessary
2094 str_xc = str(xc)
2095 if other._isinteger() and other._sign == 0:
2096 ideal_exponent = self._exp*int(other)
2097 zeros = min(xe-ideal_exponent, p-len(str_xc))
2098 else:
2099 zeros = 0
Facundo Batista72bc54f2007-11-23 17:59:00 +00002100 return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
Facundo Batista353750c2007-09-13 18:13:15 +00002101
2102 def __pow__(self, other, modulo=None, context=None):
2103 """Return self ** other [ % modulo].
2104
2105 With two arguments, compute self**other.
2106
2107 With three arguments, compute (self**other) % modulo. For the
2108 three argument form, the following restrictions on the
2109 arguments hold:
2110
2111 - all three arguments must be integral
2112 - other must be nonnegative
2113 - either self or other (or both) must be nonzero
2114 - modulo must be nonzero and must have at most p digits,
2115 where p is the context precision.
2116
2117 If any of these restrictions is violated the InvalidOperation
2118 flag is raised.
2119
2120 The result of pow(self, other, modulo) is identical to the
2121 result that would be obtained by computing (self**other) %
2122 modulo with unbounded precision, but is computed more
2123 efficiently. It is always exact.
2124 """
2125
2126 if modulo is not None:
2127 return self._power_modulo(other, modulo, context)
2128
2129 other = _convert_other(other)
2130 if other is NotImplemented:
2131 return other
2132
2133 if context is None:
2134 context = getcontext()
2135
2136 # either argument is a NaN => result is NaN
2137 ans = self._check_nans(other, context)
2138 if ans:
2139 return ans
2140
2141 # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
2142 if not other:
2143 if not self:
2144 return context._raise_error(InvalidOperation, '0 ** 0')
2145 else:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002146 return _One
Facundo Batista353750c2007-09-13 18:13:15 +00002147
2148 # result has sign 1 iff self._sign is 1 and other is an odd integer
2149 result_sign = 0
2150 if self._sign == 1:
2151 if other._isinteger():
2152 if not other._iseven():
2153 result_sign = 1
2154 else:
2155 # -ve**noninteger = NaN
2156 # (-0)**noninteger = 0**noninteger
2157 if self:
2158 return context._raise_error(InvalidOperation,
2159 'x ** y with x negative and y not an integer')
2160 # negate self, without doing any unwanted rounding
Facundo Batista72bc54f2007-11-23 17:59:00 +00002161 self = self.copy_negate()
Facundo Batista353750c2007-09-13 18:13:15 +00002162
2163 # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
2164 if not self:
2165 if other._sign == 0:
Facundo Batista72bc54f2007-11-23 17:59:00 +00002166 return _dec_from_triple(result_sign, '0', 0)
Facundo Batista353750c2007-09-13 18:13:15 +00002167 else:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002168 return _SignedInfinity[result_sign]
Facundo Batista353750c2007-09-13 18:13:15 +00002169
2170 # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002171 if self._isinfinity():
Facundo Batista353750c2007-09-13 18:13:15 +00002172 if other._sign == 0:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002173 return _SignedInfinity[result_sign]
Facundo Batista353750c2007-09-13 18:13:15 +00002174 else:
Facundo Batista72bc54f2007-11-23 17:59:00 +00002175 return _dec_from_triple(result_sign, '0', 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002176
Facundo Batista353750c2007-09-13 18:13:15 +00002177 # 1**other = 1, but the choice of exponent and the flags
2178 # depend on the exponent of self, and on whether other is a
2179 # positive integer, a negative integer, or neither
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002180 if self == _One:
Facundo Batista353750c2007-09-13 18:13:15 +00002181 if other._isinteger():
2182 # exp = max(self._exp*max(int(other), 0),
2183 # 1-context.prec) but evaluating int(other) directly
2184 # is dangerous until we know other is small (other
2185 # could be 1e999999999)
2186 if other._sign == 1:
2187 multiplier = 0
2188 elif other > context.prec:
2189 multiplier = context.prec
2190 else:
2191 multiplier = int(other)
Martin v. Löwiscfe31282006-07-19 17:18:32 +00002192
Facundo Batista353750c2007-09-13 18:13:15 +00002193 exp = self._exp * multiplier
2194 if exp < 1-context.prec:
2195 exp = 1-context.prec
2196 context._raise_error(Rounded)
2197 else:
2198 context._raise_error(Inexact)
2199 context._raise_error(Rounded)
2200 exp = 1-context.prec
2201
Facundo Batista72bc54f2007-11-23 17:59:00 +00002202 return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
Facundo Batista353750c2007-09-13 18:13:15 +00002203
2204 # compute adjusted exponent of self
2205 self_adj = self.adjusted()
2206
2207 # self ** infinity is infinity if self > 1, 0 if self < 1
2208 # self ** -infinity is infinity if self < 1, 0 if self > 1
2209 if other._isinfinity():
2210 if (other._sign == 0) == (self_adj < 0):
Facundo Batista72bc54f2007-11-23 17:59:00 +00002211 return _dec_from_triple(result_sign, '0', 0)
Facundo Batista353750c2007-09-13 18:13:15 +00002212 else:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002213 return _SignedInfinity[result_sign]
Facundo Batista353750c2007-09-13 18:13:15 +00002214
2215 # from here on, the result always goes through the call
2216 # to _fix at the end of this function.
2217 ans = None
2218
2219 # crude test to catch cases of extreme overflow/underflow. If
2220 # log10(self)*other >= 10**bound and bound >= len(str(Emax))
2221 # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
2222 # self**other >= 10**(Emax+1), so overflow occurs. The test
2223 # for underflow is similar.
2224 bound = self._log10_exp_bound() + other.adjusted()
2225 if (self_adj >= 0) == (other._sign == 0):
2226 # self > 1 and other +ve, or self < 1 and other -ve
2227 # possibility of overflow
2228 if bound >= len(str(context.Emax)):
Facundo Batista72bc54f2007-11-23 17:59:00 +00002229 ans = _dec_from_triple(result_sign, '1', context.Emax+1)
Facundo Batista353750c2007-09-13 18:13:15 +00002230 else:
2231 # self > 1 and other -ve, or self < 1 and other +ve
2232 # possibility of underflow to 0
2233 Etiny = context.Etiny()
2234 if bound >= len(str(-Etiny)):
Facundo Batista72bc54f2007-11-23 17:59:00 +00002235 ans = _dec_from_triple(result_sign, '1', Etiny-1)
Facundo Batista353750c2007-09-13 18:13:15 +00002236
2237 # try for an exact result with precision +1
2238 if ans is None:
2239 ans = self._power_exact(other, context.prec + 1)
2240 if ans is not None and result_sign == 1:
Facundo Batista72bc54f2007-11-23 17:59:00 +00002241 ans = _dec_from_triple(1, ans._int, ans._exp)
Facundo Batista353750c2007-09-13 18:13:15 +00002242
2243 # usual case: inexact result, x**y computed directly as exp(y*log(x))
2244 if ans is None:
2245 p = context.prec
2246 x = _WorkRep(self)
2247 xc, xe = x.int, x.exp
2248 y = _WorkRep(other)
2249 yc, ye = y.int, y.exp
2250 if y.sign == 1:
2251 yc = -yc
2252
2253 # compute correctly rounded result: start with precision +3,
2254 # then increase precision until result is unambiguously roundable
2255 extra = 3
2256 while True:
2257 coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
2258 if coeff % (5*10**(len(str(coeff))-p-1)):
2259 break
2260 extra += 3
2261
Facundo Batista72bc54f2007-11-23 17:59:00 +00002262 ans = _dec_from_triple(result_sign, str(coeff), exp)
Facundo Batista353750c2007-09-13 18:13:15 +00002263
2264 # the specification says that for non-integer other we need to
2265 # raise Inexact, even when the result is actually exact. In
2266 # the same way, we need to raise Underflow here if the result
2267 # is subnormal. (The call to _fix will take care of raising
2268 # Rounded and Subnormal, as usual.)
2269 if not other._isinteger():
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002270 context._raise_error(Inexact)
Facundo Batista353750c2007-09-13 18:13:15 +00002271 # pad with zeros up to length context.prec+1 if necessary
2272 if len(ans._int) <= context.prec:
2273 expdiff = context.prec+1 - len(ans._int)
Facundo Batista72bc54f2007-11-23 17:59:00 +00002274 ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
2275 ans._exp-expdiff)
Facundo Batista353750c2007-09-13 18:13:15 +00002276 if ans.adjusted() < context.Emin:
2277 context._raise_error(Underflow)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002278
Facundo Batista353750c2007-09-13 18:13:15 +00002279 # unlike exp, ln and log10, the power function respects the
2280 # rounding mode; no need to use ROUND_HALF_EVEN here
2281 ans = ans._fix(context)
2282 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002283
2284 def __rpow__(self, other, context=None):
2285 """Swaps self/other and returns __pow__."""
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002286 other = _convert_other(other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00002287 if other is NotImplemented:
2288 return other
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002289 return other.__pow__(self, context=context)
2290
2291 def normalize(self, context=None):
2292 """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002293
Facundo Batista353750c2007-09-13 18:13:15 +00002294 if context is None:
2295 context = getcontext()
2296
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002297 if self._is_special:
2298 ans = self._check_nans(context=context)
2299 if ans:
2300 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002301
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002302 dup = self._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002303 if dup._isinfinity():
2304 return dup
2305
2306 if not dup:
Facundo Batista72bc54f2007-11-23 17:59:00 +00002307 return _dec_from_triple(dup._sign, '0', 0)
Facundo Batista353750c2007-09-13 18:13:15 +00002308 exp_max = [context.Emax, context.Etop()][context._clamp]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002309 end = len(dup._int)
2310 exp = dup._exp
Facundo Batista72bc54f2007-11-23 17:59:00 +00002311 while dup._int[end-1] == '0' and exp < exp_max:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002312 exp += 1
2313 end -= 1
Facundo Batista72bc54f2007-11-23 17:59:00 +00002314 return _dec_from_triple(dup._sign, dup._int[:end], exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002315
Facundo Batistabd2fe832007-09-13 18:42:09 +00002316 def quantize(self, exp, rounding=None, context=None, watchexp=True):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002317 """Quantize self so its exponent is the same as that of exp.
2318
2319 Similar to self._rescale(exp._exp) but with error checking.
2320 """
Facundo Batistabd2fe832007-09-13 18:42:09 +00002321 exp = _convert_other(exp, raiseit=True)
2322
Facundo Batista353750c2007-09-13 18:13:15 +00002323 if context is None:
2324 context = getcontext()
2325 if rounding is None:
2326 rounding = context.rounding
2327
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002328 if self._is_special or exp._is_special:
2329 ans = self._check_nans(exp, context)
2330 if ans:
2331 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002332
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002333 if exp._isinfinity() or self._isinfinity():
2334 if exp._isinfinity() and self._isinfinity():
Facundo Batista6c398da2007-09-17 17:30:13 +00002335 return Decimal(self) # if both are inf, it is OK
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002336 return context._raise_error(InvalidOperation,
2337 'quantize with one INF')
Facundo Batista353750c2007-09-13 18:13:15 +00002338
Facundo Batistabd2fe832007-09-13 18:42:09 +00002339 # if we're not watching exponents, do a simple rescale
2340 if not watchexp:
2341 ans = self._rescale(exp._exp, rounding)
2342 # raise Inexact and Rounded where appropriate
2343 if ans._exp > self._exp:
2344 context._raise_error(Rounded)
2345 if ans != self:
2346 context._raise_error(Inexact)
2347 return ans
2348
Facundo Batista353750c2007-09-13 18:13:15 +00002349 # exp._exp should be between Etiny and Emax
2350 if not (context.Etiny() <= exp._exp <= context.Emax):
2351 return context._raise_error(InvalidOperation,
2352 'target exponent out of bounds in quantize')
2353
2354 if not self:
Facundo Batista72bc54f2007-11-23 17:59:00 +00002355 ans = _dec_from_triple(self._sign, '0', exp._exp)
Facundo Batista353750c2007-09-13 18:13:15 +00002356 return ans._fix(context)
2357
2358 self_adjusted = self.adjusted()
2359 if self_adjusted > context.Emax:
2360 return context._raise_error(InvalidOperation,
2361 'exponent of quantize result too large for current context')
2362 if self_adjusted - exp._exp + 1 > context.prec:
2363 return context._raise_error(InvalidOperation,
2364 'quantize result has too many digits for current context')
2365
2366 ans = self._rescale(exp._exp, rounding)
2367 if ans.adjusted() > context.Emax:
2368 return context._raise_error(InvalidOperation,
2369 'exponent of quantize result too large for current context')
2370 if len(ans._int) > context.prec:
2371 return context._raise_error(InvalidOperation,
2372 'quantize result has too many digits for current context')
2373
2374 # raise appropriate flags
2375 if ans._exp > self._exp:
2376 context._raise_error(Rounded)
2377 if ans != self:
2378 context._raise_error(Inexact)
2379 if ans and ans.adjusted() < context.Emin:
2380 context._raise_error(Subnormal)
2381
2382 # call to fix takes care of any necessary folddown
2383 ans = ans._fix(context)
2384 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002385
2386 def same_quantum(self, other):
Facundo Batista1a191df2007-10-02 17:01:24 +00002387 """Return True if self and other have the same exponent; otherwise
2388 return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002389
Facundo Batista1a191df2007-10-02 17:01:24 +00002390 If either operand is a special value, the following rules are used:
2391 * return True if both operands are infinities
2392 * return True if both operands are NaNs
2393 * otherwise, return False.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002394 """
Facundo Batista1a191df2007-10-02 17:01:24 +00002395 other = _convert_other(other, raiseit=True)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002396 if self._is_special or other._is_special:
Facundo Batista1a191df2007-10-02 17:01:24 +00002397 return (self.is_nan() and other.is_nan() or
2398 self.is_infinite() and other.is_infinite())
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002399 return self._exp == other._exp
2400
Facundo Batista353750c2007-09-13 18:13:15 +00002401 def _rescale(self, exp, rounding):
2402 """Rescale self so that the exponent is exp, either by padding with zeros
2403 or by truncating digits, using the given rounding mode.
2404
2405 Specials are returned without change. This operation is
2406 quiet: it raises no flags, and uses no information from the
2407 context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002408
2409 exp = exp to scale to (an integer)
Facundo Batista353750c2007-09-13 18:13:15 +00002410 rounding = rounding mode
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002411 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002412 if self._is_special:
Facundo Batista6c398da2007-09-17 17:30:13 +00002413 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002414 if not self:
Facundo Batista72bc54f2007-11-23 17:59:00 +00002415 return _dec_from_triple(self._sign, '0', exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002416
Facundo Batista353750c2007-09-13 18:13:15 +00002417 if self._exp >= exp:
2418 # pad answer with zeros if necessary
Facundo Batista72bc54f2007-11-23 17:59:00 +00002419 return _dec_from_triple(self._sign,
2420 self._int + '0'*(self._exp - exp), exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002421
Facundo Batista353750c2007-09-13 18:13:15 +00002422 # too many digits; round and lose data. If self.adjusted() <
2423 # exp-1, replace self by 10**(exp-1) before rounding
2424 digits = len(self._int) + self._exp - exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002425 if digits < 0:
Facundo Batista72bc54f2007-11-23 17:59:00 +00002426 self = _dec_from_triple(self._sign, '1', exp-1)
Facundo Batista353750c2007-09-13 18:13:15 +00002427 digits = 0
2428 this_function = getattr(self, self._pick_rounding_function[rounding])
Facundo Batista2ec74152007-12-03 17:55:00 +00002429 changed = this_function(digits)
2430 coeff = self._int[:digits] or '0'
2431 if changed == 1:
2432 coeff = str(int(coeff)+1)
2433 return _dec_from_triple(self._sign, coeff, exp)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002434
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00002435 def _round(self, places, rounding):
2436 """Round a nonzero, nonspecial Decimal to a fixed number of
2437 significant figures, using the given rounding mode.
2438
2439 Infinities, NaNs and zeros are returned unaltered.
2440
2441 This operation is quiet: it raises no flags, and uses no
2442 information from the context.
2443
2444 """
2445 if places <= 0:
2446 raise ValueError("argument should be at least 1 in _round")
2447 if self._is_special or not self:
2448 return Decimal(self)
2449 ans = self._rescale(self.adjusted()+1-places, rounding)
2450 # it can happen that the rescale alters the adjusted exponent;
2451 # for example when rounding 99.97 to 3 significant figures.
2452 # When this happens we end up with an extra 0 at the end of
2453 # the number; a second rescale fixes this.
2454 if ans.adjusted() != self.adjusted():
2455 ans = ans._rescale(ans.adjusted()+1-places, rounding)
2456 return ans
2457
Facundo Batista353750c2007-09-13 18:13:15 +00002458 def to_integral_exact(self, rounding=None, context=None):
2459 """Rounds to a nearby integer.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002460
Facundo Batista353750c2007-09-13 18:13:15 +00002461 If no rounding mode is specified, take the rounding mode from
2462 the context. This method raises the Rounded and Inexact flags
2463 when appropriate.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002464
Facundo Batista353750c2007-09-13 18:13:15 +00002465 See also: to_integral_value, which does exactly the same as
2466 this method except that it doesn't raise Inexact or Rounded.
2467 """
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002468 if self._is_special:
2469 ans = self._check_nans(context=context)
2470 if ans:
2471 return ans
Facundo Batista6c398da2007-09-17 17:30:13 +00002472 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002473 if self._exp >= 0:
Facundo Batista6c398da2007-09-17 17:30:13 +00002474 return Decimal(self)
Facundo Batista353750c2007-09-13 18:13:15 +00002475 if not self:
Facundo Batista72bc54f2007-11-23 17:59:00 +00002476 return _dec_from_triple(self._sign, '0', 0)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002477 if context is None:
2478 context = getcontext()
Facundo Batista353750c2007-09-13 18:13:15 +00002479 if rounding is None:
2480 rounding = context.rounding
2481 context._raise_error(Rounded)
2482 ans = self._rescale(0, rounding)
2483 if ans != self:
2484 context._raise_error(Inexact)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002485 return ans
2486
Facundo Batista353750c2007-09-13 18:13:15 +00002487 def to_integral_value(self, rounding=None, context=None):
2488 """Rounds to the nearest integer, without raising inexact, rounded."""
2489 if context is None:
2490 context = getcontext()
2491 if rounding is None:
2492 rounding = context.rounding
2493 if self._is_special:
2494 ans = self._check_nans(context=context)
2495 if ans:
2496 return ans
Facundo Batista6c398da2007-09-17 17:30:13 +00002497 return Decimal(self)
Facundo Batista353750c2007-09-13 18:13:15 +00002498 if self._exp >= 0:
Facundo Batista6c398da2007-09-17 17:30:13 +00002499 return Decimal(self)
Facundo Batista353750c2007-09-13 18:13:15 +00002500 else:
2501 return self._rescale(0, rounding)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002502
Facundo Batista353750c2007-09-13 18:13:15 +00002503 # the method name changed, but we provide also the old one, for compatibility
2504 to_integral = to_integral_value
2505
2506 def sqrt(self, context=None):
2507 """Return the square root of self."""
Mark Dickinson3b24ccb2008-03-25 14:33:23 +00002508 if context is None:
2509 context = getcontext()
2510
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002511 if self._is_special:
2512 ans = self._check_nans(context=context)
2513 if ans:
2514 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002515
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002516 if self._isinfinity() and self._sign == 0:
2517 return Decimal(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002518
2519 if not self:
Facundo Batista353750c2007-09-13 18:13:15 +00002520 # exponent = self._exp // 2. sqrt(-0) = -0
Facundo Batista72bc54f2007-11-23 17:59:00 +00002521 ans = _dec_from_triple(self._sign, '0', self._exp // 2)
Facundo Batista353750c2007-09-13 18:13:15 +00002522 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002523
2524 if self._sign == 1:
2525 return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
2526
Facundo Batista353750c2007-09-13 18:13:15 +00002527 # At this point self represents a positive number. Let p be
2528 # the desired precision and express self in the form c*100**e
2529 # with c a positive real number and e an integer, c and e
2530 # being chosen so that 100**(p-1) <= c < 100**p. Then the
2531 # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
2532 # <= sqrt(c) < 10**p, so the closest representable Decimal at
2533 # precision p is n*10**e where n = round_half_even(sqrt(c)),
2534 # the closest integer to sqrt(c) with the even integer chosen
2535 # in the case of a tie.
2536 #
2537 # To ensure correct rounding in all cases, we use the
2538 # following trick: we compute the square root to an extra
2539 # place (precision p+1 instead of precision p), rounding down.
2540 # Then, if the result is inexact and its last digit is 0 or 5,
2541 # we increase the last digit to 1 or 6 respectively; if it's
2542 # exact we leave the last digit alone. Now the final round to
2543 # p places (or fewer in the case of underflow) will round
2544 # correctly and raise the appropriate flags.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002545
Facundo Batista353750c2007-09-13 18:13:15 +00002546 # use an extra digit of precision
2547 prec = context.prec+1
2548
2549 # write argument in the form c*100**e where e = self._exp//2
2550 # is the 'ideal' exponent, to be used if the square root is
2551 # exactly representable. l is the number of 'digits' of c in
2552 # base 100, so that 100**(l-1) <= c < 100**l.
2553 op = _WorkRep(self)
2554 e = op.exp >> 1
2555 if op.exp & 1:
2556 c = op.int * 10
2557 l = (len(self._int) >> 1) + 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002558 else:
Facundo Batista353750c2007-09-13 18:13:15 +00002559 c = op.int
2560 l = len(self._int)+1 >> 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002561
Facundo Batista353750c2007-09-13 18:13:15 +00002562 # rescale so that c has exactly prec base 100 'digits'
2563 shift = prec-l
2564 if shift >= 0:
2565 c *= 100**shift
2566 exact = True
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002567 else:
Facundo Batista353750c2007-09-13 18:13:15 +00002568 c, remainder = divmod(c, 100**-shift)
2569 exact = not remainder
2570 e -= shift
Martin v. Löwiscfe31282006-07-19 17:18:32 +00002571
Facundo Batista353750c2007-09-13 18:13:15 +00002572 # find n = floor(sqrt(c)) using Newton's method
2573 n = 10**prec
2574 while True:
2575 q = c//n
2576 if n <= q:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002577 break
Facundo Batista353750c2007-09-13 18:13:15 +00002578 else:
2579 n = n + q >> 1
2580 exact = exact and n*n == c
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002581
Facundo Batista353750c2007-09-13 18:13:15 +00002582 if exact:
2583 # result is exact; rescale to use ideal exponent e
2584 if shift >= 0:
2585 # assert n % 10**shift == 0
2586 n //= 10**shift
2587 else:
2588 n *= 10**-shift
2589 e += shift
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002590 else:
Facundo Batista353750c2007-09-13 18:13:15 +00002591 # result is not exact; fix last digit as described above
2592 if n % 5 == 0:
2593 n += 1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002594
Facundo Batista72bc54f2007-11-23 17:59:00 +00002595 ans = _dec_from_triple(0, str(n), e)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002596
Facundo Batista353750c2007-09-13 18:13:15 +00002597 # round, and fit to current context
2598 context = context._shallow_copy()
2599 rounding = context._set_rounding(ROUND_HALF_EVEN)
Raymond Hettingerdab988d2004-10-09 07:10:44 +00002600 ans = ans._fix(context)
Facundo Batista353750c2007-09-13 18:13:15 +00002601 context.rounding = rounding
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002602
Facundo Batista353750c2007-09-13 18:13:15 +00002603 return ans
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002604
2605 def max(self, other, context=None):
2606 """Returns the larger value.
2607
Facundo Batista353750c2007-09-13 18:13:15 +00002608 Like max(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002609 NaN (and signals if one is sNaN). Also rounds.
2610 """
Facundo Batista353750c2007-09-13 18:13:15 +00002611 other = _convert_other(other, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002612
Facundo Batista6c398da2007-09-17 17:30:13 +00002613 if context is None:
2614 context = getcontext()
2615
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002616 if self._is_special or other._is_special:
Facundo Batista59c58842007-04-10 12:58:45 +00002617 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002618 # number is always returned
2619 sn = self._isnan()
2620 on = other._isnan()
2621 if sn or on:
Facundo Batistae29d4352008-12-11 04:19:46 +00002622 if on == 1 and sn == 0:
2623 return self._fix(context)
2624 if sn == 1 and on == 0:
2625 return other._fix(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002626 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002627
Mark Dickinson2fc92632008-02-06 22:10:50 +00002628 c = self._cmp(other)
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002629 if c == 0:
Facundo Batista59c58842007-04-10 12:58:45 +00002630 # If both operands are finite and equal in numerical value
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002631 # then an ordering is applied:
2632 #
Facundo Batista59c58842007-04-10 12:58:45 +00002633 # If the signs differ then max returns the operand with the
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002634 # positive sign and min returns the operand with the negative sign
2635 #
Facundo Batista59c58842007-04-10 12:58:45 +00002636 # If the signs are the same then the exponent is used to select
Facundo Batista353750c2007-09-13 18:13:15 +00002637 # the result. This is exactly the ordering used in compare_total.
2638 c = self.compare_total(other)
2639
2640 if c == -1:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002641 ans = other
Facundo Batista353750c2007-09-13 18:13:15 +00002642 else:
2643 ans = self
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002644
Facundo Batistae64acfa2007-12-17 14:18:42 +00002645 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002646
2647 def min(self, other, context=None):
2648 """Returns the smaller value.
2649
Facundo Batista59c58842007-04-10 12:58:45 +00002650 Like min(self, other) except if one is not a number, returns
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002651 NaN (and signals if one is sNaN). Also rounds.
2652 """
Facundo Batista353750c2007-09-13 18:13:15 +00002653 other = _convert_other(other, raiseit=True)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002654
Facundo Batista6c398da2007-09-17 17:30:13 +00002655 if context is None:
2656 context = getcontext()
2657
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002658 if self._is_special or other._is_special:
Facundo Batista59c58842007-04-10 12:58:45 +00002659 # If one operand is a quiet NaN and the other is number, then the
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002660 # number is always returned
2661 sn = self._isnan()
2662 on = other._isnan()
2663 if sn or on:
Facundo Batistae29d4352008-12-11 04:19:46 +00002664 if on == 1 and sn == 0:
2665 return self._fix(context)
2666 if sn == 1 and on == 0:
2667 return other._fix(context)
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002668 return self._check_nans(other, context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002669
Mark Dickinson2fc92632008-02-06 22:10:50 +00002670 c = self._cmp(other)
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00002671 if c == 0:
Facundo Batista353750c2007-09-13 18:13:15 +00002672 c = self.compare_total(other)
2673
2674 if c == -1:
2675 ans = self
2676 else:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002677 ans = other
Raymond Hettinger636a6b12004-09-19 01:54:09 +00002678
Facundo Batistae64acfa2007-12-17 14:18:42 +00002679 return ans._fix(context)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002680
2681 def _isinteger(self):
2682 """Returns whether self is an integer"""
Facundo Batista353750c2007-09-13 18:13:15 +00002683 if self._is_special:
2684 return False
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002685 if self._exp >= 0:
2686 return True
2687 rest = self._int[self._exp:]
Facundo Batista72bc54f2007-11-23 17:59:00 +00002688 return rest == '0'*len(rest)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002689
2690 def _iseven(self):
Facundo Batista353750c2007-09-13 18:13:15 +00002691 """Returns True if self is even. Assumes self is an integer."""
2692 if not self or self._exp > 0:
2693 return True
Facundo Batista72bc54f2007-11-23 17:59:00 +00002694 return self._int[-1+self._exp] in '02468'
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002695
2696 def adjusted(self):
2697 """Return the adjusted exponent of self"""
2698 try:
2699 return self._exp + len(self._int) - 1
Facundo Batista59c58842007-04-10 12:58:45 +00002700 # If NaN or Infinity, self._exp is string
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00002701 except TypeError:
2702 return 0
2703
Facundo Batista353750c2007-09-13 18:13:15 +00002704 def canonical(self, context=None):
2705 """Returns the same Decimal object.
2706
2707 As we do not have different encodings for the same number, the
2708 received object already is in its canonical form.
2709 """
2710 return self
2711
2712 def compare_signal(self, other, context=None):
2713 """Compares self to the other operand numerically.
2714
2715 It's pretty much like compare(), but all NaNs signal, with signaling
2716 NaNs taking precedence over quiet NaNs.
2717 """
Mark Dickinson2fc92632008-02-06 22:10:50 +00002718 other = _convert_other(other, raiseit = True)
2719 ans = self._compare_check_nans(other, context)
2720 if ans:
2721 return ans
Facundo Batista353750c2007-09-13 18:13:15 +00002722 return self.compare(other, context=context)
2723
2724 def compare_total(self, other):
2725 """Compares self to other using the abstract representations.
2726
2727 This is not like the standard compare, which use their numerical
2728 value. Note that a total ordering is defined for all possible abstract
2729 representations.
2730 """
2731 # if one is negative and the other is positive, it's easy
2732 if self._sign and not other._sign:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002733 return _NegativeOne
Facundo Batista353750c2007-09-13 18:13:15 +00002734 if not self._sign and other._sign:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002735 return _One
Facundo Batista353750c2007-09-13 18:13:15 +00002736 sign = self._sign
2737
2738 # let's handle both NaN types
2739 self_nan = self._isnan()
2740 other_nan = other._isnan()
2741 if self_nan or other_nan:
2742 if self_nan == other_nan:
2743 if self._int < other._int:
2744 if sign:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002745 return _One
Facundo Batista353750c2007-09-13 18:13:15 +00002746 else:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002747 return _NegativeOne
Facundo Batista353750c2007-09-13 18:13:15 +00002748 if self._int > other._int:
2749 if sign:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002750 return _NegativeOne
Facundo Batista353750c2007-09-13 18:13:15 +00002751 else:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002752 return _One
2753 return _Zero
Facundo Batista353750c2007-09-13 18:13:15 +00002754
2755 if sign:
2756 if self_nan == 1:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002757 return _NegativeOne
Facundo Batista353750c2007-09-13 18:13:15 +00002758 if other_nan == 1:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002759 return _One
Facundo Batista353750c2007-09-13 18:13:15 +00002760 if self_nan == 2:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002761 return _NegativeOne
Facundo Batista353750c2007-09-13 18:13:15 +00002762 if other_nan == 2:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002763 return _One
Facundo Batista353750c2007-09-13 18:13:15 +00002764 else:
2765 if self_nan == 1:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002766 return _One
Facundo Batista353750c2007-09-13 18:13:15 +00002767 if other_nan == 1:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002768 return _NegativeOne
Facundo Batista353750c2007-09-13 18:13:15 +00002769 if self_nan == 2:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002770 return _One
Facundo Batista353750c2007-09-13 18:13:15 +00002771 if other_nan == 2:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002772 return _NegativeOne
Facundo Batista353750c2007-09-13 18:13:15 +00002773
2774 if self < other:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002775 return _NegativeOne
Facundo Batista353750c2007-09-13 18:13:15 +00002776 if self > other:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002777 return _One
Facundo Batista353750c2007-09-13 18:13:15 +00002778
2779 if self._exp < other._exp:
2780 if sign:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002781 return _One
Facundo Batista353750c2007-09-13 18:13:15 +00002782 else:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002783 return _NegativeOne
Facundo Batista353750c2007-09-13 18:13:15 +00002784 if self._exp > other._exp:
2785 if sign:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002786 return _NegativeOne
Facundo Batista353750c2007-09-13 18:13:15 +00002787 else:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002788 return _One
2789 return _Zero
Facundo Batista353750c2007-09-13 18:13:15 +00002790
2791
2792 def compare_total_mag(self, other):
2793 """Compares self to other using abstract repr., ignoring sign.
2794
2795 Like compare_total, but with operand's sign ignored and assumed to be 0.
2796 """
2797 s = self.copy_abs()
2798 o = other.copy_abs()
2799 return s.compare_total(o)
2800
2801 def copy_abs(self):
2802 """Returns a copy with the sign set to 0. """
Facundo Batista72bc54f2007-11-23 17:59:00 +00002803 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Facundo Batista353750c2007-09-13 18:13:15 +00002804
2805 def copy_negate(self):
2806 """Returns a copy with the sign inverted."""
2807 if self._sign:
Facundo Batista72bc54f2007-11-23 17:59:00 +00002808 return _dec_from_triple(0, self._int, self._exp, self._is_special)
Facundo Batista353750c2007-09-13 18:13:15 +00002809 else:
Facundo Batista72bc54f2007-11-23 17:59:00 +00002810 return _dec_from_triple(1, self._int, self._exp, self._is_special)
Facundo Batista353750c2007-09-13 18:13:15 +00002811
2812 def copy_sign(self, other):
2813 """Returns self with the sign of other."""
Facundo Batista72bc54f2007-11-23 17:59:00 +00002814 return _dec_from_triple(other._sign, self._int,
2815 self._exp, self._is_special)
Facundo Batista353750c2007-09-13 18:13:15 +00002816
2817 def exp(self, context=None):
2818 """Returns e ** self."""
2819
2820 if context is None:
2821 context = getcontext()
2822
2823 # exp(NaN) = NaN
2824 ans = self._check_nans(context=context)
2825 if ans:
2826 return ans
2827
2828 # exp(-Infinity) = 0
2829 if self._isinfinity() == -1:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002830 return _Zero
Facundo Batista353750c2007-09-13 18:13:15 +00002831
2832 # exp(0) = 1
2833 if not self:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002834 return _One
Facundo Batista353750c2007-09-13 18:13:15 +00002835
2836 # exp(Infinity) = Infinity
2837 if self._isinfinity() == 1:
2838 return Decimal(self)
2839
2840 # the result is now guaranteed to be inexact (the true
2841 # mathematical result is transcendental). There's no need to
2842 # raise Rounded and Inexact here---they'll always be raised as
2843 # a result of the call to _fix.
2844 p = context.prec
2845 adj = self.adjusted()
2846
2847 # we only need to do any computation for quite a small range
2848 # of adjusted exponents---for example, -29 <= adj <= 10 for
2849 # the default context. For smaller exponent the result is
2850 # indistinguishable from 1 at the given precision, while for
2851 # larger exponent the result either overflows or underflows.
2852 if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
2853 # overflow
Facundo Batista72bc54f2007-11-23 17:59:00 +00002854 ans = _dec_from_triple(0, '1', context.Emax+1)
Facundo Batista353750c2007-09-13 18:13:15 +00002855 elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
2856 # underflow to 0
Facundo Batista72bc54f2007-11-23 17:59:00 +00002857 ans = _dec_from_triple(0, '1', context.Etiny()-1)
Facundo Batista353750c2007-09-13 18:13:15 +00002858 elif self._sign == 0 and adj < -p:
2859 # p+1 digits; final round will raise correct flags
Facundo Batista72bc54f2007-11-23 17:59:00 +00002860 ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
Facundo Batista353750c2007-09-13 18:13:15 +00002861 elif self._sign == 1 and adj < -p-1:
2862 # p+1 digits; final round will raise correct flags
Facundo Batista72bc54f2007-11-23 17:59:00 +00002863 ans = _dec_from_triple(0, '9'*(p+1), -p-1)
Facundo Batista353750c2007-09-13 18:13:15 +00002864 # general case
2865 else:
2866 op = _WorkRep(self)
2867 c, e = op.int, op.exp
2868 if op.sign == 1:
2869 c = -c
2870
2871 # compute correctly rounded result: increase precision by
2872 # 3 digits at a time until we get an unambiguously
2873 # roundable result
2874 extra = 3
2875 while True:
2876 coeff, exp = _dexp(c, e, p+extra)
2877 if coeff % (5*10**(len(str(coeff))-p-1)):
2878 break
2879 extra += 3
2880
Facundo Batista72bc54f2007-11-23 17:59:00 +00002881 ans = _dec_from_triple(0, str(coeff), exp)
Facundo Batista353750c2007-09-13 18:13:15 +00002882
2883 # at this stage, ans should round correctly with *any*
2884 # rounding mode, not just with ROUND_HALF_EVEN
2885 context = context._shallow_copy()
2886 rounding = context._set_rounding(ROUND_HALF_EVEN)
2887 ans = ans._fix(context)
2888 context.rounding = rounding
2889
2890 return ans
2891
2892 def is_canonical(self):
Facundo Batista1a191df2007-10-02 17:01:24 +00002893 """Return True if self is canonical; otherwise return False.
2894
2895 Currently, the encoding of a Decimal instance is always
2896 canonical, so this method returns True for any Decimal.
2897 """
2898 return True
Facundo Batista353750c2007-09-13 18:13:15 +00002899
2900 def is_finite(self):
Facundo Batista1a191df2007-10-02 17:01:24 +00002901 """Return True if self is finite; otherwise return False.
Facundo Batista353750c2007-09-13 18:13:15 +00002902
Facundo Batista1a191df2007-10-02 17:01:24 +00002903 A Decimal instance is considered finite if it is neither
2904 infinite nor a NaN.
Facundo Batista353750c2007-09-13 18:13:15 +00002905 """
Facundo Batista1a191df2007-10-02 17:01:24 +00002906 return not self._is_special
Facundo Batista353750c2007-09-13 18:13:15 +00002907
2908 def is_infinite(self):
Facundo Batista1a191df2007-10-02 17:01:24 +00002909 """Return True if self is infinite; otherwise return False."""
2910 return self._exp == 'F'
Facundo Batista353750c2007-09-13 18:13:15 +00002911
2912 def is_nan(self):
Facundo Batista1a191df2007-10-02 17:01:24 +00002913 """Return True if self is a qNaN or sNaN; otherwise return False."""
2914 return self._exp in ('n', 'N')
Facundo Batista353750c2007-09-13 18:13:15 +00002915
2916 def is_normal(self, context=None):
Facundo Batista1a191df2007-10-02 17:01:24 +00002917 """Return True if self is a normal number; otherwise return False."""
2918 if self._is_special or not self:
2919 return False
Facundo Batista353750c2007-09-13 18:13:15 +00002920 if context is None:
2921 context = getcontext()
Facundo Batista1a191df2007-10-02 17:01:24 +00002922 return context.Emin <= self.adjusted() <= context.Emax
Facundo Batista353750c2007-09-13 18:13:15 +00002923
2924 def is_qnan(self):
Facundo Batista1a191df2007-10-02 17:01:24 +00002925 """Return True if self is a quiet NaN; otherwise return False."""
2926 return self._exp == 'n'
Facundo Batista353750c2007-09-13 18:13:15 +00002927
2928 def is_signed(self):
Facundo Batista1a191df2007-10-02 17:01:24 +00002929 """Return True if self is negative; otherwise return False."""
2930 return self._sign == 1
Facundo Batista353750c2007-09-13 18:13:15 +00002931
2932 def is_snan(self):
Facundo Batista1a191df2007-10-02 17:01:24 +00002933 """Return True if self is a signaling NaN; otherwise return False."""
2934 return self._exp == 'N'
Facundo Batista353750c2007-09-13 18:13:15 +00002935
2936 def is_subnormal(self, context=None):
Facundo Batista1a191df2007-10-02 17:01:24 +00002937 """Return True if self is subnormal; otherwise return False."""
2938 if self._is_special or not self:
2939 return False
Facundo Batista353750c2007-09-13 18:13:15 +00002940 if context is None:
2941 context = getcontext()
Facundo Batista1a191df2007-10-02 17:01:24 +00002942 return self.adjusted() < context.Emin
Facundo Batista353750c2007-09-13 18:13:15 +00002943
2944 def is_zero(self):
Facundo Batista1a191df2007-10-02 17:01:24 +00002945 """Return True if self is a zero; otherwise return False."""
Facundo Batista72bc54f2007-11-23 17:59:00 +00002946 return not self._is_special and self._int == '0'
Facundo Batista353750c2007-09-13 18:13:15 +00002947
2948 def _ln_exp_bound(self):
2949 """Compute a lower bound for the adjusted exponent of self.ln().
2950 In other words, compute r such that self.ln() >= 10**r. Assumes
2951 that self is finite and positive and that self != 1.
2952 """
2953
2954 # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
2955 adj = self._exp + len(self._int) - 1
2956 if adj >= 1:
2957 # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
2958 return len(str(adj*23//10)) - 1
2959 if adj <= -2:
2960 # argument <= 0.1
2961 return len(str((-1-adj)*23//10)) - 1
2962 op = _WorkRep(self)
2963 c, e = op.int, op.exp
2964 if adj == 0:
2965 # 1 < self < 10
2966 num = str(c-10**-e)
2967 den = str(c)
2968 return len(num) - len(den) - (num < den)
2969 # adj == -1, 0.1 <= self < 1
2970 return e + len(str(10**-e - c)) - 1
2971
2972
2973 def ln(self, context=None):
2974 """Returns the natural (base e) logarithm of self."""
2975
2976 if context is None:
2977 context = getcontext()
2978
2979 # ln(NaN) = NaN
2980 ans = self._check_nans(context=context)
2981 if ans:
2982 return ans
2983
2984 # ln(0.0) == -Infinity
2985 if not self:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002986 return _NegativeInfinity
Facundo Batista353750c2007-09-13 18:13:15 +00002987
2988 # ln(Infinity) = Infinity
2989 if self._isinfinity() == 1:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002990 return _Infinity
Facundo Batista353750c2007-09-13 18:13:15 +00002991
2992 # ln(1.0) == 0.0
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00002993 if self == _One:
2994 return _Zero
Facundo Batista353750c2007-09-13 18:13:15 +00002995
2996 # ln(negative) raises InvalidOperation
2997 if self._sign == 1:
2998 return context._raise_error(InvalidOperation,
2999 'ln of a negative value')
3000
3001 # result is irrational, so necessarily inexact
3002 op = _WorkRep(self)
3003 c, e = op.int, op.exp
3004 p = context.prec
3005
3006 # correctly rounded result: repeatedly increase precision by 3
3007 # until we get an unambiguously roundable result
3008 places = p - self._ln_exp_bound() + 2 # at least p+3 places
3009 while True:
3010 coeff = _dlog(c, e, places)
3011 # assert len(str(abs(coeff)))-p >= 1
3012 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3013 break
3014 places += 3
Facundo Batista72bc54f2007-11-23 17:59:00 +00003015 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Facundo Batista353750c2007-09-13 18:13:15 +00003016
3017 context = context._shallow_copy()
3018 rounding = context._set_rounding(ROUND_HALF_EVEN)
3019 ans = ans._fix(context)
3020 context.rounding = rounding
3021 return ans
3022
3023 def _log10_exp_bound(self):
3024 """Compute a lower bound for the adjusted exponent of self.log10().
3025 In other words, find r such that self.log10() >= 10**r.
3026 Assumes that self is finite and positive and that self != 1.
3027 """
3028
3029 # For x >= 10 or x < 0.1 we only need a bound on the integer
3030 # part of log10(self), and this comes directly from the
3031 # exponent of x. For 0.1 <= x <= 10 we use the inequalities
3032 # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
3033 # (1-1/x)/2.31 > 0. If x < 1 then |log10(x)| > (1-x)/2.31 > 0
3034
3035 adj = self._exp + len(self._int) - 1
3036 if adj >= 1:
3037 # self >= 10
3038 return len(str(adj))-1
3039 if adj <= -2:
3040 # self < 0.1
3041 return len(str(-1-adj))-1
3042 op = _WorkRep(self)
3043 c, e = op.int, op.exp
3044 if adj == 0:
3045 # 1 < self < 10
3046 num = str(c-10**-e)
3047 den = str(231*c)
3048 return len(num) - len(den) - (num < den) + 2
3049 # adj == -1, 0.1 <= self < 1
3050 num = str(10**-e-c)
3051 return len(num) + e - (num < "231") - 1
3052
3053 def log10(self, context=None):
3054 """Returns the base 10 logarithm of self."""
3055
3056 if context is None:
3057 context = getcontext()
3058
3059 # log10(NaN) = NaN
3060 ans = self._check_nans(context=context)
3061 if ans:
3062 return ans
3063
3064 # log10(0.0) == -Infinity
3065 if not self:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00003066 return _NegativeInfinity
Facundo Batista353750c2007-09-13 18:13:15 +00003067
3068 # log10(Infinity) = Infinity
3069 if self._isinfinity() == 1:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00003070 return _Infinity
Facundo Batista353750c2007-09-13 18:13:15 +00003071
3072 # log10(negative or -Infinity) raises InvalidOperation
3073 if self._sign == 1:
3074 return context._raise_error(InvalidOperation,
3075 'log10 of a negative value')
3076
3077 # log10(10**n) = n
Facundo Batista72bc54f2007-11-23 17:59:00 +00003078 if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
Facundo Batista353750c2007-09-13 18:13:15 +00003079 # answer may need rounding
3080 ans = Decimal(self._exp + len(self._int) - 1)
3081 else:
3082 # result is irrational, so necessarily inexact
3083 op = _WorkRep(self)
3084 c, e = op.int, op.exp
3085 p = context.prec
3086
3087 # correctly rounded result: repeatedly increase precision
3088 # until result is unambiguously roundable
3089 places = p-self._log10_exp_bound()+2
3090 while True:
3091 coeff = _dlog10(c, e, places)
3092 # assert len(str(abs(coeff)))-p >= 1
3093 if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
3094 break
3095 places += 3
Facundo Batista72bc54f2007-11-23 17:59:00 +00003096 ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
Facundo Batista353750c2007-09-13 18:13:15 +00003097
3098 context = context._shallow_copy()
3099 rounding = context._set_rounding(ROUND_HALF_EVEN)
3100 ans = ans._fix(context)
3101 context.rounding = rounding
3102 return ans
3103
3104 def logb(self, context=None):
3105 """ Returns the exponent of the magnitude of self's MSD.
3106
3107 The result is the integer which is the exponent of the magnitude
3108 of the most significant digit of self (as though it were truncated
3109 to a single digit while maintaining the value of that digit and
3110 without limiting the resulting exponent).
3111 """
3112 # logb(NaN) = NaN
3113 ans = self._check_nans(context=context)
3114 if ans:
3115 return ans
3116
3117 if context is None:
3118 context = getcontext()
3119
3120 # logb(+/-Inf) = +Inf
3121 if self._isinfinity():
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00003122 return _Infinity
Facundo Batista353750c2007-09-13 18:13:15 +00003123
3124 # logb(0) = -Inf, DivisionByZero
3125 if not self:
Facundo Batistacce8df22007-09-18 16:53:18 +00003126 return context._raise_error(DivisionByZero, 'logb(0)', 1)
Facundo Batista353750c2007-09-13 18:13:15 +00003127
3128 # otherwise, simply return the adjusted exponent of self, as a
3129 # Decimal. Note that no attempt is made to fit the result
3130 # into the current context.
3131 return Decimal(self.adjusted())
3132
3133 def _islogical(self):
3134 """Return True if self is a logical operand.
3135
Andrew M. Kuchlingc8acc882008-01-16 00:32:03 +00003136 For being logical, it must be a finite number with a sign of 0,
Facundo Batista353750c2007-09-13 18:13:15 +00003137 an exponent of 0, and a coefficient whose digits must all be
3138 either 0 or 1.
3139 """
3140 if self._sign != 0 or self._exp != 0:
3141 return False
3142 for dig in self._int:
Facundo Batista72bc54f2007-11-23 17:59:00 +00003143 if dig not in '01':
Facundo Batista353750c2007-09-13 18:13:15 +00003144 return False
3145 return True
3146
3147 def _fill_logical(self, context, opa, opb):
3148 dif = context.prec - len(opa)
3149 if dif > 0:
Facundo Batista72bc54f2007-11-23 17:59:00 +00003150 opa = '0'*dif + opa
Facundo Batista353750c2007-09-13 18:13:15 +00003151 elif dif < 0:
3152 opa = opa[-context.prec:]
3153 dif = context.prec - len(opb)
3154 if dif > 0:
Facundo Batista72bc54f2007-11-23 17:59:00 +00003155 opb = '0'*dif + opb
Facundo Batista353750c2007-09-13 18:13:15 +00003156 elif dif < 0:
3157 opb = opb[-context.prec:]
3158 return opa, opb
3159
3160 def logical_and(self, other, context=None):
3161 """Applies an 'and' operation between self and other's digits."""
3162 if context is None:
3163 context = getcontext()
3164 if not self._islogical() or not other._islogical():
3165 return context._raise_error(InvalidOperation)
3166
3167 # fill to context.prec
3168 (opa, opb) = self._fill_logical(context, self._int, other._int)
3169
3170 # make the operation, and clean starting zeroes
Facundo Batista72bc54f2007-11-23 17:59:00 +00003171 result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
3172 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Facundo Batista353750c2007-09-13 18:13:15 +00003173
3174 def logical_invert(self, context=None):
3175 """Invert all its digits."""
3176 if context is None:
3177 context = getcontext()
Facundo Batista72bc54f2007-11-23 17:59:00 +00003178 return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
3179 context)
Facundo Batista353750c2007-09-13 18:13:15 +00003180
3181 def logical_or(self, other, context=None):
3182 """Applies an 'or' operation between self and other's digits."""
3183 if context is None:
3184 context = getcontext()
3185 if not self._islogical() or not other._islogical():
3186 return context._raise_error(InvalidOperation)
3187
3188 # fill to context.prec
3189 (opa, opb) = self._fill_logical(context, self._int, other._int)
3190
3191 # make the operation, and clean starting zeroes
Mark Dickinson65808ff2009-01-04 21:22:02 +00003192 result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)])
Facundo Batista72bc54f2007-11-23 17:59:00 +00003193 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Facundo Batista353750c2007-09-13 18:13:15 +00003194
3195 def logical_xor(self, other, context=None):
3196 """Applies an 'xor' operation between self and other's digits."""
3197 if context is None:
3198 context = getcontext()
3199 if not self._islogical() or not other._islogical():
3200 return context._raise_error(InvalidOperation)
3201
3202 # fill to context.prec
3203 (opa, opb) = self._fill_logical(context, self._int, other._int)
3204
3205 # make the operation, and clean starting zeroes
Mark Dickinson65808ff2009-01-04 21:22:02 +00003206 result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)])
Facundo Batista72bc54f2007-11-23 17:59:00 +00003207 return _dec_from_triple(0, result.lstrip('0') or '0', 0)
Facundo Batista353750c2007-09-13 18:13:15 +00003208
3209 def max_mag(self, other, context=None):
3210 """Compares the values numerically with their sign ignored."""
3211 other = _convert_other(other, raiseit=True)
3212
Facundo Batista6c398da2007-09-17 17:30:13 +00003213 if context is None:
3214 context = getcontext()
3215
Facundo Batista353750c2007-09-13 18:13:15 +00003216 if self._is_special or other._is_special:
3217 # If one operand is a quiet NaN and the other is number, then the
3218 # number is always returned
3219 sn = self._isnan()
3220 on = other._isnan()
3221 if sn or on:
Facundo Batistae29d4352008-12-11 04:19:46 +00003222 if on == 1 and sn == 0:
3223 return self._fix(context)
3224 if sn == 1 and on == 0:
3225 return other._fix(context)
Facundo Batista353750c2007-09-13 18:13:15 +00003226 return self._check_nans(other, context)
3227
Mark Dickinson2fc92632008-02-06 22:10:50 +00003228 c = self.copy_abs()._cmp(other.copy_abs())
Facundo Batista353750c2007-09-13 18:13:15 +00003229 if c == 0:
3230 c = self.compare_total(other)
3231
3232 if c == -1:
3233 ans = other
3234 else:
3235 ans = self
3236
Facundo Batistae64acfa2007-12-17 14:18:42 +00003237 return ans._fix(context)
Facundo Batista353750c2007-09-13 18:13:15 +00003238
3239 def min_mag(self, other, context=None):
3240 """Compares the values numerically with their sign ignored."""
3241 other = _convert_other(other, raiseit=True)
3242
Facundo Batista6c398da2007-09-17 17:30:13 +00003243 if context is None:
3244 context = getcontext()
3245
Facundo Batista353750c2007-09-13 18:13:15 +00003246 if self._is_special or other._is_special:
3247 # If one operand is a quiet NaN and the other is number, then the
3248 # number is always returned
3249 sn = self._isnan()
3250 on = other._isnan()
3251 if sn or on:
Facundo Batistae29d4352008-12-11 04:19:46 +00003252 if on == 1 and sn == 0:
3253 return self._fix(context)
3254 if sn == 1 and on == 0:
3255 return other._fix(context)
Facundo Batista353750c2007-09-13 18:13:15 +00003256 return self._check_nans(other, context)
3257
Mark Dickinson2fc92632008-02-06 22:10:50 +00003258 c = self.copy_abs()._cmp(other.copy_abs())
Facundo Batista353750c2007-09-13 18:13:15 +00003259 if c == 0:
3260 c = self.compare_total(other)
3261
3262 if c == -1:
3263 ans = self
3264 else:
3265 ans = other
3266
Facundo Batistae64acfa2007-12-17 14:18:42 +00003267 return ans._fix(context)
Facundo Batista353750c2007-09-13 18:13:15 +00003268
3269 def next_minus(self, context=None):
3270 """Returns the largest representable number smaller than itself."""
3271 if context is None:
3272 context = getcontext()
3273
3274 ans = self._check_nans(context=context)
3275 if ans:
3276 return ans
3277
3278 if self._isinfinity() == -1:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00003279 return _NegativeInfinity
Facundo Batista353750c2007-09-13 18:13:15 +00003280 if self._isinfinity() == 1:
Facundo Batista72bc54f2007-11-23 17:59:00 +00003281 return _dec_from_triple(0, '9'*context.prec, context.Etop())
Facundo Batista353750c2007-09-13 18:13:15 +00003282
3283 context = context.copy()
3284 context._set_rounding(ROUND_FLOOR)
3285 context._ignore_all_flags()
3286 new_self = self._fix(context)
3287 if new_self != self:
3288 return new_self
Facundo Batista72bc54f2007-11-23 17:59:00 +00003289 return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
3290 context)
Facundo Batista353750c2007-09-13 18:13:15 +00003291
3292 def next_plus(self, context=None):
3293 """Returns the smallest representable number larger than itself."""
3294 if context is None:
3295 context = getcontext()
3296
3297 ans = self._check_nans(context=context)
3298 if ans:
3299 return ans
3300
3301 if self._isinfinity() == 1:
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00003302 return _Infinity
Facundo Batista353750c2007-09-13 18:13:15 +00003303 if self._isinfinity() == -1:
Facundo Batista72bc54f2007-11-23 17:59:00 +00003304 return _dec_from_triple(1, '9'*context.prec, context.Etop())
Facundo Batista353750c2007-09-13 18:13:15 +00003305
3306 context = context.copy()
3307 context._set_rounding(ROUND_CEILING)
3308 context._ignore_all_flags()
3309 new_self = self._fix(context)
3310 if new_self != self:
3311 return new_self
Facundo Batista72bc54f2007-11-23 17:59:00 +00003312 return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
3313 context)
Facundo Batista353750c2007-09-13 18:13:15 +00003314
3315 def next_toward(self, other, context=None):
3316 """Returns the number closest to self, in the direction towards other.
3317
3318 The result is the closest representable number to self
3319 (excluding self) that is in the direction towards other,
3320 unless both have the same value. If the two operands are
3321 numerically equal, then the result is a copy of self with the
3322 sign set to be the same as the sign of other.
3323 """
3324 other = _convert_other(other, raiseit=True)
3325
3326 if context is None:
3327 context = getcontext()
3328
3329 ans = self._check_nans(other, context)
3330 if ans:
3331 return ans
3332
Mark Dickinson2fc92632008-02-06 22:10:50 +00003333 comparison = self._cmp(other)
Facundo Batista353750c2007-09-13 18:13:15 +00003334 if comparison == 0:
Facundo Batista72bc54f2007-11-23 17:59:00 +00003335 return self.copy_sign(other)
Facundo Batista353750c2007-09-13 18:13:15 +00003336
3337 if comparison == -1:
3338 ans = self.next_plus(context)
3339 else: # comparison == 1
3340 ans = self.next_minus(context)
3341
3342 # decide which flags to raise using value of ans
3343 if ans._isinfinity():
3344 context._raise_error(Overflow,
3345 'Infinite result from next_toward',
3346 ans._sign)
3347 context._raise_error(Rounded)
3348 context._raise_error(Inexact)
3349 elif ans.adjusted() < context.Emin:
3350 context._raise_error(Underflow)
3351 context._raise_error(Subnormal)
3352 context._raise_error(Rounded)
3353 context._raise_error(Inexact)
3354 # if precision == 1 then we don't raise Clamped for a
3355 # result 0E-Etiny.
3356 if not ans:
3357 context._raise_error(Clamped)
3358
3359 return ans
3360
3361 def number_class(self, context=None):
3362 """Returns an indication of the class of self.
3363
3364 The class is one of the following strings:
Facundo Batista0f5e7bf2007-12-19 12:53:01 +00003365 sNaN
3366 NaN
Facundo Batista353750c2007-09-13 18:13:15 +00003367 -Infinity
3368 -Normal
3369 -Subnormal
3370 -Zero
3371 +Zero
3372 +Subnormal
3373 +Normal
3374 +Infinity
3375 """
3376 if self.is_snan():
3377 return "sNaN"
3378 if self.is_qnan():
3379 return "NaN"
3380 inf = self._isinfinity()
3381 if inf == 1:
3382 return "+Infinity"
3383 if inf == -1:
3384 return "-Infinity"
3385 if self.is_zero():
3386 if self._sign:
3387 return "-Zero"
3388 else:
3389 return "+Zero"
3390 if context is None:
3391 context = getcontext()
3392 if self.is_subnormal(context=context):
3393 if self._sign:
3394 return "-Subnormal"
3395 else:
3396 return "+Subnormal"
3397 # just a normal, regular, boring number, :)
3398 if self._sign:
3399 return "-Normal"
3400 else:
3401 return "+Normal"
3402
3403 def radix(self):
3404 """Just returns 10, as this is Decimal, :)"""
3405 return Decimal(10)
3406
3407 def rotate(self, other, context=None):
3408 """Returns a rotated copy of self, value-of-other times."""
3409 if context is None:
3410 context = getcontext()
3411
3412 ans = self._check_nans(other, context)
3413 if ans:
3414 return ans
3415
3416 if other._exp != 0:
3417 return context._raise_error(InvalidOperation)
3418 if not (-context.prec <= int(other) <= context.prec):
3419 return context._raise_error(InvalidOperation)
3420
3421 if self._isinfinity():
Facundo Batista6c398da2007-09-17 17:30:13 +00003422 return Decimal(self)
Facundo Batista353750c2007-09-13 18:13:15 +00003423
3424 # get values, pad if necessary
3425 torot = int(other)
3426 rotdig = self._int
3427 topad = context.prec - len(rotdig)
3428 if topad:
Facundo Batista72bc54f2007-11-23 17:59:00 +00003429 rotdig = '0'*topad + rotdig
Facundo Batista353750c2007-09-13 18:13:15 +00003430
3431 # let's rotate!
3432 rotated = rotdig[torot:] + rotdig[:torot]
Facundo Batista72bc54f2007-11-23 17:59:00 +00003433 return _dec_from_triple(self._sign,
3434 rotated.lstrip('0') or '0', self._exp)
Facundo Batista353750c2007-09-13 18:13:15 +00003435
3436 def scaleb (self, other, context=None):
3437 """Returns self operand after adding the second value to its exp."""
3438 if context is None:
3439 context = getcontext()
3440
3441 ans = self._check_nans(other, context)
3442 if ans:
3443 return ans
3444
3445 if other._exp != 0:
3446 return context._raise_error(InvalidOperation)
3447 liminf = -2 * (context.Emax + context.prec)
3448 limsup = 2 * (context.Emax + context.prec)
3449 if not (liminf <= int(other) <= limsup):
3450 return context._raise_error(InvalidOperation)
3451
3452 if self._isinfinity():
Facundo Batista6c398da2007-09-17 17:30:13 +00003453 return Decimal(self)
Facundo Batista353750c2007-09-13 18:13:15 +00003454
Facundo Batista72bc54f2007-11-23 17:59:00 +00003455 d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
Facundo Batista353750c2007-09-13 18:13:15 +00003456 d = d._fix(context)
3457 return d
3458
3459 def shift(self, other, context=None):
3460 """Returns a shifted copy of self, value-of-other times."""
3461 if context is None:
3462 context = getcontext()
3463
3464 ans = self._check_nans(other, context)
3465 if ans:
3466 return ans
3467
3468 if other._exp != 0:
3469 return context._raise_error(InvalidOperation)
3470 if not (-context.prec <= int(other) <= context.prec):
3471 return context._raise_error(InvalidOperation)
3472
3473 if self._isinfinity():
Facundo Batista6c398da2007-09-17 17:30:13 +00003474 return Decimal(self)
Facundo Batista353750c2007-09-13 18:13:15 +00003475
3476 # get values, pad if necessary
3477 torot = int(other)
3478 if not torot:
Facundo Batista6c398da2007-09-17 17:30:13 +00003479 return Decimal(self)
Facundo Batista353750c2007-09-13 18:13:15 +00003480 rotdig = self._int
3481 topad = context.prec - len(rotdig)
3482 if topad:
Facundo Batista72bc54f2007-11-23 17:59:00 +00003483 rotdig = '0'*topad + rotdig
Facundo Batista353750c2007-09-13 18:13:15 +00003484
3485 # let's shift!
3486 if torot < 0:
3487 rotated = rotdig[:torot]
3488 else:
Facundo Batista72bc54f2007-11-23 17:59:00 +00003489 rotated = rotdig + '0'*torot
Facundo Batista353750c2007-09-13 18:13:15 +00003490 rotated = rotated[-context.prec:]
3491
Facundo Batista72bc54f2007-11-23 17:59:00 +00003492 return _dec_from_triple(self._sign,
3493 rotated.lstrip('0') or '0', self._exp)
Facundo Batista353750c2007-09-13 18:13:15 +00003494
Facundo Batista59c58842007-04-10 12:58:45 +00003495 # Support for pickling, copy, and deepcopy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003496 def __reduce__(self):
3497 return (self.__class__, (str(self),))
3498
3499 def __copy__(self):
3500 if type(self) == Decimal:
Martin v. Löwiscfe31282006-07-19 17:18:32 +00003501 return self # I'm immutable; therefore I am my own clone
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003502 return self.__class__(str(self))
3503
3504 def __deepcopy__(self, memo):
3505 if type(self) == Decimal:
Martin v. Löwiscfe31282006-07-19 17:18:32 +00003506 return self # My components are also immutable
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003507 return self.__class__(str(self))
3508
Mark Dickinson277859d2009-03-17 23:03:46 +00003509 # PEP 3101 support. the _localeconv keyword argument should be
3510 # considered private: it's provided for ease of testing only.
3511 def __format__(self, specifier, context=None, _localeconv=None):
Mark Dickinsonf4da7772008-02-29 03:29:17 +00003512 """Format a Decimal instance according to the given specifier.
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003513
3514 The specifier should be a standard format specifier, with the
3515 form described in PEP 3101. Formatting types 'e', 'E', 'f',
Mark Dickinson277859d2009-03-17 23:03:46 +00003516 'F', 'g', 'G', 'n' and '%' are supported. If the formatting
3517 type is omitted it defaults to 'g' or 'G', depending on the
3518 value of context.capitals.
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003519 """
3520
3521 # Note: PEP 3101 says that if the type is not present then
3522 # there should be at least one digit after the decimal point.
3523 # We take the liberty of ignoring this requirement for
3524 # Decimal---it's presumably there to make sure that
3525 # format(float, '') behaves similarly to str(float).
3526 if context is None:
3527 context = getcontext()
3528
Mark Dickinson277859d2009-03-17 23:03:46 +00003529 spec = _parse_format_specifier(specifier, _localeconv=_localeconv)
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003530
Mark Dickinson277859d2009-03-17 23:03:46 +00003531 # special values don't care about the type or precision
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003532 if self._is_special:
Mark Dickinson277859d2009-03-17 23:03:46 +00003533 sign = _format_sign(self._sign, spec)
3534 body = str(self.copy_abs())
3535 return _format_align(sign, body, spec)
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003536
3537 # a type of None defaults to 'g' or 'G', depending on context
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003538 if spec['type'] is None:
3539 spec['type'] = ['g', 'G'][context.capitals]
Mark Dickinson277859d2009-03-17 23:03:46 +00003540
3541 # if type is '%', adjust exponent of self accordingly
3542 if spec['type'] == '%':
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003543 self = _dec_from_triple(self._sign, self._int, self._exp+2)
3544
3545 # round if necessary, taking rounding mode from the context
3546 rounding = context.rounding
3547 precision = spec['precision']
3548 if precision is not None:
3549 if spec['type'] in 'eE':
3550 self = self._round(precision+1, rounding)
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003551 elif spec['type'] in 'fF%':
3552 self = self._rescale(-precision, rounding)
Mark Dickinson277859d2009-03-17 23:03:46 +00003553 elif spec['type'] in 'gG' and len(self._int) > precision:
3554 self = self._round(precision, rounding)
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003555 # special case: zeros with a positive exponent can't be
3556 # represented in fixed point; rescale them to 0e0.
Mark Dickinson277859d2009-03-17 23:03:46 +00003557 if not self and self._exp > 0 and spec['type'] in 'fF%':
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003558 self = self._rescale(0, rounding)
3559
3560 # figure out placement of the decimal point
3561 leftdigits = self._exp + len(self._int)
Mark Dickinson277859d2009-03-17 23:03:46 +00003562 if spec['type'] in 'eE':
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003563 if not self and precision is not None:
3564 dotplace = 1 - precision
3565 else:
3566 dotplace = 1
Mark Dickinson277859d2009-03-17 23:03:46 +00003567 elif spec['type'] in 'fF%':
3568 dotplace = leftdigits
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003569 elif spec['type'] in 'gG':
3570 if self._exp <= 0 and leftdigits > -6:
3571 dotplace = leftdigits
3572 else:
3573 dotplace = 1
3574
Mark Dickinson277859d2009-03-17 23:03:46 +00003575 # find digits before and after decimal point, and get exponent
3576 if dotplace < 0:
3577 intpart = '0'
3578 fracpart = '0'*(-dotplace) + self._int
3579 elif dotplace > len(self._int):
3580 intpart = self._int + '0'*(dotplace-len(self._int))
3581 fracpart = ''
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003582 else:
Mark Dickinson277859d2009-03-17 23:03:46 +00003583 intpart = self._int[:dotplace] or '0'
3584 fracpart = self._int[dotplace:]
3585 exp = leftdigits-dotplace
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003586
Mark Dickinson277859d2009-03-17 23:03:46 +00003587 # done with the decimal-specific stuff; hand over the rest
3588 # of the formatting to the _format_number function
3589 return _format_number(self._sign, intpart, fracpart, exp, spec)
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00003590
Facundo Batista72bc54f2007-11-23 17:59:00 +00003591def _dec_from_triple(sign, coefficient, exponent, special=False):
3592 """Create a decimal instance directly, without any validation,
3593 normalization (e.g. removal of leading zeros) or argument
3594 conversion.
3595
3596 This function is for *internal use only*.
3597 """
3598
3599 self = object.__new__(Decimal)
3600 self._sign = sign
3601 self._int = coefficient
3602 self._exp = exponent
3603 self._is_special = special
3604
3605 return self
3606
Raymond Hettinger2c8585b2009-02-03 03:37:03 +00003607# Register Decimal as a kind of Number (an abstract base class).
3608# However, do not register it as Real (because Decimals are not
3609# interoperable with floats).
3610_numbers.Number.register(Decimal)
3611
3612
Facundo Batista59c58842007-04-10 12:58:45 +00003613##### Context class #######################################################
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003614
Martin v. Löwiscfe31282006-07-19 17:18:32 +00003615
3616# get rounding method function:
Facundo Batista59c58842007-04-10 12:58:45 +00003617rounding_functions = [name for name in Decimal.__dict__.keys()
3618 if name.startswith('_round_')]
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003619for name in rounding_functions:
Facundo Batista59c58842007-04-10 12:58:45 +00003620 # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003621 globalname = name[1:].upper()
3622 val = globals()[globalname]
3623 Decimal._pick_rounding_function[val] = name
3624
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003625del name, val, globalname, rounding_functions
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003626
Nick Coghlanced12182006-09-02 03:54:17 +00003627class _ContextManager(object):
Nick Coghlan8b6999b2006-08-31 12:00:43 +00003628 """Context manager class to support localcontext().
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003629
Nick Coghlanced12182006-09-02 03:54:17 +00003630 Sets a copy of the supplied context in __enter__() and restores
Nick Coghlan8b6999b2006-08-31 12:00:43 +00003631 the previous decimal context in __exit__()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003632 """
3633 def __init__(self, new_context):
Nick Coghlanced12182006-09-02 03:54:17 +00003634 self.new_context = new_context.copy()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003635 def __enter__(self):
3636 self.saved_context = getcontext()
3637 setcontext(self.new_context)
3638 return self.new_context
3639 def __exit__(self, t, v, tb):
3640 setcontext(self.saved_context)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00003641
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003642class Context(object):
3643 """Contains the context for a Decimal instance.
3644
3645 Contains:
3646 prec - precision (for use in rounding, division, square roots..)
Facundo Batista59c58842007-04-10 12:58:45 +00003647 rounding - rounding type (how you round)
Raymond Hettingerbf440692004-07-10 14:14:37 +00003648 traps - If traps[exception] = 1, then the exception is
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003649 raised when it is caused. Otherwise, a value is
3650 substituted in.
Mark Dickinson1840c1a2008-05-03 18:23:14 +00003651 flags - When an exception is caused, flags[exception] is set.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003652 (Whether or not the trap_enabler is set)
3653 Should be reset by user of Decimal instance.
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003654 Emin - Minimum exponent
3655 Emax - Maximum exponent
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003656 capitals - If 1, 1*10^1 is printed as 1E+1.
3657 If 0, printed as 1e1
Raymond Hettingere0f15812004-07-05 05:36:39 +00003658 _clamp - If 1, change exponents if too high (Default 0)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003659 """
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003660
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003661 def __init__(self, prec=None, rounding=None,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003662 traps=None, flags=None,
Raymond Hettinger0ea241e2004-07-04 13:53:24 +00003663 Emin=None, Emax=None,
Raymond Hettingere0f15812004-07-05 05:36:39 +00003664 capitals=None, _clamp=0,
Raymond Hettingerabf8a562004-10-12 09:12:16 +00003665 _ignored_flags=None):
3666 if flags is None:
3667 flags = []
3668 if _ignored_flags is None:
3669 _ignored_flags = []
Raymond Hettingerbf440692004-07-10 14:14:37 +00003670 if not isinstance(flags, dict):
Mark Dickinson71f3b852008-05-04 02:25:46 +00003671 flags = dict([(s, int(s in flags)) for s in _signals])
Raymond Hettingerb91af522004-07-14 16:35:30 +00003672 del s
Raymond Hettingerbf440692004-07-10 14:14:37 +00003673 if traps is not None and not isinstance(traps, dict):
Mark Dickinson71f3b852008-05-04 02:25:46 +00003674 traps = dict([(s, int(s in traps)) for s in _signals])
Raymond Hettingerb91af522004-07-14 16:35:30 +00003675 del s
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003676 for name, val in locals().items():
3677 if val is None:
Raymond Hettingereb260842005-06-07 18:52:34 +00003678 setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003679 else:
3680 setattr(self, name, val)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003681 del self.self
3682
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003683 def __repr__(self):
Raymond Hettingerbf440692004-07-10 14:14:37 +00003684 """Show the current context."""
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003685 s = []
Facundo Batista59c58842007-04-10 12:58:45 +00003686 s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
3687 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
3688 % vars(self))
3689 names = [f.__name__ for f, v in self.flags.items() if v]
3690 s.append('flags=[' + ', '.join(names) + ']')
3691 names = [t.__name__ for t, v in self.traps.items() if v]
3692 s.append('traps=[' + ', '.join(names) + ']')
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003693 return ', '.join(s) + ')'
3694
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003695 def clear_flags(self):
3696 """Reset all flags to zero"""
3697 for flag in self.flags:
Raymond Hettingerb1b605e2004-07-04 01:55:39 +00003698 self.flags[flag] = 0
Raymond Hettingerd9c0a7a2004-07-03 10:02:28 +00003699
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003700 def _shallow_copy(self):
3701 """Returns a shallow copy from self."""
Facundo Batistae64acfa2007-12-17 14:18:42 +00003702 nc = Context(self.prec, self.rounding, self.traps,
3703 self.flags, self.Emin, self.Emax,
3704 self.capitals, self._clamp, self._ignored_flags)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003705 return nc
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003706
3707 def copy(self):
3708 """Returns a deep copy from self."""
Facundo Batista59c58842007-04-10 12:58:45 +00003709 nc = Context(self.prec, self.rounding, self.traps.copy(),
Facundo Batistae64acfa2007-12-17 14:18:42 +00003710 self.flags.copy(), self.Emin, self.Emax,
3711 self.capitals, self._clamp, self._ignored_flags)
Raymond Hettinger9fce44b2004-08-08 04:03:24 +00003712 return nc
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003713 __copy__ = copy
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003714
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003715 def _raise_error(self, condition, explanation = None, *args):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003716 """Handles an error
3717
3718 If the flag is in _ignored_flags, returns the default response.
Mark Dickinson1840c1a2008-05-03 18:23:14 +00003719 Otherwise, it sets the flag, then, if the corresponding
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003720 trap_enabler is set, it reaises the exception. Otherwise, it returns
Mark Dickinson1840c1a2008-05-03 18:23:14 +00003721 the default value after setting the flag.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003722 """
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003723 error = _condition_map.get(condition, condition)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003724 if error in self._ignored_flags:
Facundo Batista59c58842007-04-10 12:58:45 +00003725 # Don't touch the flag
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003726 return error().handle(self, *args)
3727
Mark Dickinson1840c1a2008-05-03 18:23:14 +00003728 self.flags[error] = 1
Raymond Hettingerbf440692004-07-10 14:14:37 +00003729 if not self.traps[error]:
Facundo Batista59c58842007-04-10 12:58:45 +00003730 # The errors define how to handle themselves.
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003731 return condition().handle(self, *args)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003732
3733 # Errors should only be risked on copies of the context
Facundo Batista59c58842007-04-10 12:58:45 +00003734 # self._ignored_flags = []
Mark Dickinson8aca9d02008-05-04 02:05:06 +00003735 raise error(explanation)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003736
3737 def _ignore_all_flags(self):
3738 """Ignore all flags, if they are raised"""
Raymond Hettingerfed52962004-07-14 15:41:57 +00003739 return self._ignore_flags(*_signals)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003740
3741 def _ignore_flags(self, *flags):
3742 """Ignore the flags, if they are raised"""
3743 # Do not mutate-- This way, copies of a context leave the original
3744 # alone.
3745 self._ignored_flags = (self._ignored_flags + list(flags))
3746 return list(flags)
3747
3748 def _regard_flags(self, *flags):
3749 """Stop ignoring the flags, if they are raised"""
3750 if flags and isinstance(flags[0], (tuple,list)):
3751 flags = flags[0]
3752 for flag in flags:
3753 self._ignored_flags.remove(flag)
3754
Nick Coghlan53663a62008-07-15 14:27:37 +00003755 # We inherit object.__hash__, so we must deny this explicitly
3756 __hash__ = None
Raymond Hettinger5aa478b2004-07-09 10:02:53 +00003757
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003758 def Etiny(self):
3759 """Returns Etiny (= Emin - prec + 1)"""
3760 return int(self.Emin - self.prec + 1)
3761
3762 def Etop(self):
Raymond Hettingere0f15812004-07-05 05:36:39 +00003763 """Returns maximum exponent (= Emax - prec + 1)"""
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003764 return int(self.Emax - self.prec + 1)
3765
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003766 def _set_rounding(self, type):
3767 """Sets the rounding type.
3768
3769 Sets the rounding type, and returns the current (previous)
3770 rounding type. Often used like:
3771
3772 context = context.copy()
3773 # so you don't change the calling context
3774 # if an error occurs in the middle.
3775 rounding = context._set_rounding(ROUND_UP)
3776 val = self.__sub__(other, context=context)
3777 context._set_rounding(rounding)
3778
3779 This will make it round up for that operation.
3780 """
3781 rounding = self.rounding
3782 self.rounding= type
3783 return rounding
3784
Raymond Hettingerfed52962004-07-14 15:41:57 +00003785 def create_decimal(self, num='0'):
Mark Dickinson59bc20b2008-01-12 01:56:00 +00003786 """Creates a new Decimal instance but using self as context.
3787
3788 This method implements the to-number operation of the
3789 IBM Decimal specification."""
3790
3791 if isinstance(num, basestring) and num != num.strip():
3792 return self._raise_error(ConversionSyntax,
3793 "no trailing or leading whitespace is "
3794 "permitted.")
3795
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003796 d = Decimal(num, context=self)
Facundo Batista353750c2007-09-13 18:13:15 +00003797 if d._isnan() and len(d._int) > self.prec - self._clamp:
3798 return self._raise_error(ConversionSyntax,
3799 "diagnostic info too long in NaN")
Raymond Hettingerdab988d2004-10-09 07:10:44 +00003800 return d._fix(self)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003801
Raymond Hettingerf4d85972009-01-03 19:02:23 +00003802 def create_decimal_from_float(self, f):
3803 """Creates a new Decimal instance from a float but rounding using self
3804 as the context.
3805
3806 >>> context = Context(prec=5, rounding=ROUND_DOWN)
3807 >>> context.create_decimal_from_float(3.1415926535897932)
3808 Decimal('3.1415')
3809 >>> context = Context(prec=5, traps=[Inexact])
3810 >>> context.create_decimal_from_float(3.1415926535897932)
3811 Traceback (most recent call last):
3812 ...
3813 Inexact: None
3814
3815 """
3816 d = Decimal.from_float(f) # An exact conversion
3817 return d._fix(self) # Apply the context rounding
3818
Facundo Batista59c58842007-04-10 12:58:45 +00003819 # Methods
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003820 def abs(self, a):
3821 """Returns the absolute value of the operand.
3822
3823 If the operand is negative, the result is the same as using the minus
Facundo Batista59c58842007-04-10 12:58:45 +00003824 operation on the operand. Otherwise, the result is the same as using
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003825 the plus operation on the operand.
3826
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003827 >>> ExtendedContext.abs(Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003828 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003829 >>> ExtendedContext.abs(Decimal('-100'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003830 Decimal('100')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003831 >>> ExtendedContext.abs(Decimal('101.5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003832 Decimal('101.5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003833 >>> ExtendedContext.abs(Decimal('-101.5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003834 Decimal('101.5')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003835 """
3836 return a.__abs__(context=self)
3837
3838 def add(self, a, b):
3839 """Return the sum of the two operands.
3840
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003841 >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003842 Decimal('19.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003843 >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003844 Decimal('1.02E+4')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003845 """
3846 return a.__add__(b, context=self)
3847
3848 def _apply(self, a):
Raymond Hettingerdab988d2004-10-09 07:10:44 +00003849 return str(a._fix(self))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003850
Facundo Batista353750c2007-09-13 18:13:15 +00003851 def canonical(self, a):
3852 """Returns the same Decimal object.
3853
3854 As we do not have different encodings for the same number, the
3855 received object already is in its canonical form.
3856
3857 >>> ExtendedContext.canonical(Decimal('2.50'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003858 Decimal('2.50')
Facundo Batista353750c2007-09-13 18:13:15 +00003859 """
3860 return a.canonical(context=self)
3861
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003862 def compare(self, a, b):
3863 """Compares values numerically.
3864
3865 If the signs of the operands differ, a value representing each operand
3866 ('-1' if the operand is less than zero, '0' if the operand is zero or
3867 negative zero, or '1' if the operand is greater than zero) is used in
3868 place of that operand for the comparison instead of the actual
3869 operand.
3870
3871 The comparison is then effected by subtracting the second operand from
3872 the first and then returning a value according to the result of the
3873 subtraction: '-1' if the result is less than zero, '0' if the result is
3874 zero or negative zero, or '1' if the result is greater than zero.
3875
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003876 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003877 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003878 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003879 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003880 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003881 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003882 >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003883 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003884 >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003885 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003886 >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003887 Decimal('-1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003888 """
3889 return a.compare(b, context=self)
3890
Facundo Batista353750c2007-09-13 18:13:15 +00003891 def compare_signal(self, a, b):
3892 """Compares the values of the two operands numerically.
3893
3894 It's pretty much like compare(), but all NaNs signal, with signaling
3895 NaNs taking precedence over quiet NaNs.
3896
3897 >>> c = ExtendedContext
3898 >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003899 Decimal('-1')
Facundo Batista353750c2007-09-13 18:13:15 +00003900 >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003901 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00003902 >>> c.flags[InvalidOperation] = 0
3903 >>> print c.flags[InvalidOperation]
3904 0
3905 >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003906 Decimal('NaN')
Facundo Batista353750c2007-09-13 18:13:15 +00003907 >>> print c.flags[InvalidOperation]
3908 1
3909 >>> c.flags[InvalidOperation] = 0
3910 >>> print c.flags[InvalidOperation]
3911 0
3912 >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003913 Decimal('NaN')
Facundo Batista353750c2007-09-13 18:13:15 +00003914 >>> print c.flags[InvalidOperation]
3915 1
3916 """
3917 return a.compare_signal(b, context=self)
3918
3919 def compare_total(self, a, b):
3920 """Compares two operands using their abstract representation.
3921
3922 This is not like the standard compare, which use their numerical
3923 value. Note that a total ordering is defined for all possible abstract
3924 representations.
3925
3926 >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003927 Decimal('-1')
Facundo Batista353750c2007-09-13 18:13:15 +00003928 >>> ExtendedContext.compare_total(Decimal('-127'), Decimal('12'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003929 Decimal('-1')
Facundo Batista353750c2007-09-13 18:13:15 +00003930 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003931 Decimal('-1')
Facundo Batista353750c2007-09-13 18:13:15 +00003932 >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003933 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00003934 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('12.300'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003935 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00003936 >>> ExtendedContext.compare_total(Decimal('12.3'), Decimal('NaN'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003937 Decimal('-1')
Facundo Batista353750c2007-09-13 18:13:15 +00003938 """
3939 return a.compare_total(b)
3940
3941 def compare_total_mag(self, a, b):
3942 """Compares two operands using their abstract representation ignoring sign.
3943
3944 Like compare_total, but with operand's sign ignored and assumed to be 0.
3945 """
3946 return a.compare_total_mag(b)
3947
3948 def copy_abs(self, a):
3949 """Returns a copy of the operand with the sign set to 0.
3950
3951 >>> ExtendedContext.copy_abs(Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003952 Decimal('2.1')
Facundo Batista353750c2007-09-13 18:13:15 +00003953 >>> ExtendedContext.copy_abs(Decimal('-100'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003954 Decimal('100')
Facundo Batista353750c2007-09-13 18:13:15 +00003955 """
3956 return a.copy_abs()
3957
3958 def copy_decimal(self, a):
3959 """Returns a copy of the decimal objet.
3960
3961 >>> ExtendedContext.copy_decimal(Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003962 Decimal('2.1')
Facundo Batista353750c2007-09-13 18:13:15 +00003963 >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003964 Decimal('-1.00')
Facundo Batista353750c2007-09-13 18:13:15 +00003965 """
Facundo Batista6c398da2007-09-17 17:30:13 +00003966 return Decimal(a)
Facundo Batista353750c2007-09-13 18:13:15 +00003967
3968 def copy_negate(self, a):
3969 """Returns a copy of the operand with the sign inverted.
3970
3971 >>> ExtendedContext.copy_negate(Decimal('101.5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003972 Decimal('-101.5')
Facundo Batista353750c2007-09-13 18:13:15 +00003973 >>> ExtendedContext.copy_negate(Decimal('-101.5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003974 Decimal('101.5')
Facundo Batista353750c2007-09-13 18:13:15 +00003975 """
3976 return a.copy_negate()
3977
3978 def copy_sign(self, a, b):
3979 """Copies the second operand's sign to the first one.
3980
3981 In detail, it returns a copy of the first operand with the sign
3982 equal to the sign of the second operand.
3983
3984 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003985 Decimal('1.50')
Facundo Batista353750c2007-09-13 18:13:15 +00003986 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003987 Decimal('1.50')
Facundo Batista353750c2007-09-13 18:13:15 +00003988 >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003989 Decimal('-1.50')
Facundo Batista353750c2007-09-13 18:13:15 +00003990 >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003991 Decimal('-1.50')
Facundo Batista353750c2007-09-13 18:13:15 +00003992 """
3993 return a.copy_sign(b)
3994
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00003995 def divide(self, a, b):
3996 """Decimal division in a specified context.
3997
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00003998 >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00003999 Decimal('0.333333333')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004000 >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004001 Decimal('0.666666667')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004002 >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004003 Decimal('2.5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004004 >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004005 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004006 >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004007 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004008 >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004009 Decimal('4.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004010 >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004011 Decimal('1.20')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004012 >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004013 Decimal('10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004014 >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004015 Decimal('1000')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004016 >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004017 Decimal('1.20E+6')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004018 """
4019 return a.__div__(b, context=self)
4020
4021 def divide_int(self, a, b):
4022 """Divides two numbers and returns the integer part of the result.
4023
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004024 >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004025 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004026 >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004027 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004028 >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004029 Decimal('3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004030 """
4031 return a.__floordiv__(b, context=self)
4032
4033 def divmod(self, a, b):
4034 return a.__divmod__(b, context=self)
4035
Facundo Batista353750c2007-09-13 18:13:15 +00004036 def exp(self, a):
4037 """Returns e ** a.
4038
4039 >>> c = ExtendedContext.copy()
4040 >>> c.Emin = -999
4041 >>> c.Emax = 999
4042 >>> c.exp(Decimal('-Infinity'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004043 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004044 >>> c.exp(Decimal('-1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004045 Decimal('0.367879441')
Facundo Batista353750c2007-09-13 18:13:15 +00004046 >>> c.exp(Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004047 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004048 >>> c.exp(Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004049 Decimal('2.71828183')
Facundo Batista353750c2007-09-13 18:13:15 +00004050 >>> c.exp(Decimal('0.693147181'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004051 Decimal('2.00000000')
Facundo Batista353750c2007-09-13 18:13:15 +00004052 >>> c.exp(Decimal('+Infinity'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004053 Decimal('Infinity')
Facundo Batista353750c2007-09-13 18:13:15 +00004054 """
4055 return a.exp(context=self)
4056
4057 def fma(self, a, b, c):
4058 """Returns a multiplied by b, plus c.
4059
4060 The first two operands are multiplied together, using multiply,
4061 the third operand is then added to the result of that
4062 multiplication, using add, all with only one final rounding.
4063
4064 >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004065 Decimal('22')
Facundo Batista353750c2007-09-13 18:13:15 +00004066 >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004067 Decimal('-8')
Facundo Batista353750c2007-09-13 18:13:15 +00004068 >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004069 Decimal('1.38435736E+12')
Facundo Batista353750c2007-09-13 18:13:15 +00004070 """
4071 return a.fma(b, c, context=self)
4072
4073 def is_canonical(self, a):
Facundo Batista1a191df2007-10-02 17:01:24 +00004074 """Return True if the operand is canonical; otherwise return False.
4075
4076 Currently, the encoding of a Decimal instance is always
4077 canonical, so this method returns True for any Decimal.
Facundo Batista353750c2007-09-13 18:13:15 +00004078
4079 >>> ExtendedContext.is_canonical(Decimal('2.50'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004080 True
Facundo Batista353750c2007-09-13 18:13:15 +00004081 """
Facundo Batista1a191df2007-10-02 17:01:24 +00004082 return a.is_canonical()
Facundo Batista353750c2007-09-13 18:13:15 +00004083
4084 def is_finite(self, a):
Facundo Batista1a191df2007-10-02 17:01:24 +00004085 """Return True if the operand is finite; otherwise return False.
Facundo Batista353750c2007-09-13 18:13:15 +00004086
Facundo Batista1a191df2007-10-02 17:01:24 +00004087 A Decimal instance is considered finite if it is neither
4088 infinite nor a NaN.
Facundo Batista353750c2007-09-13 18:13:15 +00004089
4090 >>> ExtendedContext.is_finite(Decimal('2.50'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004091 True
Facundo Batista353750c2007-09-13 18:13:15 +00004092 >>> ExtendedContext.is_finite(Decimal('-0.3'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004093 True
Facundo Batista353750c2007-09-13 18:13:15 +00004094 >>> ExtendedContext.is_finite(Decimal('0'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004095 True
Facundo Batista353750c2007-09-13 18:13:15 +00004096 >>> ExtendedContext.is_finite(Decimal('Inf'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004097 False
Facundo Batista353750c2007-09-13 18:13:15 +00004098 >>> ExtendedContext.is_finite(Decimal('NaN'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004099 False
Facundo Batista353750c2007-09-13 18:13:15 +00004100 """
4101 return a.is_finite()
4102
4103 def is_infinite(self, a):
Facundo Batista1a191df2007-10-02 17:01:24 +00004104 """Return True if the operand is infinite; otherwise return False.
Facundo Batista353750c2007-09-13 18:13:15 +00004105
4106 >>> ExtendedContext.is_infinite(Decimal('2.50'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004107 False
Facundo Batista353750c2007-09-13 18:13:15 +00004108 >>> ExtendedContext.is_infinite(Decimal('-Inf'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004109 True
Facundo Batista353750c2007-09-13 18:13:15 +00004110 >>> ExtendedContext.is_infinite(Decimal('NaN'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004111 False
Facundo Batista353750c2007-09-13 18:13:15 +00004112 """
4113 return a.is_infinite()
4114
4115 def is_nan(self, a):
Facundo Batista1a191df2007-10-02 17:01:24 +00004116 """Return True if the operand is a qNaN or sNaN;
4117 otherwise return False.
Facundo Batista353750c2007-09-13 18:13:15 +00004118
4119 >>> ExtendedContext.is_nan(Decimal('2.50'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004120 False
Facundo Batista353750c2007-09-13 18:13:15 +00004121 >>> ExtendedContext.is_nan(Decimal('NaN'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004122 True
Facundo Batista353750c2007-09-13 18:13:15 +00004123 >>> ExtendedContext.is_nan(Decimal('-sNaN'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004124 True
Facundo Batista353750c2007-09-13 18:13:15 +00004125 """
4126 return a.is_nan()
4127
4128 def is_normal(self, a):
Facundo Batista1a191df2007-10-02 17:01:24 +00004129 """Return True if the operand is a normal number;
4130 otherwise return False.
Facundo Batista353750c2007-09-13 18:13:15 +00004131
4132 >>> c = ExtendedContext.copy()
4133 >>> c.Emin = -999
4134 >>> c.Emax = 999
4135 >>> c.is_normal(Decimal('2.50'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004136 True
Facundo Batista353750c2007-09-13 18:13:15 +00004137 >>> c.is_normal(Decimal('0.1E-999'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004138 False
Facundo Batista353750c2007-09-13 18:13:15 +00004139 >>> c.is_normal(Decimal('0.00'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004140 False
Facundo Batista353750c2007-09-13 18:13:15 +00004141 >>> c.is_normal(Decimal('-Inf'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004142 False
Facundo Batista353750c2007-09-13 18:13:15 +00004143 >>> c.is_normal(Decimal('NaN'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004144 False
Facundo Batista353750c2007-09-13 18:13:15 +00004145 """
4146 return a.is_normal(context=self)
4147
4148 def is_qnan(self, a):
Facundo Batista1a191df2007-10-02 17:01:24 +00004149 """Return True if the operand is a quiet NaN; otherwise return False.
Facundo Batista353750c2007-09-13 18:13:15 +00004150
4151 >>> ExtendedContext.is_qnan(Decimal('2.50'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004152 False
Facundo Batista353750c2007-09-13 18:13:15 +00004153 >>> ExtendedContext.is_qnan(Decimal('NaN'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004154 True
Facundo Batista353750c2007-09-13 18:13:15 +00004155 >>> ExtendedContext.is_qnan(Decimal('sNaN'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004156 False
Facundo Batista353750c2007-09-13 18:13:15 +00004157 """
4158 return a.is_qnan()
4159
4160 def is_signed(self, a):
Facundo Batista1a191df2007-10-02 17:01:24 +00004161 """Return True if the operand is negative; otherwise return False.
Facundo Batista353750c2007-09-13 18:13:15 +00004162
4163 >>> ExtendedContext.is_signed(Decimal('2.50'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004164 False
Facundo Batista353750c2007-09-13 18:13:15 +00004165 >>> ExtendedContext.is_signed(Decimal('-12'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004166 True
Facundo Batista353750c2007-09-13 18:13:15 +00004167 >>> ExtendedContext.is_signed(Decimal('-0'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004168 True
Facundo Batista353750c2007-09-13 18:13:15 +00004169 """
4170 return a.is_signed()
4171
4172 def is_snan(self, a):
Facundo Batista1a191df2007-10-02 17:01:24 +00004173 """Return True if the operand is a signaling NaN;
4174 otherwise return False.
Facundo Batista353750c2007-09-13 18:13:15 +00004175
4176 >>> ExtendedContext.is_snan(Decimal('2.50'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004177 False
Facundo Batista353750c2007-09-13 18:13:15 +00004178 >>> ExtendedContext.is_snan(Decimal('NaN'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004179 False
Facundo Batista353750c2007-09-13 18:13:15 +00004180 >>> ExtendedContext.is_snan(Decimal('sNaN'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004181 True
Facundo Batista353750c2007-09-13 18:13:15 +00004182 """
4183 return a.is_snan()
4184
4185 def is_subnormal(self, a):
Facundo Batista1a191df2007-10-02 17:01:24 +00004186 """Return True if the operand is subnormal; otherwise return False.
Facundo Batista353750c2007-09-13 18:13:15 +00004187
4188 >>> c = ExtendedContext.copy()
4189 >>> c.Emin = -999
4190 >>> c.Emax = 999
4191 >>> c.is_subnormal(Decimal('2.50'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004192 False
Facundo Batista353750c2007-09-13 18:13:15 +00004193 >>> c.is_subnormal(Decimal('0.1E-999'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004194 True
Facundo Batista353750c2007-09-13 18:13:15 +00004195 >>> c.is_subnormal(Decimal('0.00'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004196 False
Facundo Batista353750c2007-09-13 18:13:15 +00004197 >>> c.is_subnormal(Decimal('-Inf'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004198 False
Facundo Batista353750c2007-09-13 18:13:15 +00004199 >>> c.is_subnormal(Decimal('NaN'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004200 False
Facundo Batista353750c2007-09-13 18:13:15 +00004201 """
4202 return a.is_subnormal(context=self)
4203
4204 def is_zero(self, a):
Facundo Batista1a191df2007-10-02 17:01:24 +00004205 """Return True if the operand is a zero; otherwise return False.
Facundo Batista353750c2007-09-13 18:13:15 +00004206
4207 >>> ExtendedContext.is_zero(Decimal('0'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004208 True
Facundo Batista353750c2007-09-13 18:13:15 +00004209 >>> ExtendedContext.is_zero(Decimal('2.50'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004210 False
Facundo Batista353750c2007-09-13 18:13:15 +00004211 >>> ExtendedContext.is_zero(Decimal('-0E+2'))
Facundo Batista1a191df2007-10-02 17:01:24 +00004212 True
Facundo Batista353750c2007-09-13 18:13:15 +00004213 """
4214 return a.is_zero()
4215
4216 def ln(self, a):
4217 """Returns the natural (base e) logarithm of the operand.
4218
4219 >>> c = ExtendedContext.copy()
4220 >>> c.Emin = -999
4221 >>> c.Emax = 999
4222 >>> c.ln(Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004223 Decimal('-Infinity')
Facundo Batista353750c2007-09-13 18:13:15 +00004224 >>> c.ln(Decimal('1.000'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004225 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004226 >>> c.ln(Decimal('2.71828183'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004227 Decimal('1.00000000')
Facundo Batista353750c2007-09-13 18:13:15 +00004228 >>> c.ln(Decimal('10'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004229 Decimal('2.30258509')
Facundo Batista353750c2007-09-13 18:13:15 +00004230 >>> c.ln(Decimal('+Infinity'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004231 Decimal('Infinity')
Facundo Batista353750c2007-09-13 18:13:15 +00004232 """
4233 return a.ln(context=self)
4234
4235 def log10(self, a):
4236 """Returns the base 10 logarithm of the operand.
4237
4238 >>> c = ExtendedContext.copy()
4239 >>> c.Emin = -999
4240 >>> c.Emax = 999
4241 >>> c.log10(Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004242 Decimal('-Infinity')
Facundo Batista353750c2007-09-13 18:13:15 +00004243 >>> c.log10(Decimal('0.001'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004244 Decimal('-3')
Facundo Batista353750c2007-09-13 18:13:15 +00004245 >>> c.log10(Decimal('1.000'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004246 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004247 >>> c.log10(Decimal('2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004248 Decimal('0.301029996')
Facundo Batista353750c2007-09-13 18:13:15 +00004249 >>> c.log10(Decimal('10'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004250 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004251 >>> c.log10(Decimal('70'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004252 Decimal('1.84509804')
Facundo Batista353750c2007-09-13 18:13:15 +00004253 >>> c.log10(Decimal('+Infinity'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004254 Decimal('Infinity')
Facundo Batista353750c2007-09-13 18:13:15 +00004255 """
4256 return a.log10(context=self)
4257
4258 def logb(self, a):
4259 """ Returns the exponent of the magnitude of the operand's MSD.
4260
4261 The result is the integer which is the exponent of the magnitude
4262 of the most significant digit of the operand (as though the
4263 operand were truncated to a single digit while maintaining the
4264 value of that digit and without limiting the resulting exponent).
4265
4266 >>> ExtendedContext.logb(Decimal('250'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004267 Decimal('2')
Facundo Batista353750c2007-09-13 18:13:15 +00004268 >>> ExtendedContext.logb(Decimal('2.50'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004269 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004270 >>> ExtendedContext.logb(Decimal('0.03'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004271 Decimal('-2')
Facundo Batista353750c2007-09-13 18:13:15 +00004272 >>> ExtendedContext.logb(Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004273 Decimal('-Infinity')
Facundo Batista353750c2007-09-13 18:13:15 +00004274 """
4275 return a.logb(context=self)
4276
4277 def logical_and(self, a, b):
4278 """Applies the logical operation 'and' between each operand's digits.
4279
4280 The operands must be both logical numbers.
4281
4282 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004283 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004284 >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004285 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004286 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004287 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004288 >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004289 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004290 >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004291 Decimal('1000')
Facundo Batista353750c2007-09-13 18:13:15 +00004292 >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004293 Decimal('10')
Facundo Batista353750c2007-09-13 18:13:15 +00004294 """
4295 return a.logical_and(b, context=self)
4296
4297 def logical_invert(self, a):
4298 """Invert all the digits in the operand.
4299
4300 The operand must be a logical number.
4301
4302 >>> ExtendedContext.logical_invert(Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004303 Decimal('111111111')
Facundo Batista353750c2007-09-13 18:13:15 +00004304 >>> ExtendedContext.logical_invert(Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004305 Decimal('111111110')
Facundo Batista353750c2007-09-13 18:13:15 +00004306 >>> ExtendedContext.logical_invert(Decimal('111111111'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004307 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004308 >>> ExtendedContext.logical_invert(Decimal('101010101'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004309 Decimal('10101010')
Facundo Batista353750c2007-09-13 18:13:15 +00004310 """
4311 return a.logical_invert(context=self)
4312
4313 def logical_or(self, a, b):
4314 """Applies the logical operation 'or' between each operand's digits.
4315
4316 The operands must be both logical numbers.
4317
4318 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004319 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004320 >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004321 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004322 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004323 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004324 >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004325 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004326 >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004327 Decimal('1110')
Facundo Batista353750c2007-09-13 18:13:15 +00004328 >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004329 Decimal('1110')
Facundo Batista353750c2007-09-13 18:13:15 +00004330 """
4331 return a.logical_or(b, context=self)
4332
4333 def logical_xor(self, a, b):
4334 """Applies the logical operation 'xor' between each operand's digits.
4335
4336 The operands must be both logical numbers.
4337
4338 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004339 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004340 >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004341 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004342 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004343 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004344 >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004345 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004346 >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004347 Decimal('110')
Facundo Batista353750c2007-09-13 18:13:15 +00004348 >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004349 Decimal('1101')
Facundo Batista353750c2007-09-13 18:13:15 +00004350 """
4351 return a.logical_xor(b, context=self)
4352
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004353 def max(self, a,b):
4354 """max compares two values numerically and returns the maximum.
4355
4356 If either operand is a NaN then the general rules apply.
Andrew M. Kuchlingc8acc882008-01-16 00:32:03 +00004357 Otherwise, the operands are compared as though by the compare
Facundo Batista59c58842007-04-10 12:58:45 +00004358 operation. If they are numerically equal then the left-hand operand
4359 is chosen as the result. Otherwise the maximum (closer to positive
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004360 infinity) of the two operands is chosen as the result.
4361
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004362 >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004363 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004364 >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004365 Decimal('3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004366 >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004367 Decimal('1')
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004368 >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004369 Decimal('7')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004370 """
4371 return a.max(b, context=self)
4372
Facundo Batista353750c2007-09-13 18:13:15 +00004373 def max_mag(self, a, b):
4374 """Compares the values numerically with their sign ignored."""
4375 return a.max_mag(b, context=self)
4376
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004377 def min(self, a,b):
4378 """min compares two values numerically and returns the minimum.
4379
4380 If either operand is a NaN then the general rules apply.
Andrew M. Kuchlingc8acc882008-01-16 00:32:03 +00004381 Otherwise, the operands are compared as though by the compare
Facundo Batista59c58842007-04-10 12:58:45 +00004382 operation. If they are numerically equal then the left-hand operand
4383 is chosen as the result. Otherwise the minimum (closer to negative
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004384 infinity) of the two operands is chosen as the result.
4385
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004386 >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004387 Decimal('2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004388 >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004389 Decimal('-10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004390 >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004391 Decimal('1.0')
Raymond Hettingerd6c700a2004-08-17 06:39:37 +00004392 >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004393 Decimal('7')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004394 """
4395 return a.min(b, context=self)
4396
Facundo Batista353750c2007-09-13 18:13:15 +00004397 def min_mag(self, a, b):
4398 """Compares the values numerically with their sign ignored."""
4399 return a.min_mag(b, context=self)
4400
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004401 def minus(self, a):
4402 """Minus corresponds to unary prefix minus in Python.
4403
4404 The operation is evaluated using the same rules as subtract; the
4405 operation minus(a) is calculated as subtract('0', a) where the '0'
4406 has the same exponent as the operand.
4407
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004408 >>> ExtendedContext.minus(Decimal('1.3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004409 Decimal('-1.3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004410 >>> ExtendedContext.minus(Decimal('-1.3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004411 Decimal('1.3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004412 """
4413 return a.__neg__(context=self)
4414
4415 def multiply(self, a, b):
4416 """multiply multiplies two operands.
4417
Martin v. Löwiscfe31282006-07-19 17:18:32 +00004418 If either operand is a special value then the general rules apply.
4419 Otherwise, the operands are multiplied together ('long multiplication'),
4420 resulting in a number which may be as long as the sum of the lengths
4421 of the two operands.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004422
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004423 >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004424 Decimal('3.60')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004425 >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004426 Decimal('21')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004427 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004428 Decimal('0.72')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004429 >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004430 Decimal('-0.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004431 >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004432 Decimal('4.28135971E+11')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004433 """
4434 return a.__mul__(b, context=self)
4435
Facundo Batista353750c2007-09-13 18:13:15 +00004436 def next_minus(self, a):
4437 """Returns the largest representable number smaller than a.
4438
4439 >>> c = ExtendedContext.copy()
4440 >>> c.Emin = -999
4441 >>> c.Emax = 999
4442 >>> ExtendedContext.next_minus(Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004443 Decimal('0.999999999')
Facundo Batista353750c2007-09-13 18:13:15 +00004444 >>> c.next_minus(Decimal('1E-1007'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004445 Decimal('0E-1007')
Facundo Batista353750c2007-09-13 18:13:15 +00004446 >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004447 Decimal('-1.00000004')
Facundo Batista353750c2007-09-13 18:13:15 +00004448 >>> c.next_minus(Decimal('Infinity'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004449 Decimal('9.99999999E+999')
Facundo Batista353750c2007-09-13 18:13:15 +00004450 """
4451 return a.next_minus(context=self)
4452
4453 def next_plus(self, a):
4454 """Returns the smallest representable number larger than a.
4455
4456 >>> c = ExtendedContext.copy()
4457 >>> c.Emin = -999
4458 >>> c.Emax = 999
4459 >>> ExtendedContext.next_plus(Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004460 Decimal('1.00000001')
Facundo Batista353750c2007-09-13 18:13:15 +00004461 >>> c.next_plus(Decimal('-1E-1007'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004462 Decimal('-0E-1007')
Facundo Batista353750c2007-09-13 18:13:15 +00004463 >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004464 Decimal('-1.00000002')
Facundo Batista353750c2007-09-13 18:13:15 +00004465 >>> c.next_plus(Decimal('-Infinity'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004466 Decimal('-9.99999999E+999')
Facundo Batista353750c2007-09-13 18:13:15 +00004467 """
4468 return a.next_plus(context=self)
4469
4470 def next_toward(self, a, b):
4471 """Returns the number closest to a, in direction towards b.
4472
4473 The result is the closest representable number from the first
4474 operand (but not the first operand) that is in the direction
4475 towards the second operand, unless the operands have the same
4476 value.
4477
4478 >>> c = ExtendedContext.copy()
4479 >>> c.Emin = -999
4480 >>> c.Emax = 999
4481 >>> c.next_toward(Decimal('1'), Decimal('2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004482 Decimal('1.00000001')
Facundo Batista353750c2007-09-13 18:13:15 +00004483 >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004484 Decimal('-0E-1007')
Facundo Batista353750c2007-09-13 18:13:15 +00004485 >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004486 Decimal('-1.00000002')
Facundo Batista353750c2007-09-13 18:13:15 +00004487 >>> c.next_toward(Decimal('1'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004488 Decimal('0.999999999')
Facundo Batista353750c2007-09-13 18:13:15 +00004489 >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004490 Decimal('0E-1007')
Facundo Batista353750c2007-09-13 18:13:15 +00004491 >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004492 Decimal('-1.00000004')
Facundo Batista353750c2007-09-13 18:13:15 +00004493 >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004494 Decimal('-0.00')
Facundo Batista353750c2007-09-13 18:13:15 +00004495 """
4496 return a.next_toward(b, context=self)
4497
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004498 def normalize(self, a):
Raymond Hettingere0f15812004-07-05 05:36:39 +00004499 """normalize reduces an operand to its simplest form.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004500
4501 Essentially a plus operation with all trailing zeros removed from the
4502 result.
4503
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004504 >>> ExtendedContext.normalize(Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004505 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004506 >>> ExtendedContext.normalize(Decimal('-2.0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004507 Decimal('-2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004508 >>> ExtendedContext.normalize(Decimal('1.200'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004509 Decimal('1.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004510 >>> ExtendedContext.normalize(Decimal('-120'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004511 Decimal('-1.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004512 >>> ExtendedContext.normalize(Decimal('120.00'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004513 Decimal('1.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004514 >>> ExtendedContext.normalize(Decimal('0.00'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004515 Decimal('0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004516 """
4517 return a.normalize(context=self)
4518
Facundo Batista353750c2007-09-13 18:13:15 +00004519 def number_class(self, a):
4520 """Returns an indication of the class of the operand.
4521
4522 The class is one of the following strings:
4523 -sNaN
4524 -NaN
4525 -Infinity
4526 -Normal
4527 -Subnormal
4528 -Zero
4529 +Zero
4530 +Subnormal
4531 +Normal
4532 +Infinity
4533
4534 >>> c = Context(ExtendedContext)
4535 >>> c.Emin = -999
4536 >>> c.Emax = 999
4537 >>> c.number_class(Decimal('Infinity'))
4538 '+Infinity'
4539 >>> c.number_class(Decimal('1E-10'))
4540 '+Normal'
4541 >>> c.number_class(Decimal('2.50'))
4542 '+Normal'
4543 >>> c.number_class(Decimal('0.1E-999'))
4544 '+Subnormal'
4545 >>> c.number_class(Decimal('0'))
4546 '+Zero'
4547 >>> c.number_class(Decimal('-0'))
4548 '-Zero'
4549 >>> c.number_class(Decimal('-0.1E-999'))
4550 '-Subnormal'
4551 >>> c.number_class(Decimal('-1E-10'))
4552 '-Normal'
4553 >>> c.number_class(Decimal('-2.50'))
4554 '-Normal'
4555 >>> c.number_class(Decimal('-Infinity'))
4556 '-Infinity'
4557 >>> c.number_class(Decimal('NaN'))
4558 'NaN'
4559 >>> c.number_class(Decimal('-NaN'))
4560 'NaN'
4561 >>> c.number_class(Decimal('sNaN'))
4562 'sNaN'
4563 """
4564 return a.number_class(context=self)
4565
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004566 def plus(self, a):
4567 """Plus corresponds to unary prefix plus in Python.
4568
4569 The operation is evaluated using the same rules as add; the
4570 operation plus(a) is calculated as add('0', a) where the '0'
4571 has the same exponent as the operand.
4572
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004573 >>> ExtendedContext.plus(Decimal('1.3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004574 Decimal('1.3')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004575 >>> ExtendedContext.plus(Decimal('-1.3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004576 Decimal('-1.3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004577 """
4578 return a.__pos__(context=self)
4579
4580 def power(self, a, b, modulo=None):
4581 """Raises a to the power of b, to modulo if given.
4582
Facundo Batista353750c2007-09-13 18:13:15 +00004583 With two arguments, compute a**b. If a is negative then b
4584 must be integral. The result will be inexact unless b is
4585 integral and the result is finite and can be expressed exactly
4586 in 'precision' digits.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004587
Facundo Batista353750c2007-09-13 18:13:15 +00004588 With three arguments, compute (a**b) % modulo. For the
4589 three argument form, the following restrictions on the
4590 arguments hold:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004591
Facundo Batista353750c2007-09-13 18:13:15 +00004592 - all three arguments must be integral
4593 - b must be nonnegative
4594 - at least one of a or b must be nonzero
4595 - modulo must be nonzero and have at most 'precision' digits
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004596
Facundo Batista353750c2007-09-13 18:13:15 +00004597 The result of pow(a, b, modulo) is identical to the result
4598 that would be obtained by computing (a**b) % modulo with
4599 unbounded precision, but is computed more efficiently. It is
4600 always exact.
4601
4602 >>> c = ExtendedContext.copy()
4603 >>> c.Emin = -999
4604 >>> c.Emax = 999
4605 >>> c.power(Decimal('2'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004606 Decimal('8')
Facundo Batista353750c2007-09-13 18:13:15 +00004607 >>> c.power(Decimal('-2'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004608 Decimal('-8')
Facundo Batista353750c2007-09-13 18:13:15 +00004609 >>> c.power(Decimal('2'), Decimal('-3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004610 Decimal('0.125')
Facundo Batista353750c2007-09-13 18:13:15 +00004611 >>> c.power(Decimal('1.7'), Decimal('8'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004612 Decimal('69.7575744')
Facundo Batista353750c2007-09-13 18:13:15 +00004613 >>> c.power(Decimal('10'), Decimal('0.301029996'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004614 Decimal('2.00000000')
Facundo Batista353750c2007-09-13 18:13:15 +00004615 >>> c.power(Decimal('Infinity'), Decimal('-1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004616 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004617 >>> c.power(Decimal('Infinity'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004618 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004619 >>> c.power(Decimal('Infinity'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004620 Decimal('Infinity')
Facundo Batista353750c2007-09-13 18:13:15 +00004621 >>> c.power(Decimal('-Infinity'), Decimal('-1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004622 Decimal('-0')
Facundo Batista353750c2007-09-13 18:13:15 +00004623 >>> c.power(Decimal('-Infinity'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004624 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004625 >>> c.power(Decimal('-Infinity'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004626 Decimal('-Infinity')
Facundo Batista353750c2007-09-13 18:13:15 +00004627 >>> c.power(Decimal('-Infinity'), Decimal('2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004628 Decimal('Infinity')
Facundo Batista353750c2007-09-13 18:13:15 +00004629 >>> c.power(Decimal('0'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004630 Decimal('NaN')
Facundo Batista353750c2007-09-13 18:13:15 +00004631
4632 >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004633 Decimal('11')
Facundo Batista353750c2007-09-13 18:13:15 +00004634 >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004635 Decimal('-11')
Facundo Batista353750c2007-09-13 18:13:15 +00004636 >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004637 Decimal('1')
Facundo Batista353750c2007-09-13 18:13:15 +00004638 >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004639 Decimal('11')
Facundo Batista353750c2007-09-13 18:13:15 +00004640 >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004641 Decimal('11729830')
Facundo Batista353750c2007-09-13 18:13:15 +00004642 >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004643 Decimal('-0')
Facundo Batista353750c2007-09-13 18:13:15 +00004644 >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004645 Decimal('1')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004646 """
4647 return a.__pow__(b, modulo, context=self)
4648
4649 def quantize(self, a, b):
Facundo Batista59c58842007-04-10 12:58:45 +00004650 """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004651
4652 The coefficient of the result is derived from that of the left-hand
Facundo Batista59c58842007-04-10 12:58:45 +00004653 operand. It may be rounded using the current rounding setting (if the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004654 exponent is being increased), multiplied by a positive power of ten (if
4655 the exponent is being decreased), or is unchanged (if the exponent is
4656 already equal to that of the right-hand operand).
4657
4658 Unlike other operations, if the length of the coefficient after the
4659 quantize operation would be greater than precision then an Invalid
Facundo Batista59c58842007-04-10 12:58:45 +00004660 operation condition is raised. This guarantees that, unless there is
4661 an error condition, the exponent of the result of a quantize is always
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004662 equal to that of the right-hand operand.
4663
4664 Also unlike other operations, quantize will never raise Underflow, even
4665 if the result is subnormal and inexact.
4666
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004667 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004668 Decimal('2.170')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004669 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004670 Decimal('2.17')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004671 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004672 Decimal('2.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004673 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004674 Decimal('2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004675 >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004676 Decimal('0E+1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004677 >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004678 Decimal('-Infinity')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004679 >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004680 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004681 >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004682 Decimal('-0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004683 >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004684 Decimal('-0E+5')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004685 >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004686 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004687 >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004688 Decimal('NaN')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004689 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004690 Decimal('217.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004691 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004692 Decimal('217')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004693 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004694 Decimal('2.2E+2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004695 >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004696 Decimal('2E+2')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004697 """
4698 return a.quantize(b, context=self)
4699
Facundo Batista353750c2007-09-13 18:13:15 +00004700 def radix(self):
4701 """Just returns 10, as this is Decimal, :)
4702
4703 >>> ExtendedContext.radix()
Raymond Hettingerabe32372008-02-14 02:41:22 +00004704 Decimal('10')
Facundo Batista353750c2007-09-13 18:13:15 +00004705 """
4706 return Decimal(10)
4707
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004708 def remainder(self, a, b):
4709 """Returns the remainder from integer division.
4710
4711 The result is the residue of the dividend after the operation of
Facundo Batista59c58842007-04-10 12:58:45 +00004712 calculating integer division as described for divide-integer, rounded
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00004713 to precision digits if necessary. The sign of the result, if
Facundo Batista59c58842007-04-10 12:58:45 +00004714 non-zero, is the same as that of the original dividend.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004715
4716 This operation will fail under the same conditions as integer division
4717 (that is, if integer division on the same two operands would fail, the
4718 remainder cannot be calculated).
4719
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004720 >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004721 Decimal('2.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004722 >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004723 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004724 >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004725 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004726 >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004727 Decimal('0.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004728 >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004729 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004730 >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004731 Decimal('1.0')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004732 """
4733 return a.__mod__(b, context=self)
4734
4735 def remainder_near(self, a, b):
4736 """Returns to be "a - b * n", where n is the integer nearest the exact
4737 value of "x / b" (if two integers are equally near then the even one
Facundo Batista59c58842007-04-10 12:58:45 +00004738 is chosen). If the result is equal to 0 then its sign will be the
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004739 sign of a.
4740
4741 This operation will fail under the same conditions as integer division
4742 (that is, if integer division on the same two operands would fail, the
4743 remainder cannot be calculated).
4744
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004745 >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004746 Decimal('-0.9')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004747 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004748 Decimal('-2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004749 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004750 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004751 >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004752 Decimal('-1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004753 >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004754 Decimal('0.2')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004755 >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004756 Decimal('0.1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004757 >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004758 Decimal('-0.3')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004759 """
4760 return a.remainder_near(b, context=self)
4761
Facundo Batista353750c2007-09-13 18:13:15 +00004762 def rotate(self, a, b):
4763 """Returns a rotated copy of a, b times.
4764
4765 The coefficient of the result is a rotated copy of the digits in
4766 the coefficient of the first operand. The number of places of
4767 rotation is taken from the absolute value of the second operand,
4768 with the rotation being to the left if the second operand is
4769 positive or to the right otherwise.
4770
4771 >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004772 Decimal('400000003')
Facundo Batista353750c2007-09-13 18:13:15 +00004773 >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004774 Decimal('12')
Facundo Batista353750c2007-09-13 18:13:15 +00004775 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004776 Decimal('891234567')
Facundo Batista353750c2007-09-13 18:13:15 +00004777 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004778 Decimal('123456789')
Facundo Batista353750c2007-09-13 18:13:15 +00004779 >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004780 Decimal('345678912')
Facundo Batista353750c2007-09-13 18:13:15 +00004781 """
4782 return a.rotate(b, context=self)
4783
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004784 def same_quantum(self, a, b):
4785 """Returns True if the two operands have the same exponent.
4786
4787 The result is never affected by either the sign or the coefficient of
4788 either operand.
4789
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004790 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004791 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004792 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004793 True
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004794 >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004795 False
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004796 >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004797 True
4798 """
4799 return a.same_quantum(b)
4800
Facundo Batista353750c2007-09-13 18:13:15 +00004801 def scaleb (self, a, b):
4802 """Returns the first operand after adding the second value its exp.
4803
4804 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004805 Decimal('0.0750')
Facundo Batista353750c2007-09-13 18:13:15 +00004806 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004807 Decimal('7.50')
Facundo Batista353750c2007-09-13 18:13:15 +00004808 >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004809 Decimal('7.50E+3')
Facundo Batista353750c2007-09-13 18:13:15 +00004810 """
4811 return a.scaleb (b, context=self)
4812
4813 def shift(self, a, b):
4814 """Returns a shifted copy of a, b times.
4815
4816 The coefficient of the result is a shifted copy of the digits
4817 in the coefficient of the first operand. The number of places
4818 to shift is taken from the absolute value of the second operand,
4819 with the shift being to the left if the second operand is
4820 positive or to the right otherwise. Digits shifted into the
4821 coefficient are zeros.
4822
4823 >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004824 Decimal('400000000')
Facundo Batista353750c2007-09-13 18:13:15 +00004825 >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004826 Decimal('0')
Facundo Batista353750c2007-09-13 18:13:15 +00004827 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004828 Decimal('1234567')
Facundo Batista353750c2007-09-13 18:13:15 +00004829 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004830 Decimal('123456789')
Facundo Batista353750c2007-09-13 18:13:15 +00004831 >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004832 Decimal('345678900')
Facundo Batista353750c2007-09-13 18:13:15 +00004833 """
4834 return a.shift(b, context=self)
4835
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004836 def sqrt(self, a):
Facundo Batista59c58842007-04-10 12:58:45 +00004837 """Square root of a non-negative number to context precision.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004838
4839 If the result must be inexact, it is rounded using the round-half-even
4840 algorithm.
4841
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004842 >>> ExtendedContext.sqrt(Decimal('0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004843 Decimal('0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004844 >>> ExtendedContext.sqrt(Decimal('-0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004845 Decimal('-0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004846 >>> ExtendedContext.sqrt(Decimal('0.39'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004847 Decimal('0.624499800')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004848 >>> ExtendedContext.sqrt(Decimal('100'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004849 Decimal('10')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004850 >>> ExtendedContext.sqrt(Decimal('1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004851 Decimal('1')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004852 >>> ExtendedContext.sqrt(Decimal('1.0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004853 Decimal('1.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004854 >>> ExtendedContext.sqrt(Decimal('1.00'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004855 Decimal('1.0')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004856 >>> ExtendedContext.sqrt(Decimal('7'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004857 Decimal('2.64575131')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004858 >>> ExtendedContext.sqrt(Decimal('10'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004859 Decimal('3.16227766')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004860 >>> ExtendedContext.prec
Raymond Hettinger6ea48452004-07-03 12:26:21 +00004861 9
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004862 """
4863 return a.sqrt(context=self)
4864
4865 def subtract(self, a, b):
Georg Brandlf33d01d2005-08-22 19:35:18 +00004866 """Return the difference between the two operands.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004867
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004868 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004869 Decimal('0.23')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004870 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004871 Decimal('0.00')
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00004872 >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004873 Decimal('-0.77')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004874 """
4875 return a.__sub__(b, context=self)
4876
4877 def to_eng_string(self, a):
4878 """Converts a number to a string, using scientific notation.
4879
4880 The operation is not affected by the context.
4881 """
4882 return a.to_eng_string(context=self)
4883
4884 def to_sci_string(self, a):
4885 """Converts a number to a string, using scientific notation.
4886
4887 The operation is not affected by the context.
4888 """
4889 return a.__str__(context=self)
4890
Facundo Batista353750c2007-09-13 18:13:15 +00004891 def to_integral_exact(self, a):
4892 """Rounds to an integer.
4893
4894 When the operand has a negative exponent, the result is the same
4895 as using the quantize() operation using the given operand as the
4896 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
4897 of the operand as the precision setting; Inexact and Rounded flags
4898 are allowed in this operation. The rounding mode is taken from the
4899 context.
4900
4901 >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004902 Decimal('2')
Facundo Batista353750c2007-09-13 18:13:15 +00004903 >>> ExtendedContext.to_integral_exact(Decimal('100'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004904 Decimal('100')
Facundo Batista353750c2007-09-13 18:13:15 +00004905 >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004906 Decimal('100')
Facundo Batista353750c2007-09-13 18:13:15 +00004907 >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004908 Decimal('102')
Facundo Batista353750c2007-09-13 18:13:15 +00004909 >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004910 Decimal('-102')
Facundo Batista353750c2007-09-13 18:13:15 +00004911 >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004912 Decimal('1.0E+6')
Facundo Batista353750c2007-09-13 18:13:15 +00004913 >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004914 Decimal('7.89E+77')
Facundo Batista353750c2007-09-13 18:13:15 +00004915 >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004916 Decimal('-Infinity')
Facundo Batista353750c2007-09-13 18:13:15 +00004917 """
4918 return a.to_integral_exact(context=self)
4919
4920 def to_integral_value(self, a):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004921 """Rounds to an integer.
4922
4923 When the operand has a negative exponent, the result is the same
4924 as using the quantize() operation using the given operand as the
4925 left-hand-operand, 1E+0 as the right-hand-operand, and the precision
4926 of the operand as the precision setting, except that no flags will
Facundo Batista59c58842007-04-10 12:58:45 +00004927 be set. The rounding mode is taken from the context.
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004928
Facundo Batista353750c2007-09-13 18:13:15 +00004929 >>> ExtendedContext.to_integral_value(Decimal('2.1'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004930 Decimal('2')
Facundo Batista353750c2007-09-13 18:13:15 +00004931 >>> ExtendedContext.to_integral_value(Decimal('100'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004932 Decimal('100')
Facundo Batista353750c2007-09-13 18:13:15 +00004933 >>> ExtendedContext.to_integral_value(Decimal('100.0'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004934 Decimal('100')
Facundo Batista353750c2007-09-13 18:13:15 +00004935 >>> ExtendedContext.to_integral_value(Decimal('101.5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004936 Decimal('102')
Facundo Batista353750c2007-09-13 18:13:15 +00004937 >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004938 Decimal('-102')
Facundo Batista353750c2007-09-13 18:13:15 +00004939 >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004940 Decimal('1.0E+6')
Facundo Batista353750c2007-09-13 18:13:15 +00004941 >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004942 Decimal('7.89E+77')
Facundo Batista353750c2007-09-13 18:13:15 +00004943 >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
Raymond Hettingerabe32372008-02-14 02:41:22 +00004944 Decimal('-Infinity')
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004945 """
Facundo Batista353750c2007-09-13 18:13:15 +00004946 return a.to_integral_value(context=self)
4947
4948 # the method name changed, but we provide also the old one, for compatibility
4949 to_integral = to_integral_value
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004950
4951class _WorkRep(object):
4952 __slots__ = ('sign','int','exp')
Raymond Hettinger17931de2004-10-27 06:21:46 +00004953 # sign: 0 or 1
Raymond Hettinger636a6b12004-09-19 01:54:09 +00004954 # int: int or long
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004955 # exp: None, int, or string
4956
4957 def __init__(self, value=None):
4958 if value is None:
4959 self.sign = None
Raymond Hettinger636a6b12004-09-19 01:54:09 +00004960 self.int = 0
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004961 self.exp = None
Raymond Hettinger17931de2004-10-27 06:21:46 +00004962 elif isinstance(value, Decimal):
4963 self.sign = value._sign
Facundo Batista72bc54f2007-11-23 17:59:00 +00004964 self.int = int(value._int)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004965 self.exp = value._exp
Raymond Hettinger17931de2004-10-27 06:21:46 +00004966 else:
4967 # assert isinstance(value, tuple)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004968 self.sign = value[0]
4969 self.int = value[1]
4970 self.exp = value[2]
4971
4972 def __repr__(self):
4973 return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
4974
4975 __str__ = __repr__
4976
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004977
4978
Facundo Batistae64acfa2007-12-17 14:18:42 +00004979def _normalize(op1, op2, prec = 0):
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004980 """Normalizes op1, op2 to have the same exp and length of coefficient.
4981
4982 Done during addition.
4983 """
Facundo Batista353750c2007-09-13 18:13:15 +00004984 if op1.exp < op2.exp:
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00004985 tmp = op2
4986 other = op1
4987 else:
4988 tmp = op1
4989 other = op2
4990
Facundo Batista353750c2007-09-13 18:13:15 +00004991 # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
4992 # Then adding 10**exp to tmp has the same effect (after rounding)
4993 # as adding any positive quantity smaller than 10**exp; similarly
4994 # for subtraction. So if other is smaller than 10**exp we replace
4995 # it with 10**exp. This avoids tmp.exp - other.exp getting too large.
Facundo Batistae64acfa2007-12-17 14:18:42 +00004996 tmp_len = len(str(tmp.int))
4997 other_len = len(str(other.int))
4998 exp = tmp.exp + min(-1, tmp_len - prec - 2)
4999 if other_len + other.exp - 1 < exp:
5000 other.int = 1
5001 other.exp = exp
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005002
Facundo Batista353750c2007-09-13 18:13:15 +00005003 tmp.int *= 10 ** (tmp.exp - other.exp)
5004 tmp.exp = other.exp
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005005 return op1, op2
5006
Facundo Batista353750c2007-09-13 18:13:15 +00005007##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
5008
5009# This function from Tim Peters was taken from here:
5010# http://mail.python.org/pipermail/python-list/1999-July/007758.html
5011# The correction being in the function definition is for speed, and
5012# the whole function is not resolved with math.log because of avoiding
5013# the use of floats.
5014def _nbits(n, correction = {
5015 '0': 4, '1': 3, '2': 2, '3': 2,
5016 '4': 1, '5': 1, '6': 1, '7': 1,
5017 '8': 0, '9': 0, 'a': 0, 'b': 0,
5018 'c': 0, 'd': 0, 'e': 0, 'f': 0}):
5019 """Number of bits in binary representation of the positive integer n,
5020 or 0 if n == 0.
5021 """
5022 if n < 0:
5023 raise ValueError("The argument to _nbits should be nonnegative.")
5024 hex_n = "%x" % n
5025 return 4*len(hex_n) - correction[hex_n[0]]
5026
5027def _sqrt_nearest(n, a):
5028 """Closest integer to the square root of the positive integer n. a is
5029 an initial approximation to the square root. Any positive integer
5030 will do for a, but the closer a is to the square root of n the
5031 faster convergence will be.
5032
5033 """
5034 if n <= 0 or a <= 0:
5035 raise ValueError("Both arguments to _sqrt_nearest should be positive.")
5036
5037 b=0
5038 while a != b:
5039 b, a = a, a--n//a>>1
5040 return a
5041
5042def _rshift_nearest(x, shift):
5043 """Given an integer x and a nonnegative integer shift, return closest
5044 integer to x / 2**shift; use round-to-even in case of a tie.
5045
5046 """
5047 b, q = 1L << shift, x >> shift
5048 return q + (2*(x & (b-1)) + (q&1) > b)
5049
5050def _div_nearest(a, b):
5051 """Closest integer to a/b, a and b positive integers; rounds to even
5052 in the case of a tie.
5053
5054 """
5055 q, r = divmod(a, b)
5056 return q + (2*r + (q&1) > b)
5057
5058def _ilog(x, M, L = 8):
5059 """Integer approximation to M*log(x/M), with absolute error boundable
5060 in terms only of x/M.
5061
5062 Given positive integers x and M, return an integer approximation to
5063 M * log(x/M). For L = 8 and 0.1 <= x/M <= 10 the difference
5064 between the approximation and the exact result is at most 22. For
5065 L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15. In
5066 both cases these are upper bounds on the error; it will usually be
5067 much smaller."""
5068
5069 # The basic algorithm is the following: let log1p be the function
5070 # log1p(x) = log(1+x). Then log(x/M) = log1p((x-M)/M). We use
5071 # the reduction
5072 #
5073 # log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
5074 #
5075 # repeatedly until the argument to log1p is small (< 2**-L in
5076 # absolute value). For small y we can use the Taylor series
5077 # expansion
5078 #
5079 # log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
5080 #
5081 # truncating at T such that y**T is small enough. The whole
5082 # computation is carried out in a form of fixed-point arithmetic,
5083 # with a real number z being represented by an integer
5084 # approximation to z*M. To avoid loss of precision, the y below
5085 # is actually an integer approximation to 2**R*y*M, where R is the
5086 # number of reductions performed so far.
5087
5088 y = x-M
5089 # argument reduction; R = number of reductions performed
5090 R = 0
5091 while (R <= L and long(abs(y)) << L-R >= M or
5092 R > L and abs(y) >> R-L >= M):
5093 y = _div_nearest(long(M*y) << 1,
5094 M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
5095 R += 1
5096
5097 # Taylor series with T terms
5098 T = -int(-10*len(str(M))//(3*L))
5099 yshift = _rshift_nearest(y, R)
5100 w = _div_nearest(M, T)
5101 for k in xrange(T-1, 0, -1):
5102 w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
5103
5104 return _div_nearest(w*y, M)
5105
5106def _dlog10(c, e, p):
5107 """Given integers c, e and p with c > 0, p >= 0, compute an integer
5108 approximation to 10**p * log10(c*10**e), with an absolute error of
5109 at most 1. Assumes that c*10**e is not exactly 1."""
5110
5111 # increase precision by 2; compensate for this by dividing
5112 # final result by 100
5113 p += 2
5114
5115 # write c*10**e as d*10**f with either:
5116 # f >= 0 and 1 <= d <= 10, or
5117 # f <= 0 and 0.1 <= d <= 1.
5118 # Thus for c*10**e close to 1, f = 0
5119 l = len(str(c))
5120 f = e+l - (e+l >= 1)
5121
5122 if p > 0:
5123 M = 10**p
5124 k = e+p-f
5125 if k >= 0:
5126 c *= 10**k
5127 else:
5128 c = _div_nearest(c, 10**-k)
5129
5130 log_d = _ilog(c, M) # error < 5 + 22 = 27
Facundo Batistabe6c7ba2007-10-02 18:21:18 +00005131 log_10 = _log10_digits(p) # error < 1
Facundo Batista353750c2007-09-13 18:13:15 +00005132 log_d = _div_nearest(log_d*M, log_10)
5133 log_tenpower = f*M # exact
5134 else:
5135 log_d = 0 # error < 2.31
Neal Norwitz18aa3882008-08-24 05:04:52 +00005136 log_tenpower = _div_nearest(f, 10**-p) # error < 0.5
Facundo Batista353750c2007-09-13 18:13:15 +00005137
5138 return _div_nearest(log_tenpower+log_d, 100)
5139
5140def _dlog(c, e, p):
5141 """Given integers c, e and p with c > 0, compute an integer
5142 approximation to 10**p * log(c*10**e), with an absolute error of
5143 at most 1. Assumes that c*10**e is not exactly 1."""
5144
5145 # Increase precision by 2. The precision increase is compensated
5146 # for at the end with a division by 100.
5147 p += 2
5148
5149 # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
5150 # or f <= 0 and 0.1 <= d <= 1. Then we can compute 10**p * log(c*10**e)
5151 # as 10**p * log(d) + 10**p*f * log(10).
5152 l = len(str(c))
5153 f = e+l - (e+l >= 1)
5154
5155 # compute approximation to 10**p*log(d), with error < 27
5156 if p > 0:
5157 k = e+p-f
5158 if k >= 0:
5159 c *= 10**k
5160 else:
5161 c = _div_nearest(c, 10**-k) # error of <= 0.5 in c
5162
5163 # _ilog magnifies existing error in c by a factor of at most 10
5164 log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
5165 else:
5166 # p <= 0: just approximate the whole thing by 0; error < 2.31
5167 log_d = 0
5168
Facundo Batistabe6c7ba2007-10-02 18:21:18 +00005169 # compute approximation to f*10**p*log(10), with error < 11.
Facundo Batista353750c2007-09-13 18:13:15 +00005170 if f:
Facundo Batistabe6c7ba2007-10-02 18:21:18 +00005171 extra = len(str(abs(f)))-1
5172 if p + extra >= 0:
5173 # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
5174 # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
5175 f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
Facundo Batista353750c2007-09-13 18:13:15 +00005176 else:
5177 f_log_ten = 0
5178 else:
5179 f_log_ten = 0
5180
Facundo Batistabe6c7ba2007-10-02 18:21:18 +00005181 # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
Facundo Batista353750c2007-09-13 18:13:15 +00005182 return _div_nearest(f_log_ten + log_d, 100)
5183
Facundo Batistabe6c7ba2007-10-02 18:21:18 +00005184class _Log10Memoize(object):
5185 """Class to compute, store, and allow retrieval of, digits of the
5186 constant log(10) = 2.302585.... This constant is needed by
5187 Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
5188 def __init__(self):
5189 self.digits = "23025850929940456840179914546843642076011014886"
5190
5191 def getdigits(self, p):
5192 """Given an integer p >= 0, return floor(10**p)*log(10).
5193
5194 For example, self.getdigits(3) returns 2302.
5195 """
5196 # digits are stored as a string, for quick conversion to
5197 # integer in the case that we've already computed enough
5198 # digits; the stored digits should always be correct
5199 # (truncated, not rounded to nearest).
5200 if p < 0:
5201 raise ValueError("p should be nonnegative")
5202
5203 if p >= len(self.digits):
5204 # compute p+3, p+6, p+9, ... digits; continue until at
5205 # least one of the extra digits is nonzero
5206 extra = 3
5207 while True:
5208 # compute p+extra digits, correct to within 1ulp
5209 M = 10**(p+extra+2)
5210 digits = str(_div_nearest(_ilog(10*M, M), 100))
5211 if digits[-extra:] != '0'*extra:
5212 break
5213 extra += 3
5214 # keep all reliable digits so far; remove trailing zeros
5215 # and next nonzero digit
5216 self.digits = digits.rstrip('0')[:-1]
5217 return int(self.digits[:p+1])
5218
5219_log10_digits = _Log10Memoize().getdigits
5220
Facundo Batista353750c2007-09-13 18:13:15 +00005221def _iexp(x, M, L=8):
5222 """Given integers x and M, M > 0, such that x/M is small in absolute
5223 value, compute an integer approximation to M*exp(x/M). For 0 <=
5224 x/M <= 2.4, the absolute error in the result is bounded by 60 (and
5225 is usually much smaller)."""
5226
5227 # Algorithm: to compute exp(z) for a real number z, first divide z
5228 # by a suitable power R of 2 so that |z/2**R| < 2**-L. Then
5229 # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
5230 # series
5231 #
5232 # expm1(x) = x + x**2/2! + x**3/3! + ...
5233 #
5234 # Now use the identity
5235 #
5236 # expm1(2x) = expm1(x)*(expm1(x)+2)
5237 #
5238 # R times to compute the sequence expm1(z/2**R),
5239 # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
5240
5241 # Find R such that x/2**R/M <= 2**-L
5242 R = _nbits((long(x)<<L)//M)
5243
5244 # Taylor series. (2**L)**T > M
5245 T = -int(-10*len(str(M))//(3*L))
5246 y = _div_nearest(x, T)
5247 Mshift = long(M)<<R
5248 for i in xrange(T-1, 0, -1):
5249 y = _div_nearest(x*(Mshift + y), Mshift * i)
5250
5251 # Expansion
5252 for k in xrange(R-1, -1, -1):
5253 Mshift = long(M)<<(k+2)
5254 y = _div_nearest(y*(y+Mshift), Mshift)
5255
5256 return M+y
5257
5258def _dexp(c, e, p):
5259 """Compute an approximation to exp(c*10**e), with p decimal places of
5260 precision.
5261
Facundo Batistabe6c7ba2007-10-02 18:21:18 +00005262 Returns integers d, f such that:
Facundo Batista353750c2007-09-13 18:13:15 +00005263
5264 10**(p-1) <= d <= 10**p, and
5265 (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
5266
5267 In other words, d*10**f is an approximation to exp(c*10**e) with p
5268 digits of precision, and with an error in d of at most 1. This is
5269 almost, but not quite, the same as the error being < 1ulp: when d
5270 = 10**(p-1) the error could be up to 10 ulp."""
5271
5272 # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
5273 p += 2
5274
Facundo Batistabe6c7ba2007-10-02 18:21:18 +00005275 # compute log(10) with extra precision = adjusted exponent of c*10**e
Facundo Batista353750c2007-09-13 18:13:15 +00005276 extra = max(0, e + len(str(c)) - 1)
5277 q = p + extra
Facundo Batista353750c2007-09-13 18:13:15 +00005278
Facundo Batistabe6c7ba2007-10-02 18:21:18 +00005279 # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
Facundo Batista353750c2007-09-13 18:13:15 +00005280 # rounding down
5281 shift = e+q
5282 if shift >= 0:
5283 cshift = c*10**shift
5284 else:
5285 cshift = c//10**-shift
Facundo Batistabe6c7ba2007-10-02 18:21:18 +00005286 quot, rem = divmod(cshift, _log10_digits(q))
Facundo Batista353750c2007-09-13 18:13:15 +00005287
5288 # reduce remainder back to original precision
5289 rem = _div_nearest(rem, 10**extra)
5290
5291 # error in result of _iexp < 120; error after division < 0.62
5292 return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
5293
5294def _dpower(xc, xe, yc, ye, p):
5295 """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
5296 y = yc*10**ye, compute x**y. Returns a pair of integers (c, e) such that:
5297
5298 10**(p-1) <= c <= 10**p, and
5299 (c-1)*10**e < x**y < (c+1)*10**e
5300
5301 in other words, c*10**e is an approximation to x**y with p digits
5302 of precision, and with an error in c of at most 1. (This is
5303 almost, but not quite, the same as the error being < 1ulp: when c
5304 == 10**(p-1) we can only guarantee error < 10ulp.)
5305
5306 We assume that: x is positive and not equal to 1, and y is nonzero.
5307 """
5308
5309 # Find b such that 10**(b-1) <= |y| <= 10**b
5310 b = len(str(abs(yc))) + ye
5311
5312 # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
5313 lxc = _dlog(xc, xe, p+b+1)
5314
5315 # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
5316 shift = ye-b
5317 if shift >= 0:
5318 pc = lxc*yc*10**shift
5319 else:
5320 pc = _div_nearest(lxc*yc, 10**-shift)
5321
5322 if pc == 0:
5323 # we prefer a result that isn't exactly 1; this makes it
5324 # easier to compute a correctly rounded result in __pow__
5325 if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
5326 coeff, exp = 10**(p-1)+1, 1-p
5327 else:
5328 coeff, exp = 10**p-1, -p
5329 else:
5330 coeff, exp = _dexp(pc, -(p+1), p+1)
5331 coeff = _div_nearest(coeff, 10)
5332 exp += 1
5333
5334 return coeff, exp
5335
5336def _log10_lb(c, correction = {
5337 '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
5338 '6': 23, '7': 16, '8': 10, '9': 5}):
5339 """Compute a lower bound for 100*log10(c) for a positive integer c."""
5340 if c <= 0:
5341 raise ValueError("The argument to _log10_lb should be nonnegative.")
5342 str_c = str(c)
5343 return 100*len(str_c) - correction[str_c[0]]
5344
Facundo Batista59c58842007-04-10 12:58:45 +00005345##### Helper Functions ####################################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005346
Facundo Batista353750c2007-09-13 18:13:15 +00005347def _convert_other(other, raiseit=False):
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005348 """Convert other to Decimal.
5349
5350 Verifies that it's ok to use in an implicit construction.
5351 """
5352 if isinstance(other, Decimal):
5353 return other
5354 if isinstance(other, (int, long)):
5355 return Decimal(other)
Facundo Batista353750c2007-09-13 18:13:15 +00005356 if raiseit:
5357 raise TypeError("Unable to convert %s to Decimal" % other)
Raymond Hettinger267b8682005-03-27 10:47:39 +00005358 return NotImplemented
Raymond Hettinger636a6b12004-09-19 01:54:09 +00005359
Facundo Batista59c58842007-04-10 12:58:45 +00005360##### Setup Specific Contexts ############################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005361
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005362# The default context prototype used by Context()
Raymond Hettingerfed52962004-07-14 15:41:57 +00005363# Is mutable, so that new contexts can have different default values
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005364
5365DefaultContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005366 prec=28, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005367 traps=[DivisionByZero, Overflow, InvalidOperation],
5368 flags=[],
Raymond Hettinger99148e72004-07-14 19:56:56 +00005369 Emax=999999999,
5370 Emin=-999999999,
Raymond Hettingere0f15812004-07-05 05:36:39 +00005371 capitals=1
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005372)
5373
5374# Pre-made alternate contexts offered by the specification
5375# Don't change these; the user should be able to select these
5376# contexts and be able to reproduce results from other implementations
5377# of the spec.
5378
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005379BasicContext = Context(
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005380 prec=9, rounding=ROUND_HALF_UP,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005381 traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
5382 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005383)
5384
Raymond Hettinger9ec3e3b2004-07-03 13:48:56 +00005385ExtendedContext = Context(
Raymond Hettinger6ea48452004-07-03 12:26:21 +00005386 prec=9, rounding=ROUND_HALF_EVEN,
Raymond Hettingerbf440692004-07-10 14:14:37 +00005387 traps=[],
5388 flags=[],
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005389)
5390
5391
Facundo Batista72bc54f2007-11-23 17:59:00 +00005392##### crud for parsing strings #############################################
Mark Dickinson6a123cb2008-02-24 18:12:36 +00005393#
Facundo Batista72bc54f2007-11-23 17:59:00 +00005394# Regular expression used for parsing numeric strings. Additional
5395# comments:
5396#
5397# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
5398# whitespace. But note that the specification disallows whitespace in
5399# a numeric string.
5400#
5401# 2. For finite numbers (not infinities and NaNs) the body of the
5402# number between the optional sign and the optional exponent must have
5403# at least one decimal digit, possibly after the decimal point. The
5404# lookahead expression '(?=\d|\.\d)' checks this.
5405#
5406# As the flag UNICODE is not enabled here, we're explicitly avoiding any
5407# other meaning for \d than the numbers [0-9].
5408
5409import re
Mark Dickinson70c32892008-07-02 09:37:01 +00005410_parser = re.compile(r""" # A numeric string consists of:
Facundo Batista72bc54f2007-11-23 17:59:00 +00005411# \s*
Mark Dickinson70c32892008-07-02 09:37:01 +00005412 (?P<sign>[-+])? # an optional sign, followed by either...
Facundo Batista72bc54f2007-11-23 17:59:00 +00005413 (
Mark Dickinson70c32892008-07-02 09:37:01 +00005414 (?=[0-9]|\.[0-9]) # ...a number (with at least one digit)
5415 (?P<int>[0-9]*) # having a (possibly empty) integer part
5416 (\.(?P<frac>[0-9]*))? # followed by an optional fractional part
5417 (E(?P<exp>[-+]?[0-9]+))? # followed by an optional exponent, or...
Facundo Batista72bc54f2007-11-23 17:59:00 +00005418 |
Mark Dickinson70c32892008-07-02 09:37:01 +00005419 Inf(inity)? # ...an infinity, or...
Facundo Batista72bc54f2007-11-23 17:59:00 +00005420 |
Mark Dickinson70c32892008-07-02 09:37:01 +00005421 (?P<signal>s)? # ...an (optionally signaling)
5422 NaN # NaN
5423 (?P<diag>[0-9]*) # with (possibly empty) diagnostic info.
Facundo Batista72bc54f2007-11-23 17:59:00 +00005424 )
5425# \s*
Mark Dickinson59bc20b2008-01-12 01:56:00 +00005426 \Z
Facundo Batista72bc54f2007-11-23 17:59:00 +00005427""", re.VERBOSE | re.IGNORECASE).match
5428
Facundo Batista2ec74152007-12-03 17:55:00 +00005429_all_zeros = re.compile('0*$').match
5430_exact_half = re.compile('50*$').match
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005431
5432##### PEP3101 support functions ##############################################
Mark Dickinson277859d2009-03-17 23:03:46 +00005433# The functions in this section have little to do with the Decimal
5434# class, and could potentially be reused or adapted for other pure
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005435# Python numeric classes that want to implement __format__
5436#
5437# A format specifier for Decimal looks like:
5438#
Mark Dickinson277859d2009-03-17 23:03:46 +00005439# [[fill]align][sign][0][minimumwidth][,][.precision][type]
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005440
5441_parse_format_specifier_regex = re.compile(r"""\A
5442(?:
5443 (?P<fill>.)?
5444 (?P<align>[<>=^])
5445)?
5446(?P<sign>[-+ ])?
5447(?P<zeropad>0)?
5448(?P<minimumwidth>(?!0)\d+)?
Mark Dickinson277859d2009-03-17 23:03:46 +00005449(?P<thousands_sep>,)?
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005450(?:\.(?P<precision>0|(?!0)\d+))?
Mark Dickinson277859d2009-03-17 23:03:46 +00005451(?P<type>[eEfFgGn%])?
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005452\Z
5453""", re.VERBOSE)
5454
Facundo Batista72bc54f2007-11-23 17:59:00 +00005455del re
5456
Mark Dickinson277859d2009-03-17 23:03:46 +00005457# The locale module is only needed for the 'n' format specifier. The
5458# rest of the PEP 3101 code functions quite happily without it, so we
5459# don't care too much if locale isn't present.
5460try:
5461 import locale as _locale
5462except ImportError:
5463 pass
5464
5465def _parse_format_specifier(format_spec, _localeconv=None):
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005466 """Parse and validate a format specifier.
5467
5468 Turns a standard numeric format specifier into a dict, with the
5469 following entries:
5470
5471 fill: fill character to pad field to minimum width
5472 align: alignment type, either '<', '>', '=' or '^'
5473 sign: either '+', '-' or ' '
5474 minimumwidth: nonnegative integer giving minimum width
Mark Dickinson277859d2009-03-17 23:03:46 +00005475 zeropad: boolean, indicating whether to pad with zeros
5476 thousands_sep: string to use as thousands separator, or ''
5477 grouping: grouping for thousands separators, in format
5478 used by localeconv
5479 decimal_point: string to use for decimal point
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005480 precision: nonnegative integer giving precision, or None
5481 type: one of the characters 'eEfFgG%', or None
Mark Dickinson277859d2009-03-17 23:03:46 +00005482 unicode: boolean (always True for Python 3.x)
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005483
5484 """
5485 m = _parse_format_specifier_regex.match(format_spec)
5486 if m is None:
5487 raise ValueError("Invalid format specifier: " + format_spec)
5488
5489 # get the dictionary
5490 format_dict = m.groupdict()
5491
Mark Dickinson277859d2009-03-17 23:03:46 +00005492 # zeropad; defaults for fill and alignment. If zero padding
5493 # is requested, the fill and align fields should be absent.
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005494 fill = format_dict['fill']
5495 align = format_dict['align']
Mark Dickinson277859d2009-03-17 23:03:46 +00005496 format_dict['zeropad'] = (format_dict['zeropad'] is not None)
5497 if format_dict['zeropad']:
5498 if fill is not None:
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005499 raise ValueError("Fill character conflicts with '0'"
5500 " in format specifier: " + format_spec)
Mark Dickinson277859d2009-03-17 23:03:46 +00005501 if align is not None:
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005502 raise ValueError("Alignment conflicts with '0' in "
5503 "format specifier: " + format_spec)
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005504 format_dict['fill'] = fill or ' '
5505 format_dict['align'] = align or '<'
5506
Mark Dickinson277859d2009-03-17 23:03:46 +00005507 # default sign handling: '-' for negative, '' for positive
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005508 if format_dict['sign'] is None:
5509 format_dict['sign'] = '-'
5510
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005511 # minimumwidth defaults to 0; precision remains None if not given
5512 format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
5513 if format_dict['precision'] is not None:
5514 format_dict['precision'] = int(format_dict['precision'])
5515
5516 # if format type is 'g' or 'G' then a precision of 0 makes little
5517 # sense; convert it to 1. Same if format type is unspecified.
5518 if format_dict['precision'] == 0:
5519 if format_dict['type'] in 'gG' or format_dict['type'] is None:
5520 format_dict['precision'] = 1
5521
Mark Dickinson277859d2009-03-17 23:03:46 +00005522 # determine thousands separator, grouping, and decimal separator, and
5523 # add appropriate entries to format_dict
5524 if format_dict['type'] == 'n':
5525 # apart from separators, 'n' behaves just like 'g'
5526 format_dict['type'] = 'g'
5527 if _localeconv is None:
5528 _localeconv = _locale.localeconv()
5529 if format_dict['thousands_sep'] is not None:
5530 raise ValueError("Explicit thousands separator conflicts with "
5531 "'n' type in format specifier: " + format_spec)
5532 format_dict['thousands_sep'] = _localeconv['thousands_sep']
5533 format_dict['grouping'] = _localeconv['grouping']
5534 format_dict['decimal_point'] = _localeconv['decimal_point']
5535 else:
5536 if format_dict['thousands_sep'] is None:
5537 format_dict['thousands_sep'] = ''
5538 format_dict['grouping'] = [3, 0]
5539 format_dict['decimal_point'] = '.'
5540
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005541 # record whether return type should be str or unicode
5542 format_dict['unicode'] = isinstance(format_spec, unicode)
5543
5544 return format_dict
5545
Mark Dickinson277859d2009-03-17 23:03:46 +00005546def _format_align(sign, body, spec):
5547 """Given an unpadded, non-aligned numeric string 'body' and sign
5548 string 'sign', add padding and aligment conforming to the given
5549 format specifier dictionary 'spec' (as produced by
5550 parse_format_specifier).
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005551
Mark Dickinson277859d2009-03-17 23:03:46 +00005552 Also converts result to unicode if necessary.
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005553
5554 """
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005555 # how much extra space do we have to play with?
Mark Dickinson277859d2009-03-17 23:03:46 +00005556 minimumwidth = spec['minimumwidth']
5557 fill = spec['fill']
5558 padding = fill*(minimumwidth - len(sign) - len(body))
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005559
Mark Dickinson277859d2009-03-17 23:03:46 +00005560 align = spec['align']
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005561 if align == '<':
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005562 result = sign + body + padding
Mark Dickinsonb065e522009-03-17 18:01:03 +00005563 elif align == '>':
5564 result = padding + sign + body
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005565 elif align == '=':
5566 result = sign + padding + body
Mark Dickinson277859d2009-03-17 23:03:46 +00005567 elif align == '^':
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005568 half = len(padding)//2
5569 result = padding[:half] + sign + body + padding[half:]
Mark Dickinson277859d2009-03-17 23:03:46 +00005570 else:
5571 raise ValueError('Unrecognised alignment field')
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005572
5573 # make sure that result is unicode if necessary
Mark Dickinson277859d2009-03-17 23:03:46 +00005574 if spec['unicode']:
Mark Dickinson1ddf1d82008-02-29 02:16:37 +00005575 result = unicode(result)
5576
5577 return result
Facundo Batista72bc54f2007-11-23 17:59:00 +00005578
Mark Dickinson277859d2009-03-17 23:03:46 +00005579def _group_lengths(grouping):
5580 """Convert a localeconv-style grouping into a (possibly infinite)
5581 iterable of integers representing group lengths.
5582
5583 """
5584 # The result from localeconv()['grouping'], and the input to this
5585 # function, should be a list of integers in one of the
5586 # following three forms:
5587 #
5588 # (1) an empty list, or
5589 # (2) nonempty list of positive integers + [0]
5590 # (3) list of positive integers + [locale.CHAR_MAX], or
5591
5592 from itertools import chain, repeat
5593 if not grouping:
5594 return []
5595 elif grouping[-1] == 0 and len(grouping) >= 2:
5596 return chain(grouping[:-1], repeat(grouping[-2]))
5597 elif grouping[-1] == _locale.CHAR_MAX:
5598 return grouping[:-1]
5599 else:
5600 raise ValueError('unrecognised format for grouping')
5601
5602def _insert_thousands_sep(digits, spec, min_width=1):
5603 """Insert thousands separators into a digit string.
5604
5605 spec is a dictionary whose keys should include 'thousands_sep' and
5606 'grouping'; typically it's the result of parsing the format
5607 specifier using _parse_format_specifier.
5608
5609 The min_width keyword argument gives the minimum length of the
5610 result, which will be padded on the left with zeros if necessary.
5611
5612 If necessary, the zero padding adds an extra '0' on the left to
5613 avoid a leading thousands separator. For example, inserting
5614 commas every three digits in '123456', with min_width=8, gives
5615 '0,123,456', even though that has length 9.
5616
5617 """
5618
5619 sep = spec['thousands_sep']
5620 grouping = spec['grouping']
5621
5622 groups = []
5623 for l in _group_lengths(grouping):
Mark Dickinson277859d2009-03-17 23:03:46 +00005624 if l <= 0:
5625 raise ValueError("group length should be positive")
5626 # max(..., 1) forces at least 1 digit to the left of a separator
5627 l = min(max(len(digits), min_width, 1), l)
5628 groups.append('0'*(l - len(digits)) + digits[-l:])
5629 digits = digits[:-l]
5630 min_width -= l
5631 if not digits and min_width <= 0:
5632 break
Mark Dickinsonb14514a2009-03-18 08:22:51 +00005633 min_width -= len(sep)
Mark Dickinson277859d2009-03-17 23:03:46 +00005634 else:
5635 l = max(len(digits), min_width, 1)
5636 groups.append('0'*(l - len(digits)) + digits[-l:])
5637 return sep.join(reversed(groups))
5638
5639def _format_sign(is_negative, spec):
5640 """Determine sign character."""
5641
5642 if is_negative:
5643 return '-'
5644 elif spec['sign'] in ' +':
5645 return spec['sign']
5646 else:
5647 return ''
5648
5649def _format_number(is_negative, intpart, fracpart, exp, spec):
5650 """Format a number, given the following data:
5651
5652 is_negative: true if the number is negative, else false
5653 intpart: string of digits that must appear before the decimal point
5654 fracpart: string of digits that must come after the point
5655 exp: exponent, as an integer
5656 spec: dictionary resulting from parsing the format specifier
5657
5658 This function uses the information in spec to:
5659 insert separators (decimal separator and thousands separators)
5660 format the sign
5661 format the exponent
5662 add trailing '%' for the '%' type
5663 zero-pad if necessary
5664 fill and align if necessary
5665 """
5666
5667 sign = _format_sign(is_negative, spec)
5668
5669 if fracpart:
5670 fracpart = spec['decimal_point'] + fracpart
5671
5672 if exp != 0 or spec['type'] in 'eE':
5673 echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
5674 fracpart += "{0}{1:+}".format(echar, exp)
5675 if spec['type'] == '%':
5676 fracpart += '%'
5677
5678 if spec['zeropad']:
5679 min_width = spec['minimumwidth'] - len(fracpart) - len(sign)
5680 else:
5681 min_width = 0
5682 intpart = _insert_thousands_sep(intpart, spec, min_width)
5683
5684 return _format_align(sign, intpart+fracpart, spec)
5685
5686
Facundo Batista59c58842007-04-10 12:58:45 +00005687##### Useful Constants (internal use only) ################################
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005688
Facundo Batista59c58842007-04-10 12:58:45 +00005689# Reusable defaults
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00005690_Infinity = Decimal('Inf')
5691_NegativeInfinity = Decimal('-Inf')
Mark Dickinsonc5de0962009-01-02 23:07:08 +00005692_NaN = Decimal('NaN')
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00005693_Zero = Decimal(0)
5694_One = Decimal(1)
5695_NegativeOne = Decimal(-1)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005696
Raymond Hettingerb7e835b2009-01-03 19:08:10 +00005697# _SignedInfinity[sign] is infinity w/ that sign
5698_SignedInfinity = (_Infinity, _NegativeInfinity)
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005699
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005700
Raymond Hettinger7c85fa42004-07-01 11:01:35 +00005701
5702if __name__ == '__main__':
5703 import doctest, sys
5704 doctest.testmod(sys.modules[__name__])