~ubuntu-branches/ubuntu/maverick/python3.1/maverick

« back to all changes in this revision

Viewing changes to Lib/decimal.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-03-23 00:01:27 UTC
  • Revision ID: james.westby@ubuntu.com-20090323000127-5fstfxju4ufrhthq
Tags: upstream-3.1~a1+20090322
ImportĀ upstreamĀ versionĀ 3.1~a1+20090322

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# 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>
 
7
#    and Aahz <aahz at pobox.com>
 
8
#    and Tim Peters
 
9
 
 
10
# This module should be kept in sync with the latest updates of the
 
11
# IBM specification as it evolves.  Those updates will be treated
 
12
# as bug fixes (deviation from the spec is a compatibility, usability
 
13
# bug) and will be backported.  At this point the spec is stabilizing
 
14
# and the updates are becoming fewer, smaller, and less significant.
 
15
 
 
16
"""
 
17
This is an implementation of decimal floating point arithmetic based on
 
18
the General Decimal Arithmetic Specification:
 
19
 
 
20
    www2.hursley.ibm.com/decimal/decarith.html
 
21
 
 
22
and IEEE standard 854-1987:
 
23
 
 
24
    www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
 
25
 
 
26
Decimal floating point has finite precision with arbitrarily large bounds.
 
27
 
 
28
The purpose of this module is to support arithmetic using familiar
 
29
"schoolhouse" rules and to avoid some of the tricky representation
 
30
issues associated with binary floating point.  The package is especially
 
31
useful for financial applications or for contexts where users have
 
32
expectations that are at odds with binary floating point (for instance,
 
33
in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
 
34
of the expected Decimal('0.00') returned by decimal floating point).
 
35
 
 
36
Here are some examples of using the decimal module:
 
37
 
 
38
>>> from decimal import *
 
39
>>> setcontext(ExtendedContext)
 
40
>>> Decimal(0)
 
41
Decimal('0')
 
42
>>> Decimal('1')
 
43
Decimal('1')
 
44
>>> Decimal('-.0123')
 
45
Decimal('-0.0123')
 
46
>>> Decimal(123456)
 
47
Decimal('123456')
 
48
>>> Decimal('123.45e12345678901234567890')
 
49
Decimal('1.2345E+12345678901234567892')
 
50
>>> Decimal('1.33') + Decimal('1.27')
 
51
Decimal('2.60')
 
52
>>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41')
 
53
Decimal('-2.20')
 
54
>>> dig = Decimal(1)
 
55
>>> print(dig / Decimal(3))
 
56
0.333333333
 
57
>>> getcontext().prec = 18
 
58
>>> print(dig / Decimal(3))
 
59
0.333333333333333333
 
60
>>> print(dig.sqrt())
 
61
1
 
62
>>> print(Decimal(3).sqrt())
 
63
1.73205080756887729
 
64
>>> print(Decimal(3) ** 123)
 
65
4.85192780976896427E+58
 
66
>>> inf = Decimal(1) / Decimal(0)
 
67
>>> print(inf)
 
68
Infinity
 
69
>>> neginf = Decimal(-1) / Decimal(0)
 
70
>>> print(neginf)
 
71
-Infinity
 
72
>>> print(neginf + inf)
 
73
NaN
 
74
>>> print(neginf * inf)
 
75
-Infinity
 
76
>>> print(dig / 0)
 
77
Infinity
 
78
>>> getcontext().traps[DivisionByZero] = 1
 
79
>>> print(dig / 0)
 
80
Traceback (most recent call last):
 
81
  ...
 
82
  ...
 
83
  ...
 
84
decimal.DivisionByZero: x / 0
 
85
>>> c = Context()
 
86
>>> c.traps[InvalidOperation] = 0
 
87
>>> print(c.flags[InvalidOperation])
 
88
0
 
89
>>> c.divide(Decimal(0), Decimal(0))
 
90
Decimal('NaN')
 
91
>>> c.traps[InvalidOperation] = 1
 
92
>>> print(c.flags[InvalidOperation])
 
93
1
 
94
>>> c.flags[InvalidOperation] = 0
 
95
>>> print(c.flags[InvalidOperation])
 
96
0
 
97
>>> print(c.divide(Decimal(0), Decimal(0)))
 
98
Traceback (most recent call last):
 
99
  ...
 
100
  ...
 
101
  ...
 
102
decimal.InvalidOperation: 0 / 0
 
103
>>> print(c.flags[InvalidOperation])
 
104
1
 
105
>>> c.flags[InvalidOperation] = 0
 
106
>>> c.traps[InvalidOperation] = 0
 
107
>>> print(c.divide(Decimal(0), Decimal(0)))
 
108
NaN
 
109
>>> print(c.flags[InvalidOperation])
 
110
1
 
111
>>>
 
112
"""
 
113
 
 
114
__all__ = [
 
115
    # Two major classes
 
116
    'Decimal', 'Context',
 
117
 
 
118
    # Contexts
 
119
    'DefaultContext', 'BasicContext', 'ExtendedContext',
 
120
 
 
121
    # Exceptions
 
122
    'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
 
123
    'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
 
124
 
 
125
    # Constants for use in setting up contexts
 
126
    'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
 
127
    'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN', 'ROUND_05UP',
 
128
 
 
129
    # Functions for manipulating contexts
 
130
    'setcontext', 'getcontext', 'localcontext'
 
131
]
 
132
 
 
133
import copy as _copy
 
134
import math as _math
 
135
import numbers as _numbers
 
136
 
 
137
try:
 
138
    from collections import namedtuple as _namedtuple
 
139
    DecimalTuple = _namedtuple('DecimalTuple', 'sign digits exponent')
 
140
except ImportError:
 
141
    DecimalTuple = lambda *args: args
 
142
 
 
143
# Rounding
 
144
ROUND_DOWN = 'ROUND_DOWN'
 
145
ROUND_HALF_UP = 'ROUND_HALF_UP'
 
146
ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
 
147
ROUND_CEILING = 'ROUND_CEILING'
 
148
ROUND_FLOOR = 'ROUND_FLOOR'
 
149
ROUND_UP = 'ROUND_UP'
 
150
ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
 
151
ROUND_05UP = 'ROUND_05UP'
 
152
 
 
153
# Errors
 
154
 
 
155
class DecimalException(ArithmeticError):
 
156
    """Base exception class.
 
157
 
 
158
    Used exceptions derive from this.
 
159
    If an exception derives from another exception besides this (such as
 
160
    Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
 
161
    called if the others are present.  This isn't actually used for
 
162
    anything, though.
 
163
 
 
164
    handle  -- Called when context._raise_error is called and the
 
165
               trap_enabler is set.  First argument is self, second is the
 
166
               context.  More arguments can be given, those being after
 
167
               the explanation in _raise_error (For example,
 
168
               context._raise_error(NewError, '(-x)!', self._sign) would
 
169
               call NewError().handle(context, self._sign).)
 
170
 
 
171
    To define a new exception, it should be sufficient to have it derive
 
172
    from DecimalException.
 
173
    """
 
174
    def handle(self, context, *args):
 
175
        pass
 
176
 
 
177
 
 
178
class Clamped(DecimalException):
 
179
    """Exponent of a 0 changed to fit bounds.
 
180
 
 
181
    This occurs and signals clamped if the exponent of a result has been
 
182
    altered in order to fit the constraints of a specific concrete
 
183
    representation.  This may occur when the exponent of a zero result would
 
184
    be outside the bounds of a representation, or when a large normal
 
185
    number would have an encoded exponent that cannot be represented.  In
 
186
    this latter case, the exponent is reduced to fit and the corresponding
 
187
    number of zero digits are appended to the coefficient ("fold-down").
 
188
    """
 
189
 
 
190
class InvalidOperation(DecimalException):
 
191
    """An invalid operation was performed.
 
192
 
 
193
    Various bad things cause this:
 
194
 
 
195
    Something creates a signaling NaN
 
196
    -INF + INF
 
197
    0 * (+-)INF
 
198
    (+-)INF / (+-)INF
 
199
    x % 0
 
200
    (+-)INF % x
 
201
    x._rescale( non-integer )
 
202
    sqrt(-x) , x > 0
 
203
    0 ** 0
 
204
    x ** (non-integer)
 
205
    x ** (+-)INF
 
206
    An operand is invalid
 
207
 
 
208
    The result of the operation after these is a quiet positive NaN,
 
209
    except when the cause is a signaling NaN, in which case the result is
 
210
    also a quiet NaN, but with the original sign, and an optional
 
211
    diagnostic information.
 
212
    """
 
213
    def handle(self, context, *args):
 
214
        if args:
 
215
            ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
 
216
            return ans._fix_nan(context)
 
217
        return _NaN
 
218
 
 
219
class ConversionSyntax(InvalidOperation):
 
220
    """Trying to convert badly formed string.
 
221
 
 
222
    This occurs and signals invalid-operation if an string is being
 
223
    converted to a number and it does not conform to the numeric string
 
224
    syntax.  The result is [0,qNaN].
 
225
    """
 
226
    def handle(self, context, *args):
 
227
        return _NaN
 
228
 
 
229
class DivisionByZero(DecimalException, ZeroDivisionError):
 
230
    """Division by 0.
 
231
 
 
232
    This occurs and signals division-by-zero if division of a finite number
 
233
    by zero was attempted (during a divide-integer or divide operation, or a
 
234
    power operation with negative right-hand operand), and the dividend was
 
235
    not zero.
 
236
 
 
237
    The result of the operation is [sign,inf], where sign is the exclusive
 
238
    or of the signs of the operands for divide, or is 1 for an odd power of
 
239
    -0, for power.
 
240
    """
 
241
 
 
242
    def handle(self, context, sign, *args):
 
243
        return _SignedInfinity[sign]
 
244
 
 
245
class DivisionImpossible(InvalidOperation):
 
246
    """Cannot perform the division adequately.
 
247
 
 
248
    This occurs and signals invalid-operation if the integer result of a
 
249
    divide-integer or remainder operation had too many digits (would be
 
250
    longer than precision).  The result is [0,qNaN].
 
251
    """
 
252
 
 
253
    def handle(self, context, *args):
 
254
        return _NaN
 
255
 
 
256
class DivisionUndefined(InvalidOperation, ZeroDivisionError):
 
257
    """Undefined result of division.
 
258
 
 
259
    This occurs and signals invalid-operation if division by zero was
 
260
    attempted (during a divide-integer, divide, or remainder operation), and
 
261
    the dividend is also zero.  The result is [0,qNaN].
 
262
    """
 
263
 
 
264
    def handle(self, context, *args):
 
265
        return _NaN
 
266
 
 
267
class Inexact(DecimalException):
 
268
    """Had to round, losing information.
 
269
 
 
270
    This occurs and signals inexact whenever the result of an operation is
 
271
    not exact (that is, it needed to be rounded and any discarded digits
 
272
    were non-zero), or if an overflow or underflow condition occurs.  The
 
273
    result in all cases is unchanged.
 
274
 
 
275
    The inexact signal may be tested (or trapped) to determine if a given
 
276
    operation (or sequence of operations) was inexact.
 
277
    """
 
278
 
 
279
class InvalidContext(InvalidOperation):
 
280
    """Invalid context.  Unknown rounding, for example.
 
281
 
 
282
    This occurs and signals invalid-operation if an invalid context was
 
283
    detected during an operation.  This can occur if contexts are not checked
 
284
    on creation and either the precision exceeds the capability of the
 
285
    underlying concrete representation or an unknown or unsupported rounding
 
286
    was specified.  These aspects of the context need only be checked when
 
287
    the values are required to be used.  The result is [0,qNaN].
 
288
    """
 
289
 
 
290
    def handle(self, context, *args):
 
291
        return _NaN
 
292
 
 
293
class Rounded(DecimalException):
 
294
    """Number got rounded (not  necessarily changed during rounding).
 
295
 
 
296
    This occurs and signals rounded whenever the result of an operation is
 
297
    rounded (that is, some zero or non-zero digits were discarded from the
 
298
    coefficient), or if an overflow or underflow condition occurs.  The
 
299
    result in all cases is unchanged.
 
300
 
 
301
    The rounded signal may be tested (or trapped) to determine if a given
 
302
    operation (or sequence of operations) caused a loss of precision.
 
303
    """
 
304
 
 
305
class Subnormal(DecimalException):
 
306
    """Exponent < Emin before rounding.
 
307
 
 
308
    This occurs and signals subnormal whenever the result of a conversion or
 
309
    operation is subnormal (that is, its adjusted exponent is less than
 
310
    Emin, before any rounding).  The result in all cases is unchanged.
 
311
 
 
312
    The subnormal signal may be tested (or trapped) to determine if a given
 
313
    or operation (or sequence of operations) yielded a subnormal result.
 
314
    """
 
315
 
 
316
class Overflow(Inexact, Rounded):
 
317
    """Numerical overflow.
 
318
 
 
319
    This occurs and signals overflow if the adjusted exponent of a result
 
320
    (from a conversion or from an operation that is not an attempt to divide
 
321
    by zero), after rounding, would be greater than the largest value that
 
322
    can be handled by the implementation (the value Emax).
 
323
 
 
324
    The result depends on the rounding mode:
 
325
 
 
326
    For round-half-up and round-half-even (and for round-half-down and
 
327
    round-up, if implemented), the result of the operation is [sign,inf],
 
328
    where sign is the sign of the intermediate result.  For round-down, the
 
329
    result is the largest finite number that can be represented in the
 
330
    current precision, with the sign of the intermediate result.  For
 
331
    round-ceiling, the result is the same as for round-down if the sign of
 
332
    the intermediate result is 1, or is [0,inf] otherwise.  For round-floor,
 
333
    the result is the same as for round-down if the sign of the intermediate
 
334
    result is 0, or is [1,inf] otherwise.  In all cases, Inexact and Rounded
 
335
    will also be raised.
 
336
    """
 
337
 
 
338
    def handle(self, context, sign, *args):
 
339
        if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
 
340
                                ROUND_HALF_DOWN, ROUND_UP):
 
341
            return _SignedInfinity[sign]
 
342
        if sign == 0:
 
343
            if context.rounding == ROUND_CEILING:
 
344
                return _SignedInfinity[sign]
 
345
            return _dec_from_triple(sign, '9'*context.prec,
 
346
                            context.Emax-context.prec+1)
 
347
        if sign == 1:
 
348
            if context.rounding == ROUND_FLOOR:
 
349
                return _SignedInfinity[sign]
 
350
            return _dec_from_triple(sign, '9'*context.prec,
 
351
                             context.Emax-context.prec+1)
 
352
 
 
353
 
 
354
class Underflow(Inexact, Rounded, Subnormal):
 
355
    """Numerical underflow with result rounded to 0.
 
356
 
 
357
    This occurs and signals underflow if a result is inexact and the
 
358
    adjusted exponent of the result would be smaller (more negative) than
 
359
    the smallest value that can be handled by the implementation (the value
 
360
    Emin).  That is, the result is both inexact and subnormal.
 
361
 
 
362
    The result after an underflow will be a subnormal number rounded, if
 
363
    necessary, so that its exponent is not less than Etiny.  This may result
 
364
    in 0 with the sign of the intermediate result and an exponent of Etiny.
 
365
 
 
366
    In all cases, Inexact, Rounded, and Subnormal will also be raised.
 
367
    """
 
368
 
 
369
# List of public traps and flags
 
370
_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
 
371
           Underflow, InvalidOperation, Subnormal]
 
372
 
 
373
# Map conditions (per the spec) to signals
 
374
_condition_map = {ConversionSyntax:InvalidOperation,
 
375
                  DivisionImpossible:InvalidOperation,
 
376
                  DivisionUndefined:InvalidOperation,
 
377
                  InvalidContext:InvalidOperation}
 
378
 
 
379
##### Context Functions ##################################################
 
380
 
 
381
# The getcontext() and setcontext() function manage access to a thread-local
 
382
# current context.  Py2.4 offers direct support for thread locals.  If that
 
383
# is not available, use threading.current_thread() which is slower but will
 
384
# work for older Pythons.  If threads are not part of the build, create a
 
385
# mock threading object with threading.local() returning the module namespace.
 
386
 
 
387
try:
 
388
    import threading
 
389
except ImportError:
 
390
    # Python was compiled without threads; create a mock object instead
 
391
    import sys
 
392
    class MockThreading(object):
 
393
        def local(self, sys=sys):
 
394
            return sys.modules[__name__]
 
395
    threading = MockThreading()
 
396
    del sys, MockThreading
 
397
 
 
398
try:
 
399
    threading.local
 
400
 
 
401
except AttributeError:
 
402
 
 
403
    # To fix reloading, force it to create a new context
 
404
    # Old contexts have different exceptions in their dicts, making problems.
 
405
    if hasattr(threading.current_thread(), '__decimal_context__'):
 
406
        del threading.current_thread().__decimal_context__
 
407
 
 
408
    def setcontext(context):
 
409
        """Set this thread's context to context."""
 
410
        if context in (DefaultContext, BasicContext, ExtendedContext):
 
411
            context = context.copy()
 
412
            context.clear_flags()
 
413
        threading.current_thread().__decimal_context__ = context
 
414
 
 
415
    def getcontext():
 
416
        """Returns this thread's context.
 
417
 
 
418
        If this thread does not yet have a context, returns
 
419
        a new context and sets this thread's context.
 
420
        New contexts are copies of DefaultContext.
 
421
        """
 
422
        try:
 
423
            return threading.current_thread().__decimal_context__
 
424
        except AttributeError:
 
425
            context = Context()
 
426
            threading.current_thread().__decimal_context__ = context
 
427
            return context
 
428
 
 
429
else:
 
430
 
 
431
    local = threading.local()
 
432
    if hasattr(local, '__decimal_context__'):
 
433
        del local.__decimal_context__
 
434
 
 
435
    def getcontext(_local=local):
 
436
        """Returns this thread's context.
 
437
 
 
438
        If this thread does not yet have a context, returns
 
439
        a new context and sets this thread's context.
 
440
        New contexts are copies of DefaultContext.
 
441
        """
 
442
        try:
 
443
            return _local.__decimal_context__
 
444
        except AttributeError:
 
445
            context = Context()
 
446
            _local.__decimal_context__ = context
 
447
            return context
 
448
 
 
449
    def setcontext(context, _local=local):
 
450
        """Set this thread's context to context."""
 
451
        if context in (DefaultContext, BasicContext, ExtendedContext):
 
452
            context = context.copy()
 
453
            context.clear_flags()
 
454
        _local.__decimal_context__ = context
 
455
 
 
456
    del threading, local        # Don't contaminate the namespace
 
457
 
 
458
def localcontext(ctx=None):
 
459
    """Return a context manager for a copy of the supplied context
 
460
 
 
461
    Uses a copy of the current context if no context is specified
 
462
    The returned context manager creates a local decimal context
 
463
    in a with statement:
 
464
        def sin(x):
 
465
             with localcontext() as ctx:
 
466
                 ctx.prec += 2
 
467
                 # Rest of sin calculation algorithm
 
468
                 # uses a precision 2 greater than normal
 
469
             return +s  # Convert result to normal precision
 
470
 
 
471
         def sin(x):
 
472
             with localcontext(ExtendedContext):
 
473
                 # Rest of sin calculation algorithm
 
474
                 # uses the Extended Context from the
 
475
                 # General Decimal Arithmetic Specification
 
476
             return +s  # Convert result to normal context
 
477
 
 
478
    >>> setcontext(DefaultContext)
 
479
    >>> print(getcontext().prec)
 
480
    28
 
481
    >>> with localcontext():
 
482
    ...     ctx = getcontext()
 
483
    ...     ctx.prec += 2
 
484
    ...     print(ctx.prec)
 
485
    ...
 
486
    30
 
487
    >>> with localcontext(ExtendedContext):
 
488
    ...     print(getcontext().prec)
 
489
    ...
 
490
    9
 
491
    >>> print(getcontext().prec)
 
492
    28
 
493
    """
 
494
    if ctx is None: ctx = getcontext()
 
495
    return _ContextManager(ctx)
 
496
 
 
497
 
 
498
##### Decimal class #######################################################
 
499
 
 
500
# Do not subclass Decimal from numbers.Real and do not register it as such
 
501
# (because Decimals are not interoperable with floats).  See the notes in
 
502
# numbers.py for more detail.
 
503
 
 
504
class Decimal(object):
 
505
    """Floating point class for decimal arithmetic."""
 
506
 
 
507
    __slots__ = ('_exp','_int','_sign', '_is_special')
 
508
    # Generally, the value of the Decimal instance is given by
 
509
    #  (-1)**_sign * _int * 10**_exp
 
510
    # Special values are signified by _is_special == True
 
511
 
 
512
    # We're immutable, so use __new__ not __init__
 
513
    def __new__(cls, value="0", context=None):
 
514
        """Create a decimal point instance.
 
515
 
 
516
        >>> Decimal('3.14')              # string input
 
517
        Decimal('3.14')
 
518
        >>> Decimal((0, (3, 1, 4), -2))  # tuple (sign, digit_tuple, exponent)
 
519
        Decimal('3.14')
 
520
        >>> Decimal(314)                 # int
 
521
        Decimal('314')
 
522
        >>> Decimal(Decimal(314))        # another decimal instance
 
523
        Decimal('314')
 
524
        >>> Decimal('  3.14  \\n')        # leading and trailing whitespace okay
 
525
        Decimal('3.14')
 
526
        """
 
527
 
 
528
        # Note that the coefficient, self._int, is actually stored as
 
529
        # a string rather than as a tuple of digits.  This speeds up
 
530
        # the "digits to integer" and "integer to digits" conversions
 
531
        # that are used in almost every arithmetic operation on
 
532
        # Decimals.  This is an internal detail: the as_tuple function
 
533
        # and the Decimal constructor still deal with tuples of
 
534
        # digits.
 
535
 
 
536
        self = object.__new__(cls)
 
537
 
 
538
        # From a string
 
539
        # REs insist on real strings, so we can too.
 
540
        if isinstance(value, str):
 
541
            m = _parser(value.strip())
 
542
            if m is None:
 
543
                if context is None:
 
544
                    context = getcontext()
 
545
                return context._raise_error(ConversionSyntax,
 
546
                                "Invalid literal for Decimal: %r" % value)
 
547
 
 
548
            if m.group('sign') == "-":
 
549
                self._sign = 1
 
550
            else:
 
551
                self._sign = 0
 
552
            intpart = m.group('int')
 
553
            if intpart is not None:
 
554
                # finite number
 
555
                fracpart = m.group('frac')
 
556
                exp = int(m.group('exp') or '0')
 
557
                if fracpart is not None:
 
558
                    self._int = (intpart+fracpart).lstrip('0') or '0'
 
559
                    self._exp = exp - len(fracpart)
 
560
                else:
 
561
                    self._int = intpart.lstrip('0') or '0'
 
562
                    self._exp = exp
 
563
                self._is_special = False
 
564
            else:
 
565
                diag = m.group('diag')
 
566
                if diag is not None:
 
567
                    # NaN
 
568
                    self._int = diag.lstrip('0')
 
569
                    if m.group('signal'):
 
570
                        self._exp = 'N'
 
571
                    else:
 
572
                        self._exp = 'n'
 
573
                else:
 
574
                    # infinity
 
575
                    self._int = '0'
 
576
                    self._exp = 'F'
 
577
                self._is_special = True
 
578
            return self
 
579
 
 
580
        # From an integer
 
581
        if isinstance(value, int):
 
582
            if value >= 0:
 
583
                self._sign = 0
 
584
            else:
 
585
                self._sign = 1
 
586
            self._exp = 0
 
587
            self._int = str(abs(value))
 
588
            self._is_special = False
 
589
            return self
 
590
 
 
591
        # From another decimal
 
592
        if isinstance(value, Decimal):
 
593
            self._exp  = value._exp
 
594
            self._sign = value._sign
 
595
            self._int  = value._int
 
596
            self._is_special  = value._is_special
 
597
            return self
 
598
 
 
599
        # From an internal working value
 
600
        if isinstance(value, _WorkRep):
 
601
            self._sign = value.sign
 
602
            self._int = str(value.int)
 
603
            self._exp = int(value.exp)
 
604
            self._is_special = False
 
605
            return self
 
606
 
 
607
        # tuple/list conversion (possibly from as_tuple())
 
608
        if isinstance(value, (list,tuple)):
 
609
            if len(value) != 3:
 
610
                raise ValueError('Invalid tuple size in creation of Decimal '
 
611
                                 'from list or tuple.  The list or tuple '
 
612
                                 'should have exactly three elements.')
 
613
            # process sign.  The isinstance test rejects floats
 
614
            if not (isinstance(value[0], int) and value[0] in (0,1)):
 
615
                raise ValueError("Invalid sign.  The first value in the tuple "
 
616
                                 "should be an integer; either 0 for a "
 
617
                                 "positive number or 1 for a negative number.")
 
618
            self._sign = value[0]
 
619
            if value[2] == 'F':
 
620
                # infinity: value[1] is ignored
 
621
                self._int = '0'
 
622
                self._exp = value[2]
 
623
                self._is_special = True
 
624
            else:
 
625
                # process and validate the digits in value[1]
 
626
                digits = []
 
627
                for digit in value[1]:
 
628
                    if isinstance(digit, int) and 0 <= digit <= 9:
 
629
                        # skip leading zeros
 
630
                        if digits or digit != 0:
 
631
                            digits.append(digit)
 
632
                    else:
 
633
                        raise ValueError("The second value in the tuple must "
 
634
                                         "be composed of integers in the range "
 
635
                                         "0 through 9.")
 
636
                if value[2] in ('n', 'N'):
 
637
                    # NaN: digits form the diagnostic
 
638
                    self._int = ''.join(map(str, digits))
 
639
                    self._exp = value[2]
 
640
                    self._is_special = True
 
641
                elif isinstance(value[2], int):
 
642
                    # finite number: digits give the coefficient
 
643
                    self._int = ''.join(map(str, digits or [0]))
 
644
                    self._exp = value[2]
 
645
                    self._is_special = False
 
646
                else:
 
647
                    raise ValueError("The third value in the tuple must "
 
648
                                     "be an integer, or one of the "
 
649
                                     "strings 'F', 'n', 'N'.")
 
650
            return self
 
651
 
 
652
        if isinstance(value, float):
 
653
            raise TypeError("Cannot convert float to Decimal.  " +
 
654
                            "First convert the float to a string")
 
655
 
 
656
        raise TypeError("Cannot convert %r to Decimal" % value)
 
657
 
 
658
    # @classmethod, but @decorator is not valid Python 2.3 syntax, so
 
659
    # don't use it (see notes on Py2.3 compatibility at top of file)
 
660
    def from_float(cls, f):
 
661
        """Converts a float to a decimal number, exactly.
 
662
 
 
663
        Note that Decimal.from_float(0.1) is not the same as Decimal('0.1').
 
664
        Since 0.1 is not exactly representable in binary floating point, the
 
665
        value is stored as the nearest representable value which is
 
666
        0x1.999999999999ap-4.  The exact equivalent of the value in decimal
 
667
        is 0.1000000000000000055511151231257827021181583404541015625.
 
668
 
 
669
        >>> Decimal.from_float(0.1)
 
670
        Decimal('0.1000000000000000055511151231257827021181583404541015625')
 
671
        >>> Decimal.from_float(float('nan'))
 
672
        Decimal('NaN')
 
673
        >>> Decimal.from_float(float('inf'))
 
674
        Decimal('Infinity')
 
675
        >>> Decimal.from_float(-float('inf'))
 
676
        Decimal('-Infinity')
 
677
        >>> Decimal.from_float(-0.0)
 
678
        Decimal('-0')
 
679
 
 
680
        """
 
681
        if isinstance(f, int):                # handle integer inputs
 
682
            return cls(f)
 
683
        if _math.isinf(f) or _math.isnan(f):  # raises TypeError if not a float
 
684
            return cls(repr(f))
 
685
        if _math.copysign(1.0, f) == 1.0:
 
686
            sign = 0
 
687
        else:
 
688
            sign = 1
 
689
        n, d = abs(f).as_integer_ratio()
 
690
        k = d.bit_length() - 1
 
691
        result = _dec_from_triple(sign, str(n*5**k), -k)
 
692
        if cls is Decimal:
 
693
            return result
 
694
        else:
 
695
            return cls(result)
 
696
    from_float = classmethod(from_float)
 
697
 
 
698
    def _isnan(self):
 
699
        """Returns whether the number is not actually one.
 
700
 
 
701
        0 if a number
 
702
        1 if NaN
 
703
        2 if sNaN
 
704
        """
 
705
        if self._is_special:
 
706
            exp = self._exp
 
707
            if exp == 'n':
 
708
                return 1
 
709
            elif exp == 'N':
 
710
                return 2
 
711
        return 0
 
712
 
 
713
    def _isinfinity(self):
 
714
        """Returns whether the number is infinite
 
715
 
 
716
        0 if finite or not a number
 
717
        1 if +INF
 
718
        -1 if -INF
 
719
        """
 
720
        if self._exp == 'F':
 
721
            if self._sign:
 
722
                return -1
 
723
            return 1
 
724
        return 0
 
725
 
 
726
    def _check_nans(self, other=None, context=None):
 
727
        """Returns whether the number is not actually one.
 
728
 
 
729
        if self, other are sNaN, signal
 
730
        if self, other are NaN return nan
 
731
        return 0
 
732
 
 
733
        Done before operations.
 
734
        """
 
735
 
 
736
        self_is_nan = self._isnan()
 
737
        if other is None:
 
738
            other_is_nan = False
 
739
        else:
 
740
            other_is_nan = other._isnan()
 
741
 
 
742
        if self_is_nan or other_is_nan:
 
743
            if context is None:
 
744
                context = getcontext()
 
745
 
 
746
            if self_is_nan == 2:
 
747
                return context._raise_error(InvalidOperation, 'sNaN',
 
748
                                        self)
 
749
            if other_is_nan == 2:
 
750
                return context._raise_error(InvalidOperation, 'sNaN',
 
751
                                        other)
 
752
            if self_is_nan:
 
753
                return self._fix_nan(context)
 
754
 
 
755
            return other._fix_nan(context)
 
756
        return 0
 
757
 
 
758
    def _compare_check_nans(self, other, context):
 
759
        """Version of _check_nans used for the signaling comparisons
 
760
        compare_signal, __le__, __lt__, __ge__, __gt__.
 
761
 
 
762
        Signal InvalidOperation if either self or other is a (quiet
 
763
        or signaling) NaN.  Signaling NaNs take precedence over quiet
 
764
        NaNs.
 
765
 
 
766
        Return 0 if neither operand is a NaN.
 
767
 
 
768
        """
 
769
        if context is None:
 
770
            context = getcontext()
 
771
 
 
772
        if self._is_special or other._is_special:
 
773
            if self.is_snan():
 
774
                return context._raise_error(InvalidOperation,
 
775
                                            'comparison involving sNaN',
 
776
                                            self)
 
777
            elif other.is_snan():
 
778
                return context._raise_error(InvalidOperation,
 
779
                                            'comparison involving sNaN',
 
780
                                            other)
 
781
            elif self.is_qnan():
 
782
                return context._raise_error(InvalidOperation,
 
783
                                            'comparison involving NaN',
 
784
                                            self)
 
785
            elif other.is_qnan():
 
786
                return context._raise_error(InvalidOperation,
 
787
                                            'comparison involving NaN',
 
788
                                            other)
 
789
        return 0
 
790
 
 
791
    def __bool__(self):
 
792
        """Return True if self is nonzero; otherwise return False.
 
793
 
 
794
        NaNs and infinities are considered nonzero.
 
795
        """
 
796
        return self._is_special or self._int != '0'
 
797
 
 
798
    def _cmp(self, other):
 
799
        """Compare the two non-NaN decimal instances self and other.
 
800
 
 
801
        Returns -1 if self < other, 0 if self == other and 1
 
802
        if self > other.  This routine is for internal use only."""
 
803
 
 
804
        if self._is_special or other._is_special:
 
805
            self_inf = self._isinfinity()
 
806
            other_inf = other._isinfinity()
 
807
            if self_inf == other_inf:
 
808
                return 0
 
809
            elif self_inf < other_inf:
 
810
                return -1
 
811
            else:
 
812
                return 1
 
813
 
 
814
        # check for zeros;  Decimal('0') == Decimal('-0')
 
815
        if not self:
 
816
            if not other:
 
817
                return 0
 
818
            else:
 
819
                return -((-1)**other._sign)
 
820
        if not other:
 
821
            return (-1)**self._sign
 
822
 
 
823
        # If different signs, neg one is less
 
824
        if other._sign < self._sign:
 
825
            return -1
 
826
        if self._sign < other._sign:
 
827
            return 1
 
828
 
 
829
        self_adjusted = self.adjusted()
 
830
        other_adjusted = other.adjusted()
 
831
        if self_adjusted == other_adjusted:
 
832
            self_padded = self._int + '0'*(self._exp - other._exp)
 
833
            other_padded = other._int + '0'*(other._exp - self._exp)
 
834
            if self_padded == other_padded:
 
835
                return 0
 
836
            elif self_padded < other_padded:
 
837
                return -(-1)**self._sign
 
838
            else:
 
839
                return (-1)**self._sign
 
840
        elif self_adjusted > other_adjusted:
 
841
            return (-1)**self._sign
 
842
        else: # self_adjusted < other_adjusted
 
843
            return -((-1)**self._sign)
 
844
 
 
845
    # Note: The Decimal standard doesn't cover rich comparisons for
 
846
    # Decimals.  In particular, the specification is silent on the
 
847
    # subject of what should happen for a comparison involving a NaN.
 
848
    # We take the following approach:
 
849
    #
 
850
    #   == comparisons involving a NaN always return False
 
851
    #   != comparisons involving a NaN always return True
 
852
    #   <, >, <= and >= comparisons involving a (quiet or signaling)
 
853
    #      NaN signal InvalidOperation, and return False if the
 
854
    #      InvalidOperation is not trapped.
 
855
    #
 
856
    # This behavior is designed to conform as closely as possible to
 
857
    # that specified by IEEE 754.
 
858
 
 
859
    def __eq__(self, other):
 
860
        other = _convert_other(other)
 
861
        if other is NotImplemented:
 
862
            return other
 
863
        if self.is_nan() or other.is_nan():
 
864
            return False
 
865
        return self._cmp(other) == 0
 
866
 
 
867
    def __ne__(self, other):
 
868
        other = _convert_other(other)
 
869
        if other is NotImplemented:
 
870
            return other
 
871
        if self.is_nan() or other.is_nan():
 
872
            return True
 
873
        return self._cmp(other) != 0
 
874
 
 
875
 
 
876
    def __lt__(self, other, context=None):
 
877
        other = _convert_other(other)
 
878
        if other is NotImplemented:
 
879
            return other
 
880
        ans = self._compare_check_nans(other, context)
 
881
        if ans:
 
882
            return False
 
883
        return self._cmp(other) < 0
 
884
 
 
885
    def __le__(self, other, context=None):
 
886
        other = _convert_other(other)
 
887
        if other is NotImplemented:
 
888
            return other
 
889
        ans = self._compare_check_nans(other, context)
 
890
        if ans:
 
891
            return False
 
892
        return self._cmp(other) <= 0
 
893
 
 
894
    def __gt__(self, other, context=None):
 
895
        other = _convert_other(other)
 
896
        if other is NotImplemented:
 
897
            return other
 
898
        ans = self._compare_check_nans(other, context)
 
899
        if ans:
 
900
            return False
 
901
        return self._cmp(other) > 0
 
902
 
 
903
    def __ge__(self, other, context=None):
 
904
        other = _convert_other(other)
 
905
        if other is NotImplemented:
 
906
            return other
 
907
        ans = self._compare_check_nans(other, context)
 
908
        if ans:
 
909
            return False
 
910
        return self._cmp(other) >= 0
 
911
 
 
912
    def compare(self, other, context=None):
 
913
        """Compares one to another.
 
914
 
 
915
        -1 => a < b
 
916
        0  => a = b
 
917
        1  => a > b
 
918
        NaN => one is NaN
 
919
        Like __cmp__, but returns Decimal instances.
 
920
        """
 
921
        other = _convert_other(other, raiseit=True)
 
922
 
 
923
        # Compare(NaN, NaN) = NaN
 
924
        if (self._is_special or other and other._is_special):
 
925
            ans = self._check_nans(other, context)
 
926
            if ans:
 
927
                return ans
 
928
 
 
929
        return Decimal(self._cmp(other))
 
930
 
 
931
    def __hash__(self):
 
932
        """x.__hash__() <==> hash(x)"""
 
933
        # Decimal integers must hash the same as the ints
 
934
        #
 
935
        # The hash of a nonspecial noninteger Decimal must depend only
 
936
        # on the value of that Decimal, and not on its representation.
 
937
        # For example: hash(Decimal('100E-1')) == hash(Decimal('10')).
 
938
        if self._is_special:
 
939
            if self._isnan():
 
940
                raise TypeError('Cannot hash a NaN value.')
 
941
            return hash(str(self))
 
942
        if not self:
 
943
            return 0
 
944
        if self._isinteger():
 
945
            op = _WorkRep(self.to_integral_value())
 
946
            # to make computation feasible for Decimals with large
 
947
            # exponent, we use the fact that hash(n) == hash(m) for
 
948
            # any two nonzero integers n and m such that (i) n and m
 
949
            # have the same sign, and (ii) n is congruent to m modulo
 
950
            # 2**64-1.  So we can replace hash((-1)**s*c*10**e) with
 
951
            # hash((-1)**s*c*pow(10, e, 2**64-1).
 
952
            return hash((-1)**op.sign*op.int*pow(10, op.exp, 2**64-1))
 
953
        # The value of a nonzero nonspecial Decimal instance is
 
954
        # faithfully represented by the triple consisting of its sign,
 
955
        # its adjusted exponent, and its coefficient with trailing
 
956
        # zeros removed.
 
957
        return hash((self._sign,
 
958
                     self._exp+len(self._int),
 
959
                     self._int.rstrip('0')))
 
960
 
 
961
    def as_tuple(self):
 
962
        """Represents the number as a triple tuple.
 
963
 
 
964
        To show the internals exactly as they are.
 
965
        """
 
966
        return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
 
967
 
 
968
    def __repr__(self):
 
969
        """Represents the number as an instance of Decimal."""
 
970
        # Invariant:  eval(repr(d)) == d
 
971
        return "Decimal('%s')" % str(self)
 
972
 
 
973
    def __str__(self, eng=False, context=None):
 
974
        """Return string representation of the number in scientific notation.
 
975
 
 
976
        Captures all of the information in the underlying representation.
 
977
        """
 
978
 
 
979
        sign = ['', '-'][self._sign]
 
980
        if self._is_special:
 
981
            if self._exp == 'F':
 
982
                return sign + 'Infinity'
 
983
            elif self._exp == 'n':
 
984
                return sign + 'NaN' + self._int
 
985
            else: # self._exp == 'N'
 
986
                return sign + 'sNaN' + self._int
 
987
 
 
988
        # number of digits of self._int to left of decimal point
 
989
        leftdigits = self._exp + len(self._int)
 
990
 
 
991
        # dotplace is number of digits of self._int to the left of the
 
992
        # decimal point in the mantissa of the output string (that is,
 
993
        # after adjusting the exponent)
 
994
        if self._exp <= 0 and leftdigits > -6:
 
995
            # no exponent required
 
996
            dotplace = leftdigits
 
997
        elif not eng:
 
998
            # usual scientific notation: 1 digit on left of the point
 
999
            dotplace = 1
 
1000
        elif self._int == '0':
 
1001
            # engineering notation, zero
 
1002
            dotplace = (leftdigits + 1) % 3 - 1
 
1003
        else:
 
1004
            # engineering notation, nonzero
 
1005
            dotplace = (leftdigits - 1) % 3 + 1
 
1006
 
 
1007
        if dotplace <= 0:
 
1008
            intpart = '0'
 
1009
            fracpart = '.' + '0'*(-dotplace) + self._int
 
1010
        elif dotplace >= len(self._int):
 
1011
            intpart = self._int+'0'*(dotplace-len(self._int))
 
1012
            fracpart = ''
 
1013
        else:
 
1014
            intpart = self._int[:dotplace]
 
1015
            fracpart = '.' + self._int[dotplace:]
 
1016
        if leftdigits == dotplace:
 
1017
            exp = ''
 
1018
        else:
 
1019
            if context is None:
 
1020
                context = getcontext()
 
1021
            exp = ['e', 'E'][context.capitals] + "%+d" % (leftdigits-dotplace)
 
1022
 
 
1023
        return sign + intpart + fracpart + exp
 
1024
 
 
1025
    def to_eng_string(self, context=None):
 
1026
        """Convert to engineering-type string.
 
1027
 
 
1028
        Engineering notation has an exponent which is a multiple of 3, so there
 
1029
        are up to 3 digits left of the decimal place.
 
1030
 
 
1031
        Same rules for when in exponential and when as a value as in __str__.
 
1032
        """
 
1033
        return self.__str__(eng=True, context=context)
 
1034
 
 
1035
    def __neg__(self, context=None):
 
1036
        """Returns a copy with the sign switched.
 
1037
 
 
1038
        Rounds, if it has reason.
 
1039
        """
 
1040
        if self._is_special:
 
1041
            ans = self._check_nans(context=context)
 
1042
            if ans:
 
1043
                return ans
 
1044
 
 
1045
        if not self:
 
1046
            # -Decimal('0') is Decimal('0'), not Decimal('-0')
 
1047
            ans = self.copy_abs()
 
1048
        else:
 
1049
            ans = self.copy_negate()
 
1050
 
 
1051
        if context is None:
 
1052
            context = getcontext()
 
1053
        return ans._fix(context)
 
1054
 
 
1055
    def __pos__(self, context=None):
 
1056
        """Returns a copy, unless it is a sNaN.
 
1057
 
 
1058
        Rounds the number (if more then precision digits)
 
1059
        """
 
1060
        if self._is_special:
 
1061
            ans = self._check_nans(context=context)
 
1062
            if ans:
 
1063
                return ans
 
1064
 
 
1065
        if not self:
 
1066
            # + (-0) = 0
 
1067
            ans = self.copy_abs()
 
1068
        else:
 
1069
            ans = Decimal(self)
 
1070
 
 
1071
        if context is None:
 
1072
            context = getcontext()
 
1073
        return ans._fix(context)
 
1074
 
 
1075
    def __abs__(self, round=True, context=None):
 
1076
        """Returns the absolute value of self.
 
1077
 
 
1078
        If the keyword argument 'round' is false, do not round.  The
 
1079
        expression self.__abs__(round=False) is equivalent to
 
1080
        self.copy_abs().
 
1081
        """
 
1082
        if not round:
 
1083
            return self.copy_abs()
 
1084
 
 
1085
        if self._is_special:
 
1086
            ans = self._check_nans(context=context)
 
1087
            if ans:
 
1088
                return ans
 
1089
 
 
1090
        if self._sign:
 
1091
            ans = self.__neg__(context=context)
 
1092
        else:
 
1093
            ans = self.__pos__(context=context)
 
1094
 
 
1095
        return ans
 
1096
 
 
1097
    def __add__(self, other, context=None):
 
1098
        """Returns self + other.
 
1099
 
 
1100
        -INF + INF (or the reverse) cause InvalidOperation errors.
 
1101
        """
 
1102
        other = _convert_other(other)
 
1103
        if other is NotImplemented:
 
1104
            return other
 
1105
 
 
1106
        if context is None:
 
1107
            context = getcontext()
 
1108
 
 
1109
        if self._is_special or other._is_special:
 
1110
            ans = self._check_nans(other, context)
 
1111
            if ans:
 
1112
                return ans
 
1113
 
 
1114
            if self._isinfinity():
 
1115
                # If both INF, same sign => same as both, opposite => error.
 
1116
                if self._sign != other._sign and other._isinfinity():
 
1117
                    return context._raise_error(InvalidOperation, '-INF + INF')
 
1118
                return Decimal(self)
 
1119
            if other._isinfinity():
 
1120
                return Decimal(other)  # Can't both be infinity here
 
1121
 
 
1122
        exp = min(self._exp, other._exp)
 
1123
        negativezero = 0
 
1124
        if context.rounding == ROUND_FLOOR and self._sign != other._sign:
 
1125
            # If the answer is 0, the sign should be negative, in this case.
 
1126
            negativezero = 1
 
1127
 
 
1128
        if not self and not other:
 
1129
            sign = min(self._sign, other._sign)
 
1130
            if negativezero:
 
1131
                sign = 1
 
1132
            ans = _dec_from_triple(sign, '0', exp)
 
1133
            ans = ans._fix(context)
 
1134
            return ans
 
1135
        if not self:
 
1136
            exp = max(exp, other._exp - context.prec-1)
 
1137
            ans = other._rescale(exp, context.rounding)
 
1138
            ans = ans._fix(context)
 
1139
            return ans
 
1140
        if not other:
 
1141
            exp = max(exp, self._exp - context.prec-1)
 
1142
            ans = self._rescale(exp, context.rounding)
 
1143
            ans = ans._fix(context)
 
1144
            return ans
 
1145
 
 
1146
        op1 = _WorkRep(self)
 
1147
        op2 = _WorkRep(other)
 
1148
        op1, op2 = _normalize(op1, op2, context.prec)
 
1149
 
 
1150
        result = _WorkRep()
 
1151
        if op1.sign != op2.sign:
 
1152
            # Equal and opposite
 
1153
            if op1.int == op2.int:
 
1154
                ans = _dec_from_triple(negativezero, '0', exp)
 
1155
                ans = ans._fix(context)
 
1156
                return ans
 
1157
            if op1.int < op2.int:
 
1158
                op1, op2 = op2, op1
 
1159
                # OK, now abs(op1) > abs(op2)
 
1160
            if op1.sign == 1:
 
1161
                result.sign = 1
 
1162
                op1.sign, op2.sign = op2.sign, op1.sign
 
1163
            else:
 
1164
                result.sign = 0
 
1165
                # So we know the sign, and op1 > 0.
 
1166
        elif op1.sign == 1:
 
1167
            result.sign = 1
 
1168
            op1.sign, op2.sign = (0, 0)
 
1169
        else:
 
1170
            result.sign = 0
 
1171
        # Now, op1 > abs(op2) > 0
 
1172
 
 
1173
        if op2.sign == 0:
 
1174
            result.int = op1.int + op2.int
 
1175
        else:
 
1176
            result.int = op1.int - op2.int
 
1177
 
 
1178
        result.exp = op1.exp
 
1179
        ans = Decimal(result)
 
1180
        ans = ans._fix(context)
 
1181
        return ans
 
1182
 
 
1183
    __radd__ = __add__
 
1184
 
 
1185
    def __sub__(self, other, context=None):
 
1186
        """Return self - other"""
 
1187
        other = _convert_other(other)
 
1188
        if other is NotImplemented:
 
1189
            return other
 
1190
 
 
1191
        if self._is_special or other._is_special:
 
1192
            ans = self._check_nans(other, context=context)
 
1193
            if ans:
 
1194
                return ans
 
1195
 
 
1196
        # self - other is computed as self + other.copy_negate()
 
1197
        return self.__add__(other.copy_negate(), context=context)
 
1198
 
 
1199
    def __rsub__(self, other, context=None):
 
1200
        """Return other - self"""
 
1201
        other = _convert_other(other)
 
1202
        if other is NotImplemented:
 
1203
            return other
 
1204
 
 
1205
        return other.__sub__(self, context=context)
 
1206
 
 
1207
    def __mul__(self, other, context=None):
 
1208
        """Return self * other.
 
1209
 
 
1210
        (+-) INF * 0 (or its reverse) raise InvalidOperation.
 
1211
        """
 
1212
        other = _convert_other(other)
 
1213
        if other is NotImplemented:
 
1214
            return other
 
1215
 
 
1216
        if context is None:
 
1217
            context = getcontext()
 
1218
 
 
1219
        resultsign = self._sign ^ other._sign
 
1220
 
 
1221
        if self._is_special or other._is_special:
 
1222
            ans = self._check_nans(other, context)
 
1223
            if ans:
 
1224
                return ans
 
1225
 
 
1226
            if self._isinfinity():
 
1227
                if not other:
 
1228
                    return context._raise_error(InvalidOperation, '(+-)INF * 0')
 
1229
                return _SignedInfinity[resultsign]
 
1230
 
 
1231
            if other._isinfinity():
 
1232
                if not self:
 
1233
                    return context._raise_error(InvalidOperation, '0 * (+-)INF')
 
1234
                return _SignedInfinity[resultsign]
 
1235
 
 
1236
        resultexp = self._exp + other._exp
 
1237
 
 
1238
        # Special case for multiplying by zero
 
1239
        if not self or not other:
 
1240
            ans = _dec_from_triple(resultsign, '0', resultexp)
 
1241
            # Fixing in case the exponent is out of bounds
 
1242
            ans = ans._fix(context)
 
1243
            return ans
 
1244
 
 
1245
        # Special case for multiplying by power of 10
 
1246
        if self._int == '1':
 
1247
            ans = _dec_from_triple(resultsign, other._int, resultexp)
 
1248
            ans = ans._fix(context)
 
1249
            return ans
 
1250
        if other._int == '1':
 
1251
            ans = _dec_from_triple(resultsign, self._int, resultexp)
 
1252
            ans = ans._fix(context)
 
1253
            return ans
 
1254
 
 
1255
        op1 = _WorkRep(self)
 
1256
        op2 = _WorkRep(other)
 
1257
 
 
1258
        ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp)
 
1259
        ans = ans._fix(context)
 
1260
 
 
1261
        return ans
 
1262
    __rmul__ = __mul__
 
1263
 
 
1264
    def __truediv__(self, other, context=None):
 
1265
        """Return self / other."""
 
1266
        other = _convert_other(other)
 
1267
        if other is NotImplemented:
 
1268
            return NotImplemented
 
1269
 
 
1270
        if context is None:
 
1271
            context = getcontext()
 
1272
 
 
1273
        sign = self._sign ^ other._sign
 
1274
 
 
1275
        if self._is_special or other._is_special:
 
1276
            ans = self._check_nans(other, context)
 
1277
            if ans:
 
1278
                return ans
 
1279
 
 
1280
            if self._isinfinity() and other._isinfinity():
 
1281
                return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
 
1282
 
 
1283
            if self._isinfinity():
 
1284
                return _SignedInfinity[sign]
 
1285
 
 
1286
            if other._isinfinity():
 
1287
                context._raise_error(Clamped, 'Division by infinity')
 
1288
                return _dec_from_triple(sign, '0', context.Etiny())
 
1289
 
 
1290
        # Special cases for zeroes
 
1291
        if not other:
 
1292
            if not self:
 
1293
                return context._raise_error(DivisionUndefined, '0 / 0')
 
1294
            return context._raise_error(DivisionByZero, 'x / 0', sign)
 
1295
 
 
1296
        if not self:
 
1297
            exp = self._exp - other._exp
 
1298
            coeff = 0
 
1299
        else:
 
1300
            # OK, so neither = 0, INF or NaN
 
1301
            shift = len(other._int) - len(self._int) + context.prec + 1
 
1302
            exp = self._exp - other._exp - shift
 
1303
            op1 = _WorkRep(self)
 
1304
            op2 = _WorkRep(other)
 
1305
            if shift >= 0:
 
1306
                coeff, remainder = divmod(op1.int * 10**shift, op2.int)
 
1307
            else:
 
1308
                coeff, remainder = divmod(op1.int, op2.int * 10**-shift)
 
1309
            if remainder:
 
1310
                # result is not exact; adjust to ensure correct rounding
 
1311
                if coeff % 5 == 0:
 
1312
                    coeff += 1
 
1313
            else:
 
1314
                # result is exact; get as close to ideal exponent as possible
 
1315
                ideal_exp = self._exp - other._exp
 
1316
                while exp < ideal_exp and coeff % 10 == 0:
 
1317
                    coeff //= 10
 
1318
                    exp += 1
 
1319
 
 
1320
        ans = _dec_from_triple(sign, str(coeff), exp)
 
1321
        return ans._fix(context)
 
1322
 
 
1323
    def _divide(self, other, context):
 
1324
        """Return (self // other, self % other), to context.prec precision.
 
1325
 
 
1326
        Assumes that neither self nor other is a NaN, that self is not
 
1327
        infinite and that other is nonzero.
 
1328
        """
 
1329
        sign = self._sign ^ other._sign
 
1330
        if other._isinfinity():
 
1331
            ideal_exp = self._exp
 
1332
        else:
 
1333
            ideal_exp = min(self._exp, other._exp)
 
1334
 
 
1335
        expdiff = self.adjusted() - other.adjusted()
 
1336
        if not self or other._isinfinity() or expdiff <= -2:
 
1337
            return (_dec_from_triple(sign, '0', 0),
 
1338
                    self._rescale(ideal_exp, context.rounding))
 
1339
        if expdiff <= context.prec:
 
1340
            op1 = _WorkRep(self)
 
1341
            op2 = _WorkRep(other)
 
1342
            if op1.exp >= op2.exp:
 
1343
                op1.int *= 10**(op1.exp - op2.exp)
 
1344
            else:
 
1345
                op2.int *= 10**(op2.exp - op1.exp)
 
1346
            q, r = divmod(op1.int, op2.int)
 
1347
            if q < 10**context.prec:
 
1348
                return (_dec_from_triple(sign, str(q), 0),
 
1349
                        _dec_from_triple(self._sign, str(r), ideal_exp))
 
1350
 
 
1351
        # Here the quotient is too large to be representable
 
1352
        ans = context._raise_error(DivisionImpossible,
 
1353
                                   'quotient too large in //, % or divmod')
 
1354
        return ans, ans
 
1355
 
 
1356
    def __rtruediv__(self, other, context=None):
 
1357
        """Swaps self/other and returns __truediv__."""
 
1358
        other = _convert_other(other)
 
1359
        if other is NotImplemented:
 
1360
            return other
 
1361
        return other.__truediv__(self, context=context)
 
1362
 
 
1363
    def __divmod__(self, other, context=None):
 
1364
        """
 
1365
        Return (self // other, self % other)
 
1366
        """
 
1367
        other = _convert_other(other)
 
1368
        if other is NotImplemented:
 
1369
            return other
 
1370
 
 
1371
        if context is None:
 
1372
            context = getcontext()
 
1373
 
 
1374
        ans = self._check_nans(other, context)
 
1375
        if ans:
 
1376
            return (ans, ans)
 
1377
 
 
1378
        sign = self._sign ^ other._sign
 
1379
        if self._isinfinity():
 
1380
            if other._isinfinity():
 
1381
                ans = context._raise_error(InvalidOperation, 'divmod(INF, INF)')
 
1382
                return ans, ans
 
1383
            else:
 
1384
                return (_SignedInfinity[sign],
 
1385
                        context._raise_error(InvalidOperation, 'INF % x'))
 
1386
 
 
1387
        if not other:
 
1388
            if not self:
 
1389
                ans = context._raise_error(DivisionUndefined, 'divmod(0, 0)')
 
1390
                return ans, ans
 
1391
            else:
 
1392
                return (context._raise_error(DivisionByZero, 'x // 0', sign),
 
1393
                        context._raise_error(InvalidOperation, 'x % 0'))
 
1394
 
 
1395
        quotient, remainder = self._divide(other, context)
 
1396
        remainder = remainder._fix(context)
 
1397
        return quotient, remainder
 
1398
 
 
1399
    def __rdivmod__(self, other, context=None):
 
1400
        """Swaps self/other and returns __divmod__."""
 
1401
        other = _convert_other(other)
 
1402
        if other is NotImplemented:
 
1403
            return other
 
1404
        return other.__divmod__(self, context=context)
 
1405
 
 
1406
    def __mod__(self, other, context=None):
 
1407
        """
 
1408
        self % other
 
1409
        """
 
1410
        other = _convert_other(other)
 
1411
        if other is NotImplemented:
 
1412
            return other
 
1413
 
 
1414
        if context is None:
 
1415
            context = getcontext()
 
1416
 
 
1417
        ans = self._check_nans(other, context)
 
1418
        if ans:
 
1419
            return ans
 
1420
 
 
1421
        if self._isinfinity():
 
1422
            return context._raise_error(InvalidOperation, 'INF % x')
 
1423
        elif not other:
 
1424
            if self:
 
1425
                return context._raise_error(InvalidOperation, 'x % 0')
 
1426
            else:
 
1427
                return context._raise_error(DivisionUndefined, '0 % 0')
 
1428
 
 
1429
        remainder = self._divide(other, context)[1]
 
1430
        remainder = remainder._fix(context)
 
1431
        return remainder
 
1432
 
 
1433
    def __rmod__(self, other, context=None):
 
1434
        """Swaps self/other and returns __mod__."""
 
1435
        other = _convert_other(other)
 
1436
        if other is NotImplemented:
 
1437
            return other
 
1438
        return other.__mod__(self, context=context)
 
1439
 
 
1440
    def remainder_near(self, other, context=None):
 
1441
        """
 
1442
        Remainder nearest to 0-  abs(remainder-near) <= other/2
 
1443
        """
 
1444
        if context is None:
 
1445
            context = getcontext()
 
1446
 
 
1447
        other = _convert_other(other, raiseit=True)
 
1448
 
 
1449
        ans = self._check_nans(other, context)
 
1450
        if ans:
 
1451
            return ans
 
1452
 
 
1453
        # self == +/-infinity -> InvalidOperation
 
1454
        if self._isinfinity():
 
1455
            return context._raise_error(InvalidOperation,
 
1456
                                        'remainder_near(infinity, x)')
 
1457
 
 
1458
        # other == 0 -> either InvalidOperation or DivisionUndefined
 
1459
        if not other:
 
1460
            if self:
 
1461
                return context._raise_error(InvalidOperation,
 
1462
                                            'remainder_near(x, 0)')
 
1463
            else:
 
1464
                return context._raise_error(DivisionUndefined,
 
1465
                                            'remainder_near(0, 0)')
 
1466
 
 
1467
        # other = +/-infinity -> remainder = self
 
1468
        if other._isinfinity():
 
1469
            ans = Decimal(self)
 
1470
            return ans._fix(context)
 
1471
 
 
1472
        # self = 0 -> remainder = self, with ideal exponent
 
1473
        ideal_exponent = min(self._exp, other._exp)
 
1474
        if not self:
 
1475
            ans = _dec_from_triple(self._sign, '0', ideal_exponent)
 
1476
            return ans._fix(context)
 
1477
 
 
1478
        # catch most cases of large or small quotient
 
1479
        expdiff = self.adjusted() - other.adjusted()
 
1480
        if expdiff >= context.prec + 1:
 
1481
            # expdiff >= prec+1 => abs(self/other) > 10**prec
 
1482
            return context._raise_error(DivisionImpossible)
 
1483
        if expdiff <= -2:
 
1484
            # expdiff <= -2 => abs(self/other) < 0.1
 
1485
            ans = self._rescale(ideal_exponent, context.rounding)
 
1486
            return ans._fix(context)
 
1487
 
 
1488
        # adjust both arguments to have the same exponent, then divide
 
1489
        op1 = _WorkRep(self)
 
1490
        op2 = _WorkRep(other)
 
1491
        if op1.exp >= op2.exp:
 
1492
            op1.int *= 10**(op1.exp - op2.exp)
 
1493
        else:
 
1494
            op2.int *= 10**(op2.exp - op1.exp)
 
1495
        q, r = divmod(op1.int, op2.int)
 
1496
        # remainder is r*10**ideal_exponent; other is +/-op2.int *
 
1497
        # 10**ideal_exponent.   Apply correction to ensure that
 
1498
        # abs(remainder) <= abs(other)/2
 
1499
        if 2*r + (q&1) > op2.int:
 
1500
            r -= op2.int
 
1501
            q += 1
 
1502
 
 
1503
        if q >= 10**context.prec:
 
1504
            return context._raise_error(DivisionImpossible)
 
1505
 
 
1506
        # result has same sign as self unless r is negative
 
1507
        sign = self._sign
 
1508
        if r < 0:
 
1509
            sign = 1-sign
 
1510
            r = -r
 
1511
 
 
1512
        ans = _dec_from_triple(sign, str(r), ideal_exponent)
 
1513
        return ans._fix(context)
 
1514
 
 
1515
    def __floordiv__(self, other, context=None):
 
1516
        """self // other"""
 
1517
        other = _convert_other(other)
 
1518
        if other is NotImplemented:
 
1519
            return other
 
1520
 
 
1521
        if context is None:
 
1522
            context = getcontext()
 
1523
 
 
1524
        ans = self._check_nans(other, context)
 
1525
        if ans:
 
1526
            return ans
 
1527
 
 
1528
        if self._isinfinity():
 
1529
            if other._isinfinity():
 
1530
                return context._raise_error(InvalidOperation, 'INF // INF')
 
1531
            else:
 
1532
                return _SignedInfinity[self._sign ^ other._sign]
 
1533
 
 
1534
        if not other:
 
1535
            if self:
 
1536
                return context._raise_error(DivisionByZero, 'x // 0',
 
1537
                                            self._sign ^ other._sign)
 
1538
            else:
 
1539
                return context._raise_error(DivisionUndefined, '0 // 0')
 
1540
 
 
1541
        return self._divide(other, context)[0]
 
1542
 
 
1543
    def __rfloordiv__(self, other, context=None):
 
1544
        """Swaps self/other and returns __floordiv__."""
 
1545
        other = _convert_other(other)
 
1546
        if other is NotImplemented:
 
1547
            return other
 
1548
        return other.__floordiv__(self, context=context)
 
1549
 
 
1550
    def __float__(self):
 
1551
        """Float representation."""
 
1552
        return float(str(self))
 
1553
 
 
1554
    def __int__(self):
 
1555
        """Converts self to an int, truncating if necessary."""
 
1556
        if self._is_special:
 
1557
            if self._isnan():
 
1558
                context = getcontext()
 
1559
                return context._raise_error(InvalidContext)
 
1560
            elif self._isinfinity():
 
1561
                raise OverflowError("Cannot convert infinity to int")
 
1562
        s = (-1)**self._sign
 
1563
        if self._exp >= 0:
 
1564
            return s*int(self._int)*10**self._exp
 
1565
        else:
 
1566
            return s*int(self._int[:self._exp] or '0')
 
1567
 
 
1568
    __trunc__ = __int__
 
1569
 
 
1570
    def real(self):
 
1571
        return self
 
1572
    real = property(real)
 
1573
 
 
1574
    def imag(self):
 
1575
        return Decimal(0)
 
1576
    imag = property(imag)
 
1577
 
 
1578
    def conjugate(self):
 
1579
        return self
 
1580
 
 
1581
    def __complex__(self):
 
1582
        return complex(float(self))
 
1583
 
 
1584
    def _fix_nan(self, context):
 
1585
        """Decapitate the payload of a NaN to fit the context"""
 
1586
        payload = self._int
 
1587
 
 
1588
        # maximum length of payload is precision if _clamp=0,
 
1589
        # precision-1 if _clamp=1.
 
1590
        max_payload_len = context.prec - context._clamp
 
1591
        if len(payload) > max_payload_len:
 
1592
            payload = payload[len(payload)-max_payload_len:].lstrip('0')
 
1593
            return _dec_from_triple(self._sign, payload, self._exp, True)
 
1594
        return Decimal(self)
 
1595
 
 
1596
    def _fix(self, context):
 
1597
        """Round if it is necessary to keep self within prec precision.
 
1598
 
 
1599
        Rounds and fixes the exponent.  Does not raise on a sNaN.
 
1600
 
 
1601
        Arguments:
 
1602
        self - Decimal instance
 
1603
        context - context used.
 
1604
        """
 
1605
 
 
1606
        if self._is_special:
 
1607
            if self._isnan():
 
1608
                # decapitate payload if necessary
 
1609
                return self._fix_nan(context)
 
1610
            else:
 
1611
                # self is +/-Infinity; return unaltered
 
1612
                return Decimal(self)
 
1613
 
 
1614
        # if self is zero then exponent should be between Etiny and
 
1615
        # Emax if _clamp==0, and between Etiny and Etop if _clamp==1.
 
1616
        Etiny = context.Etiny()
 
1617
        Etop = context.Etop()
 
1618
        if not self:
 
1619
            exp_max = [context.Emax, Etop][context._clamp]
 
1620
            new_exp = min(max(self._exp, Etiny), exp_max)
 
1621
            if new_exp != self._exp:
 
1622
                context._raise_error(Clamped)
 
1623
                return _dec_from_triple(self._sign, '0', new_exp)
 
1624
            else:
 
1625
                return Decimal(self)
 
1626
 
 
1627
        # exp_min is the smallest allowable exponent of the result,
 
1628
        # equal to max(self.adjusted()-context.prec+1, Etiny)
 
1629
        exp_min = len(self._int) + self._exp - context.prec
 
1630
        if exp_min > Etop:
 
1631
            # overflow: exp_min > Etop iff self.adjusted() > Emax
 
1632
            context._raise_error(Inexact)
 
1633
            context._raise_error(Rounded)
 
1634
            return context._raise_error(Overflow, 'above Emax', self._sign)
 
1635
        self_is_subnormal = exp_min < Etiny
 
1636
        if self_is_subnormal:
 
1637
            context._raise_error(Subnormal)
 
1638
            exp_min = Etiny
 
1639
 
 
1640
        # round if self has too many digits
 
1641
        if self._exp < exp_min:
 
1642
            context._raise_error(Rounded)
 
1643
            digits = len(self._int) + self._exp - exp_min
 
1644
            if digits < 0:
 
1645
                self = _dec_from_triple(self._sign, '1', exp_min-1)
 
1646
                digits = 0
 
1647
            this_function = getattr(self, self._pick_rounding_function[context.rounding])
 
1648
            changed = this_function(digits)
 
1649
            coeff = self._int[:digits] or '0'
 
1650
            if changed == 1:
 
1651
                coeff = str(int(coeff)+1)
 
1652
            ans = _dec_from_triple(self._sign, coeff, exp_min)
 
1653
 
 
1654
            if changed:
 
1655
                context._raise_error(Inexact)
 
1656
                if self_is_subnormal:
 
1657
                    context._raise_error(Underflow)
 
1658
                    if not ans:
 
1659
                        # raise Clamped on underflow to 0
 
1660
                        context._raise_error(Clamped)
 
1661
                elif len(ans._int) == context.prec+1:
 
1662
                    # we get here only if rescaling rounds the
 
1663
                    # cofficient up to exactly 10**context.prec
 
1664
                    if ans._exp < Etop:
 
1665
                        ans = _dec_from_triple(ans._sign,
 
1666
                                                   ans._int[:-1], ans._exp+1)
 
1667
                    else:
 
1668
                        # Inexact and Rounded have already been raised
 
1669
                        ans = context._raise_error(Overflow, 'above Emax',
 
1670
                                                   self._sign)
 
1671
            return ans
 
1672
 
 
1673
        # fold down if _clamp == 1 and self has too few digits
 
1674
        if context._clamp == 1 and self._exp > Etop:
 
1675
            context._raise_error(Clamped)
 
1676
            self_padded = self._int + '0'*(self._exp - Etop)
 
1677
            return _dec_from_triple(self._sign, self_padded, Etop)
 
1678
 
 
1679
        # here self was representable to begin with; return unchanged
 
1680
        return Decimal(self)
 
1681
 
 
1682
    _pick_rounding_function = {}
 
1683
 
 
1684
    # for each of the rounding functions below:
 
1685
    #   self is a finite, nonzero Decimal
 
1686
    #   prec is an integer satisfying 0 <= prec < len(self._int)
 
1687
    #
 
1688
    # each function returns either -1, 0, or 1, as follows:
 
1689
    #   1 indicates that self should be rounded up (away from zero)
 
1690
    #   0 indicates that self should be truncated, and that all the
 
1691
    #     digits to be truncated are zeros (so the value is unchanged)
 
1692
    #  -1 indicates that there are nonzero digits to be truncated
 
1693
 
 
1694
    def _round_down(self, prec):
 
1695
        """Also known as round-towards-0, truncate."""
 
1696
        if _all_zeros(self._int, prec):
 
1697
            return 0
 
1698
        else:
 
1699
            return -1
 
1700
 
 
1701
    def _round_up(self, prec):
 
1702
        """Rounds away from 0."""
 
1703
        return -self._round_down(prec)
 
1704
 
 
1705
    def _round_half_up(self, prec):
 
1706
        """Rounds 5 up (away from 0)"""
 
1707
        if self._int[prec] in '56789':
 
1708
            return 1
 
1709
        elif _all_zeros(self._int, prec):
 
1710
            return 0
 
1711
        else:
 
1712
            return -1
 
1713
 
 
1714
    def _round_half_down(self, prec):
 
1715
        """Round 5 down"""
 
1716
        if _exact_half(self._int, prec):
 
1717
            return -1
 
1718
        else:
 
1719
            return self._round_half_up(prec)
 
1720
 
 
1721
    def _round_half_even(self, prec):
 
1722
        """Round 5 to even, rest to nearest."""
 
1723
        if _exact_half(self._int, prec) and \
 
1724
                (prec == 0 or self._int[prec-1] in '02468'):
 
1725
            return -1
 
1726
        else:
 
1727
            return self._round_half_up(prec)
 
1728
 
 
1729
    def _round_ceiling(self, prec):
 
1730
        """Rounds up (not away from 0 if negative.)"""
 
1731
        if self._sign:
 
1732
            return self._round_down(prec)
 
1733
        else:
 
1734
            return -self._round_down(prec)
 
1735
 
 
1736
    def _round_floor(self, prec):
 
1737
        """Rounds down (not towards 0 if negative)"""
 
1738
        if not self._sign:
 
1739
            return self._round_down(prec)
 
1740
        else:
 
1741
            return -self._round_down(prec)
 
1742
 
 
1743
    def _round_05up(self, prec):
 
1744
        """Round down unless digit prec-1 is 0 or 5."""
 
1745
        if prec and self._int[prec-1] not in '05':
 
1746
            return self._round_down(prec)
 
1747
        else:
 
1748
            return -self._round_down(prec)
 
1749
 
 
1750
    def __round__(self, n=None):
 
1751
        """Round self to the nearest integer, or to a given precision.
 
1752
 
 
1753
        If only one argument is supplied, round a finite Decimal
 
1754
        instance self to the nearest integer.  If self is infinite or
 
1755
        a NaN then a Python exception is raised.  If self is finite
 
1756
        and lies exactly halfway between two integers then it is
 
1757
        rounded to the integer with even last digit.
 
1758
 
 
1759
        >>> round(Decimal('123.456'))
 
1760
        123
 
1761
        >>> round(Decimal('-456.789'))
 
1762
        -457
 
1763
        >>> round(Decimal('-3.0'))
 
1764
        -3
 
1765
        >>> round(Decimal('2.5'))
 
1766
        2
 
1767
        >>> round(Decimal('3.5'))
 
1768
        4
 
1769
        >>> round(Decimal('Inf'))
 
1770
        Traceback (most recent call last):
 
1771
          ...
 
1772
        OverflowError: cannot round an infinity
 
1773
        >>> round(Decimal('NaN'))
 
1774
        Traceback (most recent call last):
 
1775
          ...
 
1776
        ValueError: cannot round a NaN
 
1777
 
 
1778
        If a second argument n is supplied, self is rounded to n
 
1779
        decimal places using the rounding mode for the current
 
1780
        context.
 
1781
 
 
1782
        For an integer n, round(self, -n) is exactly equivalent to
 
1783
        self.quantize(Decimal('1En')).
 
1784
 
 
1785
        >>> round(Decimal('123.456'), 0)
 
1786
        Decimal('123')
 
1787
        >>> round(Decimal('123.456'), 2)
 
1788
        Decimal('123.46')
 
1789
        >>> round(Decimal('123.456'), -2)
 
1790
        Decimal('1E+2')
 
1791
        >>> round(Decimal('-Infinity'), 37)
 
1792
        Decimal('NaN')
 
1793
        >>> round(Decimal('sNaN123'), 0)
 
1794
        Decimal('NaN123')
 
1795
 
 
1796
        """
 
1797
        if n is not None:
 
1798
            # two-argument form: use the equivalent quantize call
 
1799
            if not isinstance(n, int):
 
1800
                raise TypeError('Second argument to round should be integral')
 
1801
            exp = _dec_from_triple(0, '1', -n)
 
1802
            return self.quantize(exp)
 
1803
 
 
1804
        # one-argument form
 
1805
        if self._is_special:
 
1806
            if self.is_nan():
 
1807
                raise ValueError("cannot round a NaN")
 
1808
            else:
 
1809
                raise OverflowError("cannot round an infinity")
 
1810
        return int(self._rescale(0, ROUND_HALF_EVEN))
 
1811
 
 
1812
    def __floor__(self):
 
1813
        """Return the floor of self, as an integer.
 
1814
 
 
1815
        For a finite Decimal instance self, return the greatest
 
1816
        integer n such that n <= self.  If self is infinite or a NaN
 
1817
        then a Python exception is raised.
 
1818
 
 
1819
        """
 
1820
        if self._is_special:
 
1821
            if self.is_nan():
 
1822
                raise ValueError("cannot round a NaN")
 
1823
            else:
 
1824
                raise OverflowError("cannot round an infinity")
 
1825
        return int(self._rescale(0, ROUND_FLOOR))
 
1826
 
 
1827
    def __ceil__(self):
 
1828
        """Return the ceiling of self, as an integer.
 
1829
 
 
1830
        For a finite Decimal instance self, return the least integer n
 
1831
        such that n >= self.  If self is infinite or a NaN then a
 
1832
        Python exception is raised.
 
1833
 
 
1834
        """
 
1835
        if self._is_special:
 
1836
            if self.is_nan():
 
1837
                raise ValueError("cannot round a NaN")
 
1838
            else:
 
1839
                raise OverflowError("cannot round an infinity")
 
1840
        return int(self._rescale(0, ROUND_CEILING))
 
1841
 
 
1842
    def fma(self, other, third, context=None):
 
1843
        """Fused multiply-add.
 
1844
 
 
1845
        Returns self*other+third with no rounding of the intermediate
 
1846
        product self*other.
 
1847
 
 
1848
        self and other are multiplied together, with no rounding of
 
1849
        the result.  The third operand is then added to the result,
 
1850
        and a single final rounding is performed.
 
1851
        """
 
1852
 
 
1853
        other = _convert_other(other, raiseit=True)
 
1854
 
 
1855
        # compute product; raise InvalidOperation if either operand is
 
1856
        # a signaling NaN or if the product is zero times infinity.
 
1857
        if self._is_special or other._is_special:
 
1858
            if context is None:
 
1859
                context = getcontext()
 
1860
            if self._exp == 'N':
 
1861
                return context._raise_error(InvalidOperation, 'sNaN', self)
 
1862
            if other._exp == 'N':
 
1863
                return context._raise_error(InvalidOperation, 'sNaN', other)
 
1864
            if self._exp == 'n':
 
1865
                product = self
 
1866
            elif other._exp == 'n':
 
1867
                product = other
 
1868
            elif self._exp == 'F':
 
1869
                if not other:
 
1870
                    return context._raise_error(InvalidOperation,
 
1871
                                                'INF * 0 in fma')
 
1872
                product = _SignedInfinity[self._sign ^ other._sign]
 
1873
            elif other._exp == 'F':
 
1874
                if not self:
 
1875
                    return context._raise_error(InvalidOperation,
 
1876
                                                '0 * INF in fma')
 
1877
                product = _SignedInfinity[self._sign ^ other._sign]
 
1878
        else:
 
1879
            product = _dec_from_triple(self._sign ^ other._sign,
 
1880
                                       str(int(self._int) * int(other._int)),
 
1881
                                       self._exp + other._exp)
 
1882
 
 
1883
        third = _convert_other(third, raiseit=True)
 
1884
        return product.__add__(third, context)
 
1885
 
 
1886
    def _power_modulo(self, other, modulo, context=None):
 
1887
        """Three argument version of __pow__"""
 
1888
 
 
1889
        # if can't convert other and modulo to Decimal, raise
 
1890
        # TypeError; there's no point returning NotImplemented (no
 
1891
        # equivalent of __rpow__ for three argument pow)
 
1892
        other = _convert_other(other, raiseit=True)
 
1893
        modulo = _convert_other(modulo, raiseit=True)
 
1894
 
 
1895
        if context is None:
 
1896
            context = getcontext()
 
1897
 
 
1898
        # deal with NaNs: if there are any sNaNs then first one wins,
 
1899
        # (i.e. behaviour for NaNs is identical to that of fma)
 
1900
        self_is_nan = self._isnan()
 
1901
        other_is_nan = other._isnan()
 
1902
        modulo_is_nan = modulo._isnan()
 
1903
        if self_is_nan or other_is_nan or modulo_is_nan:
 
1904
            if self_is_nan == 2:
 
1905
                return context._raise_error(InvalidOperation, 'sNaN',
 
1906
                                        self)
 
1907
            if other_is_nan == 2:
 
1908
                return context._raise_error(InvalidOperation, 'sNaN',
 
1909
                                        other)
 
1910
            if modulo_is_nan == 2:
 
1911
                return context._raise_error(InvalidOperation, 'sNaN',
 
1912
                                        modulo)
 
1913
            if self_is_nan:
 
1914
                return self._fix_nan(context)
 
1915
            if other_is_nan:
 
1916
                return other._fix_nan(context)
 
1917
            return modulo._fix_nan(context)
 
1918
 
 
1919
        # check inputs: we apply same restrictions as Python's pow()
 
1920
        if not (self._isinteger() and
 
1921
                other._isinteger() and
 
1922
                modulo._isinteger()):
 
1923
            return context._raise_error(InvalidOperation,
 
1924
                                        'pow() 3rd argument not allowed '
 
1925
                                        'unless all arguments are integers')
 
1926
        if other < 0:
 
1927
            return context._raise_error(InvalidOperation,
 
1928
                                        'pow() 2nd argument cannot be '
 
1929
                                        'negative when 3rd argument specified')
 
1930
        if not modulo:
 
1931
            return context._raise_error(InvalidOperation,
 
1932
                                        'pow() 3rd argument cannot be 0')
 
1933
 
 
1934
        # additional restriction for decimal: the modulus must be less
 
1935
        # than 10**prec in absolute value
 
1936
        if modulo.adjusted() >= context.prec:
 
1937
            return context._raise_error(InvalidOperation,
 
1938
                                        'insufficient precision: pow() 3rd '
 
1939
                                        'argument must not have more than '
 
1940
                                        'precision digits')
 
1941
 
 
1942
        # define 0**0 == NaN, for consistency with two-argument pow
 
1943
        # (even though it hurts!)
 
1944
        if not other and not self:
 
1945
            return context._raise_error(InvalidOperation,
 
1946
                                        'at least one of pow() 1st argument '
 
1947
                                        'and 2nd argument must be nonzero ;'
 
1948
                                        '0**0 is not defined')
 
1949
 
 
1950
        # compute sign of result
 
1951
        if other._iseven():
 
1952
            sign = 0
 
1953
        else:
 
1954
            sign = self._sign
 
1955
 
 
1956
        # convert modulo to a Python integer, and self and other to
 
1957
        # Decimal integers (i.e. force their exponents to be >= 0)
 
1958
        modulo = abs(int(modulo))
 
1959
        base = _WorkRep(self.to_integral_value())
 
1960
        exponent = _WorkRep(other.to_integral_value())
 
1961
 
 
1962
        # compute result using integer pow()
 
1963
        base = (base.int % modulo * pow(10, base.exp, modulo)) % modulo
 
1964
        for i in range(exponent.exp):
 
1965
            base = pow(base, 10, modulo)
 
1966
        base = pow(base, exponent.int, modulo)
 
1967
 
 
1968
        return _dec_from_triple(sign, str(base), 0)
 
1969
 
 
1970
    def _power_exact(self, other, p):
 
1971
        """Attempt to compute self**other exactly.
 
1972
 
 
1973
        Given Decimals self and other and an integer p, attempt to
 
1974
        compute an exact result for the power self**other, with p
 
1975
        digits of precision.  Return None if self**other is not
 
1976
        exactly representable in p digits.
 
1977
 
 
1978
        Assumes that elimination of special cases has already been
 
1979
        performed: self and other must both be nonspecial; self must
 
1980
        be positive and not numerically equal to 1; other must be
 
1981
        nonzero.  For efficiency, other._exp should not be too large,
 
1982
        so that 10**abs(other._exp) is a feasible calculation."""
 
1983
 
 
1984
        # In the comments below, we write x for the value of self and
 
1985
        # y for the value of other.  Write x = xc*10**xe and y =
 
1986
        # yc*10**ye.
 
1987
 
 
1988
        # The main purpose of this method is to identify the *failure*
 
1989
        # of x**y to be exactly representable with as little effort as
 
1990
        # possible.  So we look for cheap and easy tests that
 
1991
        # eliminate the possibility of x**y being exact.  Only if all
 
1992
        # these tests are passed do we go on to actually compute x**y.
 
1993
 
 
1994
        # Here's the main idea.  First normalize both x and y.  We
 
1995
        # express y as a rational m/n, with m and n relatively prime
 
1996
        # and n>0.  Then for x**y to be exactly representable (at
 
1997
        # *any* precision), xc must be the nth power of a positive
 
1998
        # integer and xe must be divisible by n.  If m is negative
 
1999
        # then additionally xc must be a power of either 2 or 5, hence
 
2000
        # a power of 2**n or 5**n.
 
2001
        #
 
2002
        # There's a limit to how small |y| can be: if y=m/n as above
 
2003
        # then:
 
2004
        #
 
2005
        #  (1) if xc != 1 then for the result to be representable we
 
2006
        #      need xc**(1/n) >= 2, and hence also xc**|y| >= 2.  So
 
2007
        #      if |y| <= 1/nbits(xc) then xc < 2**nbits(xc) <=
 
2008
        #      2**(1/|y|), hence xc**|y| < 2 and the result is not
 
2009
        #      representable.
 
2010
        #
 
2011
        #  (2) if xe != 0, |xe|*(1/n) >= 1, so |xe|*|y| >= 1.  Hence if
 
2012
        #      |y| < 1/|xe| then the result is not representable.
 
2013
        #
 
2014
        # Note that since x is not equal to 1, at least one of (1) and
 
2015
        # (2) must apply.  Now |y| < 1/nbits(xc) iff |yc|*nbits(xc) <
 
2016
        # 10**-ye iff len(str(|yc|*nbits(xc)) <= -ye.
 
2017
        #
 
2018
        # There's also a limit to how large y can be, at least if it's
 
2019
        # positive: the normalized result will have coefficient xc**y,
 
2020
        # so if it's representable then xc**y < 10**p, and y <
 
2021
        # p/log10(xc).  Hence if y*log10(xc) >= p then the result is
 
2022
        # not exactly representable.
 
2023
 
 
2024
        # if len(str(abs(yc*xe)) <= -ye then abs(yc*xe) < 10**-ye,
 
2025
        # so |y| < 1/xe and the result is not representable.
 
2026
        # Similarly, len(str(abs(yc)*xc_bits)) <= -ye implies |y|
 
2027
        # < 1/nbits(xc).
 
2028
 
 
2029
        x = _WorkRep(self)
 
2030
        xc, xe = x.int, x.exp
 
2031
        while xc % 10 == 0:
 
2032
            xc //= 10
 
2033
            xe += 1
 
2034
 
 
2035
        y = _WorkRep(other)
 
2036
        yc, ye = y.int, y.exp
 
2037
        while yc % 10 == 0:
 
2038
            yc //= 10
 
2039
            ye += 1
 
2040
 
 
2041
        # case where xc == 1: result is 10**(xe*y), with xe*y
 
2042
        # required to be an integer
 
2043
        if xc == 1:
 
2044
            if ye >= 0:
 
2045
                exponent = xe*yc*10**ye
 
2046
            else:
 
2047
                exponent, remainder = divmod(xe*yc, 10**-ye)
 
2048
                if remainder:
 
2049
                    return None
 
2050
            if y.sign == 1:
 
2051
                exponent = -exponent
 
2052
            # if other is a nonnegative integer, use ideal exponent
 
2053
            if other._isinteger() and other._sign == 0:
 
2054
                ideal_exponent = self._exp*int(other)
 
2055
                zeros = min(exponent-ideal_exponent, p-1)
 
2056
            else:
 
2057
                zeros = 0
 
2058
            return _dec_from_triple(0, '1' + '0'*zeros, exponent-zeros)
 
2059
 
 
2060
        # case where y is negative: xc must be either a power
 
2061
        # of 2 or a power of 5.
 
2062
        if y.sign == 1:
 
2063
            last_digit = xc % 10
 
2064
            if last_digit in (2,4,6,8):
 
2065
                # quick test for power of 2
 
2066
                if xc & -xc != xc:
 
2067
                    return None
 
2068
                # now xc is a power of 2; e is its exponent
 
2069
                e = _nbits(xc)-1
 
2070
                # find e*y and xe*y; both must be integers
 
2071
                if ye >= 0:
 
2072
                    y_as_int = yc*10**ye
 
2073
                    e = e*y_as_int
 
2074
                    xe = xe*y_as_int
 
2075
                else:
 
2076
                    ten_pow = 10**-ye
 
2077
                    e, remainder = divmod(e*yc, ten_pow)
 
2078
                    if remainder:
 
2079
                        return None
 
2080
                    xe, remainder = divmod(xe*yc, ten_pow)
 
2081
                    if remainder:
 
2082
                        return None
 
2083
 
 
2084
                if e*65 >= p*93: # 93/65 > log(10)/log(5)
 
2085
                    return None
 
2086
                xc = 5**e
 
2087
 
 
2088
            elif last_digit == 5:
 
2089
                # e >= log_5(xc) if xc is a power of 5; we have
 
2090
                # equality all the way up to xc=5**2658
 
2091
                e = _nbits(xc)*28//65
 
2092
                xc, remainder = divmod(5**e, xc)
 
2093
                if remainder:
 
2094
                    return None
 
2095
                while xc % 5 == 0:
 
2096
                    xc //= 5
 
2097
                    e -= 1
 
2098
                if ye >= 0:
 
2099
                    y_as_integer = yc*10**ye
 
2100
                    e = e*y_as_integer
 
2101
                    xe = xe*y_as_integer
 
2102
                else:
 
2103
                    ten_pow = 10**-ye
 
2104
                    e, remainder = divmod(e*yc, ten_pow)
 
2105
                    if remainder:
 
2106
                        return None
 
2107
                    xe, remainder = divmod(xe*yc, ten_pow)
 
2108
                    if remainder:
 
2109
                        return None
 
2110
                if e*3 >= p*10: # 10/3 > log(10)/log(2)
 
2111
                    return None
 
2112
                xc = 2**e
 
2113
            else:
 
2114
                return None
 
2115
 
 
2116
            if xc >= 10**p:
 
2117
                return None
 
2118
            xe = -e-xe
 
2119
            return _dec_from_triple(0, str(xc), xe)
 
2120
 
 
2121
        # now y is positive; find m and n such that y = m/n
 
2122
        if ye >= 0:
 
2123
            m, n = yc*10**ye, 1
 
2124
        else:
 
2125
            if xe != 0 and len(str(abs(yc*xe))) <= -ye:
 
2126
                return None
 
2127
            xc_bits = _nbits(xc)
 
2128
            if xc != 1 and len(str(abs(yc)*xc_bits)) <= -ye:
 
2129
                return None
 
2130
            m, n = yc, 10**(-ye)
 
2131
            while m % 2 == n % 2 == 0:
 
2132
                m //= 2
 
2133
                n //= 2
 
2134
            while m % 5 == n % 5 == 0:
 
2135
                m //= 5
 
2136
                n //= 5
 
2137
 
 
2138
        # compute nth root of xc*10**xe
 
2139
        if n > 1:
 
2140
            # if 1 < xc < 2**n then xc isn't an nth power
 
2141
            if xc != 1 and xc_bits <= n:
 
2142
                return None
 
2143
 
 
2144
            xe, rem = divmod(xe, n)
 
2145
            if rem != 0:
 
2146
                return None
 
2147
 
 
2148
            # compute nth root of xc using Newton's method
 
2149
            a = 1 << -(-_nbits(xc)//n) # initial estimate
 
2150
            while True:
 
2151
                q, r = divmod(xc, a**(n-1))
 
2152
                if a <= q:
 
2153
                    break
 
2154
                else:
 
2155
                    a = (a*(n-1) + q)//n
 
2156
            if not (a == q and r == 0):
 
2157
                return None
 
2158
            xc = a
 
2159
 
 
2160
        # now xc*10**xe is the nth root of the original xc*10**xe
 
2161
        # compute mth power of xc*10**xe
 
2162
 
 
2163
        # if m > p*100//_log10_lb(xc) then m > p/log10(xc), hence xc**m >
 
2164
        # 10**p and the result is not representable.
 
2165
        if xc > 1 and m > p*100//_log10_lb(xc):
 
2166
            return None
 
2167
        xc = xc**m
 
2168
        xe *= m
 
2169
        if xc > 10**p:
 
2170
            return None
 
2171
 
 
2172
        # by this point the result *is* exactly representable
 
2173
        # adjust the exponent to get as close as possible to the ideal
 
2174
        # exponent, if necessary
 
2175
        str_xc = str(xc)
 
2176
        if other._isinteger() and other._sign == 0:
 
2177
            ideal_exponent = self._exp*int(other)
 
2178
            zeros = min(xe-ideal_exponent, p-len(str_xc))
 
2179
        else:
 
2180
            zeros = 0
 
2181
        return _dec_from_triple(0, str_xc+'0'*zeros, xe-zeros)
 
2182
 
 
2183
    def __pow__(self, other, modulo=None, context=None):
 
2184
        """Return self ** other [ % modulo].
 
2185
 
 
2186
        With two arguments, compute self**other.
 
2187
 
 
2188
        With three arguments, compute (self**other) % modulo.  For the
 
2189
        three argument form, the following restrictions on the
 
2190
        arguments hold:
 
2191
 
 
2192
         - all three arguments must be integral
 
2193
         - other must be nonnegative
 
2194
         - either self or other (or both) must be nonzero
 
2195
         - modulo must be nonzero and must have at most p digits,
 
2196
           where p is the context precision.
 
2197
 
 
2198
        If any of these restrictions is violated the InvalidOperation
 
2199
        flag is raised.
 
2200
 
 
2201
        The result of pow(self, other, modulo) is identical to the
 
2202
        result that would be obtained by computing (self**other) %
 
2203
        modulo with unbounded precision, but is computed more
 
2204
        efficiently.  It is always exact.
 
2205
        """
 
2206
 
 
2207
        if modulo is not None:
 
2208
            return self._power_modulo(other, modulo, context)
 
2209
 
 
2210
        other = _convert_other(other)
 
2211
        if other is NotImplemented:
 
2212
            return other
 
2213
 
 
2214
        if context is None:
 
2215
            context = getcontext()
 
2216
 
 
2217
        # either argument is a NaN => result is NaN
 
2218
        ans = self._check_nans(other, context)
 
2219
        if ans:
 
2220
            return ans
 
2221
 
 
2222
        # 0**0 = NaN (!), x**0 = 1 for nonzero x (including +/-Infinity)
 
2223
        if not other:
 
2224
            if not self:
 
2225
                return context._raise_error(InvalidOperation, '0 ** 0')
 
2226
            else:
 
2227
                return _One
 
2228
 
 
2229
        # result has sign 1 iff self._sign is 1 and other is an odd integer
 
2230
        result_sign = 0
 
2231
        if self._sign == 1:
 
2232
            if other._isinteger():
 
2233
                if not other._iseven():
 
2234
                    result_sign = 1
 
2235
            else:
 
2236
                # -ve**noninteger = NaN
 
2237
                # (-0)**noninteger = 0**noninteger
 
2238
                if self:
 
2239
                    return context._raise_error(InvalidOperation,
 
2240
                        'x ** y with x negative and y not an integer')
 
2241
            # negate self, without doing any unwanted rounding
 
2242
            self = self.copy_negate()
 
2243
 
 
2244
        # 0**(+ve or Inf)= 0; 0**(-ve or -Inf) = Infinity
 
2245
        if not self:
 
2246
            if other._sign == 0:
 
2247
                return _dec_from_triple(result_sign, '0', 0)
 
2248
            else:
 
2249
                return _SignedInfinity[result_sign]
 
2250
 
 
2251
        # Inf**(+ve or Inf) = Inf; Inf**(-ve or -Inf) = 0
 
2252
        if self._isinfinity():
 
2253
            if other._sign == 0:
 
2254
                return _SignedInfinity[result_sign]
 
2255
            else:
 
2256
                return _dec_from_triple(result_sign, '0', 0)
 
2257
 
 
2258
        # 1**other = 1, but the choice of exponent and the flags
 
2259
        # depend on the exponent of self, and on whether other is a
 
2260
        # positive integer, a negative integer, or neither
 
2261
        if self == _One:
 
2262
            if other._isinteger():
 
2263
                # exp = max(self._exp*max(int(other), 0),
 
2264
                # 1-context.prec) but evaluating int(other) directly
 
2265
                # is dangerous until we know other is small (other
 
2266
                # could be 1e999999999)
 
2267
                if other._sign == 1:
 
2268
                    multiplier = 0
 
2269
                elif other > context.prec:
 
2270
                    multiplier = context.prec
 
2271
                else:
 
2272
                    multiplier = int(other)
 
2273
 
 
2274
                exp = self._exp * multiplier
 
2275
                if exp < 1-context.prec:
 
2276
                    exp = 1-context.prec
 
2277
                    context._raise_error(Rounded)
 
2278
            else:
 
2279
                context._raise_error(Inexact)
 
2280
                context._raise_error(Rounded)
 
2281
                exp = 1-context.prec
 
2282
 
 
2283
            return _dec_from_triple(result_sign, '1'+'0'*-exp, exp)
 
2284
 
 
2285
        # compute adjusted exponent of self
 
2286
        self_adj = self.adjusted()
 
2287
 
 
2288
        # self ** infinity is infinity if self > 1, 0 if self < 1
 
2289
        # self ** -infinity is infinity if self < 1, 0 if self > 1
 
2290
        if other._isinfinity():
 
2291
            if (other._sign == 0) == (self_adj < 0):
 
2292
                return _dec_from_triple(result_sign, '0', 0)
 
2293
            else:
 
2294
                return _SignedInfinity[result_sign]
 
2295
 
 
2296
        # from here on, the result always goes through the call
 
2297
        # to _fix at the end of this function.
 
2298
        ans = None
 
2299
 
 
2300
        # crude test to catch cases of extreme overflow/underflow.  If
 
2301
        # log10(self)*other >= 10**bound and bound >= len(str(Emax))
 
2302
        # then 10**bound >= 10**len(str(Emax)) >= Emax+1 and hence
 
2303
        # self**other >= 10**(Emax+1), so overflow occurs.  The test
 
2304
        # for underflow is similar.
 
2305
        bound = self._log10_exp_bound() + other.adjusted()
 
2306
        if (self_adj >= 0) == (other._sign == 0):
 
2307
            # self > 1 and other +ve, or self < 1 and other -ve
 
2308
            # possibility of overflow
 
2309
            if bound >= len(str(context.Emax)):
 
2310
                ans = _dec_from_triple(result_sign, '1', context.Emax+1)
 
2311
        else:
 
2312
            # self > 1 and other -ve, or self < 1 and other +ve
 
2313
            # possibility of underflow to 0
 
2314
            Etiny = context.Etiny()
 
2315
            if bound >= len(str(-Etiny)):
 
2316
                ans = _dec_from_triple(result_sign, '1', Etiny-1)
 
2317
 
 
2318
        # try for an exact result with precision +1
 
2319
        if ans is None:
 
2320
            ans = self._power_exact(other, context.prec + 1)
 
2321
            if ans is not None and result_sign == 1:
 
2322
                ans = _dec_from_triple(1, ans._int, ans._exp)
 
2323
 
 
2324
        # usual case: inexact result, x**y computed directly as exp(y*log(x))
 
2325
        if ans is None:
 
2326
            p = context.prec
 
2327
            x = _WorkRep(self)
 
2328
            xc, xe = x.int, x.exp
 
2329
            y = _WorkRep(other)
 
2330
            yc, ye = y.int, y.exp
 
2331
            if y.sign == 1:
 
2332
                yc = -yc
 
2333
 
 
2334
            # compute correctly rounded result:  start with precision +3,
 
2335
            # then increase precision until result is unambiguously roundable
 
2336
            extra = 3
 
2337
            while True:
 
2338
                coeff, exp = _dpower(xc, xe, yc, ye, p+extra)
 
2339
                if coeff % (5*10**(len(str(coeff))-p-1)):
 
2340
                    break
 
2341
                extra += 3
 
2342
 
 
2343
            ans = _dec_from_triple(result_sign, str(coeff), exp)
 
2344
 
 
2345
        # the specification says that for non-integer other we need to
 
2346
        # raise Inexact, even when the result is actually exact.  In
 
2347
        # the same way, we need to raise Underflow here if the result
 
2348
        # is subnormal.  (The call to _fix will take care of raising
 
2349
        # Rounded and Subnormal, as usual.)
 
2350
        if not other._isinteger():
 
2351
            context._raise_error(Inexact)
 
2352
            # pad with zeros up to length context.prec+1 if necessary
 
2353
            if len(ans._int) <= context.prec:
 
2354
                expdiff = context.prec+1 - len(ans._int)
 
2355
                ans = _dec_from_triple(ans._sign, ans._int+'0'*expdiff,
 
2356
                                       ans._exp-expdiff)
 
2357
            if ans.adjusted() < context.Emin:
 
2358
                context._raise_error(Underflow)
 
2359
 
 
2360
        # unlike exp, ln and log10, the power function respects the
 
2361
        # rounding mode; no need to use ROUND_HALF_EVEN here
 
2362
        ans = ans._fix(context)
 
2363
        return ans
 
2364
 
 
2365
    def __rpow__(self, other, context=None):
 
2366
        """Swaps self/other and returns __pow__."""
 
2367
        other = _convert_other(other)
 
2368
        if other is NotImplemented:
 
2369
            return other
 
2370
        return other.__pow__(self, context=context)
 
2371
 
 
2372
    def normalize(self, context=None):
 
2373
        """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
 
2374
 
 
2375
        if context is None:
 
2376
            context = getcontext()
 
2377
 
 
2378
        if self._is_special:
 
2379
            ans = self._check_nans(context=context)
 
2380
            if ans:
 
2381
                return ans
 
2382
 
 
2383
        dup = self._fix(context)
 
2384
        if dup._isinfinity():
 
2385
            return dup
 
2386
 
 
2387
        if not dup:
 
2388
            return _dec_from_triple(dup._sign, '0', 0)
 
2389
        exp_max = [context.Emax, context.Etop()][context._clamp]
 
2390
        end = len(dup._int)
 
2391
        exp = dup._exp
 
2392
        while dup._int[end-1] == '0' and exp < exp_max:
 
2393
            exp += 1
 
2394
            end -= 1
 
2395
        return _dec_from_triple(dup._sign, dup._int[:end], exp)
 
2396
 
 
2397
    def quantize(self, exp, rounding=None, context=None, watchexp=True):
 
2398
        """Quantize self so its exponent is the same as that of exp.
 
2399
 
 
2400
        Similar to self._rescale(exp._exp) but with error checking.
 
2401
        """
 
2402
        exp = _convert_other(exp, raiseit=True)
 
2403
 
 
2404
        if context is None:
 
2405
            context = getcontext()
 
2406
        if rounding is None:
 
2407
            rounding = context.rounding
 
2408
 
 
2409
        if self._is_special or exp._is_special:
 
2410
            ans = self._check_nans(exp, context)
 
2411
            if ans:
 
2412
                return ans
 
2413
 
 
2414
            if exp._isinfinity() or self._isinfinity():
 
2415
                if exp._isinfinity() and self._isinfinity():
 
2416
                    return Decimal(self)  # if both are inf, it is OK
 
2417
                return context._raise_error(InvalidOperation,
 
2418
                                        'quantize with one INF')
 
2419
 
 
2420
        # if we're not watching exponents, do a simple rescale
 
2421
        if not watchexp:
 
2422
            ans = self._rescale(exp._exp, rounding)
 
2423
            # raise Inexact and Rounded where appropriate
 
2424
            if ans._exp > self._exp:
 
2425
                context._raise_error(Rounded)
 
2426
                if ans != self:
 
2427
                    context._raise_error(Inexact)
 
2428
            return ans
 
2429
 
 
2430
        # exp._exp should be between Etiny and Emax
 
2431
        if not (context.Etiny() <= exp._exp <= context.Emax):
 
2432
            return context._raise_error(InvalidOperation,
 
2433
                   'target exponent out of bounds in quantize')
 
2434
 
 
2435
        if not self:
 
2436
            ans = _dec_from_triple(self._sign, '0', exp._exp)
 
2437
            return ans._fix(context)
 
2438
 
 
2439
        self_adjusted = self.adjusted()
 
2440
        if self_adjusted > context.Emax:
 
2441
            return context._raise_error(InvalidOperation,
 
2442
                                        'exponent of quantize result too large for current context')
 
2443
        if self_adjusted - exp._exp + 1 > context.prec:
 
2444
            return context._raise_error(InvalidOperation,
 
2445
                                        'quantize result has too many digits for current context')
 
2446
 
 
2447
        ans = self._rescale(exp._exp, rounding)
 
2448
        if ans.adjusted() > context.Emax:
 
2449
            return context._raise_error(InvalidOperation,
 
2450
                                        'exponent of quantize result too large for current context')
 
2451
        if len(ans._int) > context.prec:
 
2452
            return context._raise_error(InvalidOperation,
 
2453
                                        'quantize result has too many digits for current context')
 
2454
 
 
2455
        # raise appropriate flags
 
2456
        if ans._exp > self._exp:
 
2457
            context._raise_error(Rounded)
 
2458
            if ans != self:
 
2459
                context._raise_error(Inexact)
 
2460
        if ans and ans.adjusted() < context.Emin:
 
2461
            context._raise_error(Subnormal)
 
2462
 
 
2463
        # call to fix takes care of any necessary folddown
 
2464
        ans = ans._fix(context)
 
2465
        return ans
 
2466
 
 
2467
    def same_quantum(self, other):
 
2468
        """Return True if self and other have the same exponent; otherwise
 
2469
        return False.
 
2470
 
 
2471
        If either operand is a special value, the following rules are used:
 
2472
           * return True if both operands are infinities
 
2473
           * return True if both operands are NaNs
 
2474
           * otherwise, return False.
 
2475
        """
 
2476
        other = _convert_other(other, raiseit=True)
 
2477
        if self._is_special or other._is_special:
 
2478
            return (self.is_nan() and other.is_nan() or
 
2479
                    self.is_infinite() and other.is_infinite())
 
2480
        return self._exp == other._exp
 
2481
 
 
2482
    def _rescale(self, exp, rounding):
 
2483
        """Rescale self so that the exponent is exp, either by padding with zeros
 
2484
        or by truncating digits, using the given rounding mode.
 
2485
 
 
2486
        Specials are returned without change.  This operation is
 
2487
        quiet: it raises no flags, and uses no information from the
 
2488
        context.
 
2489
 
 
2490
        exp = exp to scale to (an integer)
 
2491
        rounding = rounding mode
 
2492
        """
 
2493
        if self._is_special:
 
2494
            return Decimal(self)
 
2495
        if not self:
 
2496
            return _dec_from_triple(self._sign, '0', exp)
 
2497
 
 
2498
        if self._exp >= exp:
 
2499
            # pad answer with zeros if necessary
 
2500
            return _dec_from_triple(self._sign,
 
2501
                                        self._int + '0'*(self._exp - exp), exp)
 
2502
 
 
2503
        # too many digits; round and lose data.  If self.adjusted() <
 
2504
        # exp-1, replace self by 10**(exp-1) before rounding
 
2505
        digits = len(self._int) + self._exp - exp
 
2506
        if digits < 0:
 
2507
            self = _dec_from_triple(self._sign, '1', exp-1)
 
2508
            digits = 0
 
2509
        this_function = getattr(self, self._pick_rounding_function[rounding])
 
2510
        changed = this_function(digits)
 
2511
        coeff = self._int[:digits] or '0'
 
2512
        if changed == 1:
 
2513
            coeff = str(int(coeff)+1)
 
2514
        return _dec_from_triple(self._sign, coeff, exp)
 
2515
 
 
2516
    def _round(self, places, rounding):
 
2517
        """Round a nonzero, nonspecial Decimal to a fixed number of
 
2518
        significant figures, using the given rounding mode.
 
2519
 
 
2520
        Infinities, NaNs and zeros are returned unaltered.
 
2521
 
 
2522
        This operation is quiet: it raises no flags, and uses no
 
2523
        information from the context.
 
2524
 
 
2525
        """
 
2526
        if places <= 0:
 
2527
            raise ValueError("argument should be at least 1 in _round")
 
2528
        if self._is_special or not self:
 
2529
            return Decimal(self)
 
2530
        ans = self._rescale(self.adjusted()+1-places, rounding)
 
2531
        # it can happen that the rescale alters the adjusted exponent;
 
2532
        # for example when rounding 99.97 to 3 significant figures.
 
2533
        # When this happens we end up with an extra 0 at the end of
 
2534
        # the number; a second rescale fixes this.
 
2535
        if ans.adjusted() != self.adjusted():
 
2536
            ans = ans._rescale(ans.adjusted()+1-places, rounding)
 
2537
        return ans
 
2538
 
 
2539
    def to_integral_exact(self, rounding=None, context=None):
 
2540
        """Rounds to a nearby integer.
 
2541
 
 
2542
        If no rounding mode is specified, take the rounding mode from
 
2543
        the context.  This method raises the Rounded and Inexact flags
 
2544
        when appropriate.
 
2545
 
 
2546
        See also: to_integral_value, which does exactly the same as
 
2547
        this method except that it doesn't raise Inexact or Rounded.
 
2548
        """
 
2549
        if self._is_special:
 
2550
            ans = self._check_nans(context=context)
 
2551
            if ans:
 
2552
                return ans
 
2553
            return Decimal(self)
 
2554
        if self._exp >= 0:
 
2555
            return Decimal(self)
 
2556
        if not self:
 
2557
            return _dec_from_triple(self._sign, '0', 0)
 
2558
        if context is None:
 
2559
            context = getcontext()
 
2560
        if rounding is None:
 
2561
            rounding = context.rounding
 
2562
        context._raise_error(Rounded)
 
2563
        ans = self._rescale(0, rounding)
 
2564
        if ans != self:
 
2565
            context._raise_error(Inexact)
 
2566
        return ans
 
2567
 
 
2568
    def to_integral_value(self, rounding=None, context=None):
 
2569
        """Rounds to the nearest integer, without raising inexact, rounded."""
 
2570
        if context is None:
 
2571
            context = getcontext()
 
2572
        if rounding is None:
 
2573
            rounding = context.rounding
 
2574
        if self._is_special:
 
2575
            ans = self._check_nans(context=context)
 
2576
            if ans:
 
2577
                return ans
 
2578
            return Decimal(self)
 
2579
        if self._exp >= 0:
 
2580
            return Decimal(self)
 
2581
        else:
 
2582
            return self._rescale(0, rounding)
 
2583
 
 
2584
    # the method name changed, but we provide also the old one, for compatibility
 
2585
    to_integral = to_integral_value
 
2586
 
 
2587
    def sqrt(self, context=None):
 
2588
        """Return the square root of self."""
 
2589
        if context is None:
 
2590
            context = getcontext()
 
2591
 
 
2592
        if self._is_special:
 
2593
            ans = self._check_nans(context=context)
 
2594
            if ans:
 
2595
                return ans
 
2596
 
 
2597
            if self._isinfinity() and self._sign == 0:
 
2598
                return Decimal(self)
 
2599
 
 
2600
        if not self:
 
2601
            # exponent = self._exp // 2.  sqrt(-0) = -0
 
2602
            ans = _dec_from_triple(self._sign, '0', self._exp // 2)
 
2603
            return ans._fix(context)
 
2604
 
 
2605
        if self._sign == 1:
 
2606
            return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
 
2607
 
 
2608
        # At this point self represents a positive number.  Let p be
 
2609
        # the desired precision and express self in the form c*100**e
 
2610
        # with c a positive real number and e an integer, c and e
 
2611
        # being chosen so that 100**(p-1) <= c < 100**p.  Then the
 
2612
        # (exact) square root of self is sqrt(c)*10**e, and 10**(p-1)
 
2613
        # <= sqrt(c) < 10**p, so the closest representable Decimal at
 
2614
        # precision p is n*10**e where n = round_half_even(sqrt(c)),
 
2615
        # the closest integer to sqrt(c) with the even integer chosen
 
2616
        # in the case of a tie.
 
2617
        #
 
2618
        # To ensure correct rounding in all cases, we use the
 
2619
        # following trick: we compute the square root to an extra
 
2620
        # place (precision p+1 instead of precision p), rounding down.
 
2621
        # Then, if the result is inexact and its last digit is 0 or 5,
 
2622
        # we increase the last digit to 1 or 6 respectively; if it's
 
2623
        # exact we leave the last digit alone.  Now the final round to
 
2624
        # p places (or fewer in the case of underflow) will round
 
2625
        # correctly and raise the appropriate flags.
 
2626
 
 
2627
        # use an extra digit of precision
 
2628
        prec = context.prec+1
 
2629
 
 
2630
        # write argument in the form c*100**e where e = self._exp//2
 
2631
        # is the 'ideal' exponent, to be used if the square root is
 
2632
        # exactly representable.  l is the number of 'digits' of c in
 
2633
        # base 100, so that 100**(l-1) <= c < 100**l.
 
2634
        op = _WorkRep(self)
 
2635
        e = op.exp >> 1
 
2636
        if op.exp & 1:
 
2637
            c = op.int * 10
 
2638
            l = (len(self._int) >> 1) + 1
 
2639
        else:
 
2640
            c = op.int
 
2641
            l = len(self._int)+1 >> 1
 
2642
 
 
2643
        # rescale so that c has exactly prec base 100 'digits'
 
2644
        shift = prec-l
 
2645
        if shift >= 0:
 
2646
            c *= 100**shift
 
2647
            exact = True
 
2648
        else:
 
2649
            c, remainder = divmod(c, 100**-shift)
 
2650
            exact = not remainder
 
2651
        e -= shift
 
2652
 
 
2653
        # find n = floor(sqrt(c)) using Newton's method
 
2654
        n = 10**prec
 
2655
        while True:
 
2656
            q = c//n
 
2657
            if n <= q:
 
2658
                break
 
2659
            else:
 
2660
                n = n + q >> 1
 
2661
        exact = exact and n*n == c
 
2662
 
 
2663
        if exact:
 
2664
            # result is exact; rescale to use ideal exponent e
 
2665
            if shift >= 0:
 
2666
                # assert n % 10**shift == 0
 
2667
                n //= 10**shift
 
2668
            else:
 
2669
                n *= 10**-shift
 
2670
            e += shift
 
2671
        else:
 
2672
            # result is not exact; fix last digit as described above
 
2673
            if n % 5 == 0:
 
2674
                n += 1
 
2675
 
 
2676
        ans = _dec_from_triple(0, str(n), e)
 
2677
 
 
2678
        # round, and fit to current context
 
2679
        context = context._shallow_copy()
 
2680
        rounding = context._set_rounding(ROUND_HALF_EVEN)
 
2681
        ans = ans._fix(context)
 
2682
        context.rounding = rounding
 
2683
 
 
2684
        return ans
 
2685
 
 
2686
    def max(self, other, context=None):
 
2687
        """Returns the larger value.
 
2688
 
 
2689
        Like max(self, other) except if one is not a number, returns
 
2690
        NaN (and signals if one is sNaN).  Also rounds.
 
2691
        """
 
2692
        other = _convert_other(other, raiseit=True)
 
2693
 
 
2694
        if context is None:
 
2695
            context = getcontext()
 
2696
 
 
2697
        if self._is_special or other._is_special:
 
2698
            # If one operand is a quiet NaN and the other is number, then the
 
2699
            # number is always returned
 
2700
            sn = self._isnan()
 
2701
            on = other._isnan()
 
2702
            if sn or on:
 
2703
                if on == 1 and sn == 0:
 
2704
                    return self._fix(context)
 
2705
                if sn == 1 and on == 0:
 
2706
                    return other._fix(context)
 
2707
                return self._check_nans(other, context)
 
2708
 
 
2709
        c = self._cmp(other)
 
2710
        if c == 0:
 
2711
            # If both operands are finite and equal in numerical value
 
2712
            # then an ordering is applied:
 
2713
            #
 
2714
            # If the signs differ then max returns the operand with the
 
2715
            # positive sign and min returns the operand with the negative sign
 
2716
            #
 
2717
            # If the signs are the same then the exponent is used to select
 
2718
            # the result.  This is exactly the ordering used in compare_total.
 
2719
            c = self.compare_total(other)
 
2720
 
 
2721
        if c == -1:
 
2722
            ans = other
 
2723
        else:
 
2724
            ans = self
 
2725
 
 
2726
        return ans._fix(context)
 
2727
 
 
2728
    def min(self, other, context=None):
 
2729
        """Returns the smaller value.
 
2730
 
 
2731
        Like min(self, other) except if one is not a number, returns
 
2732
        NaN (and signals if one is sNaN).  Also rounds.
 
2733
        """
 
2734
        other = _convert_other(other, raiseit=True)
 
2735
 
 
2736
        if context is None:
 
2737
            context = getcontext()
 
2738
 
 
2739
        if self._is_special or other._is_special:
 
2740
            # If one operand is a quiet NaN and the other is number, then the
 
2741
            # number is always returned
 
2742
            sn = self._isnan()
 
2743
            on = other._isnan()
 
2744
            if sn or on:
 
2745
                if on == 1 and sn == 0:
 
2746
                    return self._fix(context)
 
2747
                if sn == 1 and on == 0:
 
2748
                    return other._fix(context)
 
2749
                return self._check_nans(other, context)
 
2750
 
 
2751
        c = self._cmp(other)
 
2752
        if c == 0:
 
2753
            c = self.compare_total(other)
 
2754
 
 
2755
        if c == -1:
 
2756
            ans = self
 
2757
        else:
 
2758
            ans = other
 
2759
 
 
2760
        return ans._fix(context)
 
2761
 
 
2762
    def _isinteger(self):
 
2763
        """Returns whether self is an integer"""
 
2764
        if self._is_special:
 
2765
            return False
 
2766
        if self._exp >= 0:
 
2767
            return True
 
2768
        rest = self._int[self._exp:]
 
2769
        return rest == '0'*len(rest)
 
2770
 
 
2771
    def _iseven(self):
 
2772
        """Returns True if self is even.  Assumes self is an integer."""
 
2773
        if not self or self._exp > 0:
 
2774
            return True
 
2775
        return self._int[-1+self._exp] in '02468'
 
2776
 
 
2777
    def adjusted(self):
 
2778
        """Return the adjusted exponent of self"""
 
2779
        try:
 
2780
            return self._exp + len(self._int) - 1
 
2781
        # If NaN or Infinity, self._exp is string
 
2782
        except TypeError:
 
2783
            return 0
 
2784
 
 
2785
    def canonical(self, context=None):
 
2786
        """Returns the same Decimal object.
 
2787
 
 
2788
        As we do not have different encodings for the same number, the
 
2789
        received object already is in its canonical form.
 
2790
        """
 
2791
        return self
 
2792
 
 
2793
    def compare_signal(self, other, context=None):
 
2794
        """Compares self to the other operand numerically.
 
2795
 
 
2796
        It's pretty much like compare(), but all NaNs signal, with signaling
 
2797
        NaNs taking precedence over quiet NaNs.
 
2798
        """
 
2799
        other = _convert_other(other, raiseit = True)
 
2800
        ans = self._compare_check_nans(other, context)
 
2801
        if ans:
 
2802
            return ans
 
2803
        return self.compare(other, context=context)
 
2804
 
 
2805
    def compare_total(self, other):
 
2806
        """Compares self to other using the abstract representations.
 
2807
 
 
2808
        This is not like the standard compare, which use their numerical
 
2809
        value. Note that a total ordering is defined for all possible abstract
 
2810
        representations.
 
2811
        """
 
2812
        # if one is negative and the other is positive, it's easy
 
2813
        if self._sign and not other._sign:
 
2814
            return _NegativeOne
 
2815
        if not self._sign and other._sign:
 
2816
            return _One
 
2817
        sign = self._sign
 
2818
 
 
2819
        # let's handle both NaN types
 
2820
        self_nan = self._isnan()
 
2821
        other_nan = other._isnan()
 
2822
        if self_nan or other_nan:
 
2823
            if self_nan == other_nan:
 
2824
                if self._int < other._int:
 
2825
                    if sign:
 
2826
                        return _One
 
2827
                    else:
 
2828
                        return _NegativeOne
 
2829
                if self._int > other._int:
 
2830
                    if sign:
 
2831
                        return _NegativeOne
 
2832
                    else:
 
2833
                        return _One
 
2834
                return _Zero
 
2835
 
 
2836
            if sign:
 
2837
                if self_nan == 1:
 
2838
                    return _NegativeOne
 
2839
                if other_nan == 1:
 
2840
                    return _One
 
2841
                if self_nan == 2:
 
2842
                    return _NegativeOne
 
2843
                if other_nan == 2:
 
2844
                    return _One
 
2845
            else:
 
2846
                if self_nan == 1:
 
2847
                    return _One
 
2848
                if other_nan == 1:
 
2849
                    return _NegativeOne
 
2850
                if self_nan == 2:
 
2851
                    return _One
 
2852
                if other_nan == 2:
 
2853
                    return _NegativeOne
 
2854
 
 
2855
        if self < other:
 
2856
            return _NegativeOne
 
2857
        if self > other:
 
2858
            return _One
 
2859
 
 
2860
        if self._exp < other._exp:
 
2861
            if sign:
 
2862
                return _One
 
2863
            else:
 
2864
                return _NegativeOne
 
2865
        if self._exp > other._exp:
 
2866
            if sign:
 
2867
                return _NegativeOne
 
2868
            else:
 
2869
                return _One
 
2870
        return _Zero
 
2871
 
 
2872
 
 
2873
    def compare_total_mag(self, other):
 
2874
        """Compares self to other using abstract repr., ignoring sign.
 
2875
 
 
2876
        Like compare_total, but with operand's sign ignored and assumed to be 0.
 
2877
        """
 
2878
        s = self.copy_abs()
 
2879
        o = other.copy_abs()
 
2880
        return s.compare_total(o)
 
2881
 
 
2882
    def copy_abs(self):
 
2883
        """Returns a copy with the sign set to 0. """
 
2884
        return _dec_from_triple(0, self._int, self._exp, self._is_special)
 
2885
 
 
2886
    def copy_negate(self):
 
2887
        """Returns a copy with the sign inverted."""
 
2888
        if self._sign:
 
2889
            return _dec_from_triple(0, self._int, self._exp, self._is_special)
 
2890
        else:
 
2891
            return _dec_from_triple(1, self._int, self._exp, self._is_special)
 
2892
 
 
2893
    def copy_sign(self, other):
 
2894
        """Returns self with the sign of other."""
 
2895
        return _dec_from_triple(other._sign, self._int,
 
2896
                                self._exp, self._is_special)
 
2897
 
 
2898
    def exp(self, context=None):
 
2899
        """Returns e ** self."""
 
2900
 
 
2901
        if context is None:
 
2902
            context = getcontext()
 
2903
 
 
2904
        # exp(NaN) = NaN
 
2905
        ans = self._check_nans(context=context)
 
2906
        if ans:
 
2907
            return ans
 
2908
 
 
2909
        # exp(-Infinity) = 0
 
2910
        if self._isinfinity() == -1:
 
2911
            return _Zero
 
2912
 
 
2913
        # exp(0) = 1
 
2914
        if not self:
 
2915
            return _One
 
2916
 
 
2917
        # exp(Infinity) = Infinity
 
2918
        if self._isinfinity() == 1:
 
2919
            return Decimal(self)
 
2920
 
 
2921
        # the result is now guaranteed to be inexact (the true
 
2922
        # mathematical result is transcendental). There's no need to
 
2923
        # raise Rounded and Inexact here---they'll always be raised as
 
2924
        # a result of the call to _fix.
 
2925
        p = context.prec
 
2926
        adj = self.adjusted()
 
2927
 
 
2928
        # we only need to do any computation for quite a small range
 
2929
        # of adjusted exponents---for example, -29 <= adj <= 10 for
 
2930
        # the default context.  For smaller exponent the result is
 
2931
        # indistinguishable from 1 at the given precision, while for
 
2932
        # larger exponent the result either overflows or underflows.
 
2933
        if self._sign == 0 and adj > len(str((context.Emax+1)*3)):
 
2934
            # overflow
 
2935
            ans = _dec_from_triple(0, '1', context.Emax+1)
 
2936
        elif self._sign == 1 and adj > len(str((-context.Etiny()+1)*3)):
 
2937
            # underflow to 0
 
2938
            ans = _dec_from_triple(0, '1', context.Etiny()-1)
 
2939
        elif self._sign == 0 and adj < -p:
 
2940
            # p+1 digits; final round will raise correct flags
 
2941
            ans = _dec_from_triple(0, '1' + '0'*(p-1) + '1', -p)
 
2942
        elif self._sign == 1 and adj < -p-1:
 
2943
            # p+1 digits; final round will raise correct flags
 
2944
            ans = _dec_from_triple(0, '9'*(p+1), -p-1)
 
2945
        # general case
 
2946
        else:
 
2947
            op = _WorkRep(self)
 
2948
            c, e = op.int, op.exp
 
2949
            if op.sign == 1:
 
2950
                c = -c
 
2951
 
 
2952
            # compute correctly rounded result: increase precision by
 
2953
            # 3 digits at a time until we get an unambiguously
 
2954
            # roundable result
 
2955
            extra = 3
 
2956
            while True:
 
2957
                coeff, exp = _dexp(c, e, p+extra)
 
2958
                if coeff % (5*10**(len(str(coeff))-p-1)):
 
2959
                    break
 
2960
                extra += 3
 
2961
 
 
2962
            ans = _dec_from_triple(0, str(coeff), exp)
 
2963
 
 
2964
        # at this stage, ans should round correctly with *any*
 
2965
        # rounding mode, not just with ROUND_HALF_EVEN
 
2966
        context = context._shallow_copy()
 
2967
        rounding = context._set_rounding(ROUND_HALF_EVEN)
 
2968
        ans = ans._fix(context)
 
2969
        context.rounding = rounding
 
2970
 
 
2971
        return ans
 
2972
 
 
2973
    def is_canonical(self):
 
2974
        """Return True if self is canonical; otherwise return False.
 
2975
 
 
2976
        Currently, the encoding of a Decimal instance is always
 
2977
        canonical, so this method returns True for any Decimal.
 
2978
        """
 
2979
        return True
 
2980
 
 
2981
    def is_finite(self):
 
2982
        """Return True if self is finite; otherwise return False.
 
2983
 
 
2984
        A Decimal instance is considered finite if it is neither
 
2985
        infinite nor a NaN.
 
2986
        """
 
2987
        return not self._is_special
 
2988
 
 
2989
    def is_infinite(self):
 
2990
        """Return True if self is infinite; otherwise return False."""
 
2991
        return self._exp == 'F'
 
2992
 
 
2993
    def is_nan(self):
 
2994
        """Return True if self is a qNaN or sNaN; otherwise return False."""
 
2995
        return self._exp in ('n', 'N')
 
2996
 
 
2997
    def is_normal(self, context=None):
 
2998
        """Return True if self is a normal number; otherwise return False."""
 
2999
        if self._is_special or not self:
 
3000
            return False
 
3001
        if context is None:
 
3002
            context = getcontext()
 
3003
        return context.Emin <= self.adjusted() <= context.Emax
 
3004
 
 
3005
    def is_qnan(self):
 
3006
        """Return True if self is a quiet NaN; otherwise return False."""
 
3007
        return self._exp == 'n'
 
3008
 
 
3009
    def is_signed(self):
 
3010
        """Return True if self is negative; otherwise return False."""
 
3011
        return self._sign == 1
 
3012
 
 
3013
    def is_snan(self):
 
3014
        """Return True if self is a signaling NaN; otherwise return False."""
 
3015
        return self._exp == 'N'
 
3016
 
 
3017
    def is_subnormal(self, context=None):
 
3018
        """Return True if self is subnormal; otherwise return False."""
 
3019
        if self._is_special or not self:
 
3020
            return False
 
3021
        if context is None:
 
3022
            context = getcontext()
 
3023
        return self.adjusted() < context.Emin
 
3024
 
 
3025
    def is_zero(self):
 
3026
        """Return True if self is a zero; otherwise return False."""
 
3027
        return not self._is_special and self._int == '0'
 
3028
 
 
3029
    def _ln_exp_bound(self):
 
3030
        """Compute a lower bound for the adjusted exponent of self.ln().
 
3031
        In other words, compute r such that self.ln() >= 10**r.  Assumes
 
3032
        that self is finite and positive and that self != 1.
 
3033
        """
 
3034
 
 
3035
        # for 0.1 <= x <= 10 we use the inequalities 1-1/x <= ln(x) <= x-1
 
3036
        adj = self._exp + len(self._int) - 1
 
3037
        if adj >= 1:
 
3038
            # argument >= 10; we use 23/10 = 2.3 as a lower bound for ln(10)
 
3039
            return len(str(adj*23//10)) - 1
 
3040
        if adj <= -2:
 
3041
            # argument <= 0.1
 
3042
            return len(str((-1-adj)*23//10)) - 1
 
3043
        op = _WorkRep(self)
 
3044
        c, e = op.int, op.exp
 
3045
        if adj == 0:
 
3046
            # 1 < self < 10
 
3047
            num = str(c-10**-e)
 
3048
            den = str(c)
 
3049
            return len(num) - len(den) - (num < den)
 
3050
        # adj == -1, 0.1 <= self < 1
 
3051
        return e + len(str(10**-e - c)) - 1
 
3052
 
 
3053
 
 
3054
    def ln(self, context=None):
 
3055
        """Returns the natural (base e) logarithm of self."""
 
3056
 
 
3057
        if context is None:
 
3058
            context = getcontext()
 
3059
 
 
3060
        # ln(NaN) = NaN
 
3061
        ans = self._check_nans(context=context)
 
3062
        if ans:
 
3063
            return ans
 
3064
 
 
3065
        # ln(0.0) == -Infinity
 
3066
        if not self:
 
3067
            return _NegativeInfinity
 
3068
 
 
3069
        # ln(Infinity) = Infinity
 
3070
        if self._isinfinity() == 1:
 
3071
            return _Infinity
 
3072
 
 
3073
        # ln(1.0) == 0.0
 
3074
        if self == _One:
 
3075
            return _Zero
 
3076
 
 
3077
        # ln(negative) raises InvalidOperation
 
3078
        if self._sign == 1:
 
3079
            return context._raise_error(InvalidOperation,
 
3080
                                        'ln of a negative value')
 
3081
 
 
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 by 3
 
3088
        # until we get an unambiguously roundable result
 
3089
        places = p - self._ln_exp_bound() + 2 # at least p+3 places
 
3090
        while True:
 
3091
            coeff = _dlog(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
 
3096
        ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
 
3097
 
 
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 _log10_exp_bound(self):
 
3105
        """Compute a lower bound for the adjusted exponent of self.log10().
 
3106
        In other words, find r such that self.log10() >= 10**r.
 
3107
        Assumes that self is finite and positive and that self != 1.
 
3108
        """
 
3109
 
 
3110
        # For x >= 10 or x < 0.1 we only need a bound on the integer
 
3111
        # part of log10(self), and this comes directly from the
 
3112
        # exponent of x.  For 0.1 <= x <= 10 we use the inequalities
 
3113
        # 1-1/x <= log(x) <= x-1. If x > 1 we have |log10(x)| >
 
3114
        # (1-1/x)/2.31 > 0.  If x < 1 then |log10(x)| > (1-x)/2.31 > 0
 
3115
 
 
3116
        adj = self._exp + len(self._int) - 1
 
3117
        if adj >= 1:
 
3118
            # self >= 10
 
3119
            return len(str(adj))-1
 
3120
        if adj <= -2:
 
3121
            # self < 0.1
 
3122
            return len(str(-1-adj))-1
 
3123
        op = _WorkRep(self)
 
3124
        c, e = op.int, op.exp
 
3125
        if adj == 0:
 
3126
            # 1 < self < 10
 
3127
            num = str(c-10**-e)
 
3128
            den = str(231*c)
 
3129
            return len(num) - len(den) - (num < den) + 2
 
3130
        # adj == -1, 0.1 <= self < 1
 
3131
        num = str(10**-e-c)
 
3132
        return len(num) + e - (num < "231") - 1
 
3133
 
 
3134
    def log10(self, context=None):
 
3135
        """Returns the base 10 logarithm of self."""
 
3136
 
 
3137
        if context is None:
 
3138
            context = getcontext()
 
3139
 
 
3140
        # log10(NaN) = NaN
 
3141
        ans = self._check_nans(context=context)
 
3142
        if ans:
 
3143
            return ans
 
3144
 
 
3145
        # log10(0.0) == -Infinity
 
3146
        if not self:
 
3147
            return _NegativeInfinity
 
3148
 
 
3149
        # log10(Infinity) = Infinity
 
3150
        if self._isinfinity() == 1:
 
3151
            return _Infinity
 
3152
 
 
3153
        # log10(negative or -Infinity) raises InvalidOperation
 
3154
        if self._sign == 1:
 
3155
            return context._raise_error(InvalidOperation,
 
3156
                                        'log10 of a negative value')
 
3157
 
 
3158
        # log10(10**n) = n
 
3159
        if self._int[0] == '1' and self._int[1:] == '0'*(len(self._int) - 1):
 
3160
            # answer may need rounding
 
3161
            ans = Decimal(self._exp + len(self._int) - 1)
 
3162
        else:
 
3163
            # result is irrational, so necessarily inexact
 
3164
            op = _WorkRep(self)
 
3165
            c, e = op.int, op.exp
 
3166
            p = context.prec
 
3167
 
 
3168
            # correctly rounded result: repeatedly increase precision
 
3169
            # until result is unambiguously roundable
 
3170
            places = p-self._log10_exp_bound()+2
 
3171
            while True:
 
3172
                coeff = _dlog10(c, e, places)
 
3173
                # assert len(str(abs(coeff)))-p >= 1
 
3174
                if coeff % (5*10**(len(str(abs(coeff)))-p-1)):
 
3175
                    break
 
3176
                places += 3
 
3177
            ans = _dec_from_triple(int(coeff<0), str(abs(coeff)), -places)
 
3178
 
 
3179
        context = context._shallow_copy()
 
3180
        rounding = context._set_rounding(ROUND_HALF_EVEN)
 
3181
        ans = ans._fix(context)
 
3182
        context.rounding = rounding
 
3183
        return ans
 
3184
 
 
3185
    def logb(self, context=None):
 
3186
        """ Returns the exponent of the magnitude of self's MSD.
 
3187
 
 
3188
        The result is the integer which is the exponent of the magnitude
 
3189
        of the most significant digit of self (as though it were truncated
 
3190
        to a single digit while maintaining the value of that digit and
 
3191
        without limiting the resulting exponent).
 
3192
        """
 
3193
        # logb(NaN) = NaN
 
3194
        ans = self._check_nans(context=context)
 
3195
        if ans:
 
3196
            return ans
 
3197
 
 
3198
        if context is None:
 
3199
            context = getcontext()
 
3200
 
 
3201
        # logb(+/-Inf) = +Inf
 
3202
        if self._isinfinity():
 
3203
            return _Infinity
 
3204
 
 
3205
        # logb(0) = -Inf, DivisionByZero
 
3206
        if not self:
 
3207
            return context._raise_error(DivisionByZero, 'logb(0)', 1)
 
3208
 
 
3209
        # otherwise, simply return the adjusted exponent of self, as a
 
3210
        # Decimal.  Note that no attempt is made to fit the result
 
3211
        # into the current context.
 
3212
        return Decimal(self.adjusted())
 
3213
 
 
3214
    def _islogical(self):
 
3215
        """Return True if self is a logical operand.
 
3216
 
 
3217
        For being logical, it must be a finite number with a sign of 0,
 
3218
        an exponent of 0, and a coefficient whose digits must all be
 
3219
        either 0 or 1.
 
3220
        """
 
3221
        if self._sign != 0 or self._exp != 0:
 
3222
            return False
 
3223
        for dig in self._int:
 
3224
            if dig not in '01':
 
3225
                return False
 
3226
        return True
 
3227
 
 
3228
    def _fill_logical(self, context, opa, opb):
 
3229
        dif = context.prec - len(opa)
 
3230
        if dif > 0:
 
3231
            opa = '0'*dif + opa
 
3232
        elif dif < 0:
 
3233
            opa = opa[-context.prec:]
 
3234
        dif = context.prec - len(opb)
 
3235
        if dif > 0:
 
3236
            opb = '0'*dif + opb
 
3237
        elif dif < 0:
 
3238
            opb = opb[-context.prec:]
 
3239
        return opa, opb
 
3240
 
 
3241
    def logical_and(self, other, context=None):
 
3242
        """Applies an 'and' operation between self and other's digits."""
 
3243
        if context is None:
 
3244
            context = getcontext()
 
3245
        if not self._islogical() or not other._islogical():
 
3246
            return context._raise_error(InvalidOperation)
 
3247
 
 
3248
        # fill to context.prec
 
3249
        (opa, opb) = self._fill_logical(context, self._int, other._int)
 
3250
 
 
3251
        # make the operation, and clean starting zeroes
 
3252
        result = "".join([str(int(a)&int(b)) for a,b in zip(opa,opb)])
 
3253
        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
 
3254
 
 
3255
    def logical_invert(self, context=None):
 
3256
        """Invert all its digits."""
 
3257
        if context is None:
 
3258
            context = getcontext()
 
3259
        return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0),
 
3260
                                context)
 
3261
 
 
3262
    def logical_or(self, other, context=None):
 
3263
        """Applies an 'or' operation between self and other's digits."""
 
3264
        if context is None:
 
3265
            context = getcontext()
 
3266
        if not self._islogical() or not other._islogical():
 
3267
            return context._raise_error(InvalidOperation)
 
3268
 
 
3269
        # fill to context.prec
 
3270
        (opa, opb) = self._fill_logical(context, self._int, other._int)
 
3271
 
 
3272
        # make the operation, and clean starting zeroes
 
3273
        result = "".join([str(int(a)|int(b)) for a,b in zip(opa,opb)])
 
3274
        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
 
3275
 
 
3276
    def logical_xor(self, other, context=None):
 
3277
        """Applies an 'xor' operation between self and other's digits."""
 
3278
        if context is None:
 
3279
            context = getcontext()
 
3280
        if not self._islogical() or not other._islogical():
 
3281
            return context._raise_error(InvalidOperation)
 
3282
 
 
3283
        # fill to context.prec
 
3284
        (opa, opb) = self._fill_logical(context, self._int, other._int)
 
3285
 
 
3286
        # make the operation, and clean starting zeroes
 
3287
        result = "".join([str(int(a)^int(b)) for a,b in zip(opa,opb)])
 
3288
        return _dec_from_triple(0, result.lstrip('0') or '0', 0)
 
3289
 
 
3290
    def max_mag(self, other, context=None):
 
3291
        """Compares the values numerically with their sign ignored."""
 
3292
        other = _convert_other(other, raiseit=True)
 
3293
 
 
3294
        if context is None:
 
3295
            context = getcontext()
 
3296
 
 
3297
        if self._is_special or other._is_special:
 
3298
            # If one operand is a quiet NaN and the other is number, then the
 
3299
            # number is always returned
 
3300
            sn = self._isnan()
 
3301
            on = other._isnan()
 
3302
            if sn or on:
 
3303
                if on == 1 and sn == 0:
 
3304
                    return self._fix(context)
 
3305
                if sn == 1 and on == 0:
 
3306
                    return other._fix(context)
 
3307
                return self._check_nans(other, context)
 
3308
 
 
3309
        c = self.copy_abs()._cmp(other.copy_abs())
 
3310
        if c == 0:
 
3311
            c = self.compare_total(other)
 
3312
 
 
3313
        if c == -1:
 
3314
            ans = other
 
3315
        else:
 
3316
            ans = self
 
3317
 
 
3318
        return ans._fix(context)
 
3319
 
 
3320
    def min_mag(self, other, context=None):
 
3321
        """Compares the values numerically with their sign ignored."""
 
3322
        other = _convert_other(other, raiseit=True)
 
3323
 
 
3324
        if context is None:
 
3325
            context = getcontext()
 
3326
 
 
3327
        if self._is_special or other._is_special:
 
3328
            # If one operand is a quiet NaN and the other is number, then the
 
3329
            # number is always returned
 
3330
            sn = self._isnan()
 
3331
            on = other._isnan()
 
3332
            if sn or on:
 
3333
                if on == 1 and sn == 0:
 
3334
                    return self._fix(context)
 
3335
                if sn == 1 and on == 0:
 
3336
                    return other._fix(context)
 
3337
                return self._check_nans(other, context)
 
3338
 
 
3339
        c = self.copy_abs()._cmp(other.copy_abs())
 
3340
        if c == 0:
 
3341
            c = self.compare_total(other)
 
3342
 
 
3343
        if c == -1:
 
3344
            ans = self
 
3345
        else:
 
3346
            ans = other
 
3347
 
 
3348
        return ans._fix(context)
 
3349
 
 
3350
    def next_minus(self, context=None):
 
3351
        """Returns the largest representable number smaller than itself."""
 
3352
        if context is None:
 
3353
            context = getcontext()
 
3354
 
 
3355
        ans = self._check_nans(context=context)
 
3356
        if ans:
 
3357
            return ans
 
3358
 
 
3359
        if self._isinfinity() == -1:
 
3360
            return _NegativeInfinity
 
3361
        if self._isinfinity() == 1:
 
3362
            return _dec_from_triple(0, '9'*context.prec, context.Etop())
 
3363
 
 
3364
        context = context.copy()
 
3365
        context._set_rounding(ROUND_FLOOR)
 
3366
        context._ignore_all_flags()
 
3367
        new_self = self._fix(context)
 
3368
        if new_self != self:
 
3369
            return new_self
 
3370
        return self.__sub__(_dec_from_triple(0, '1', context.Etiny()-1),
 
3371
                            context)
 
3372
 
 
3373
    def next_plus(self, context=None):
 
3374
        """Returns the smallest representable number larger than itself."""
 
3375
        if context is None:
 
3376
            context = getcontext()
 
3377
 
 
3378
        ans = self._check_nans(context=context)
 
3379
        if ans:
 
3380
            return ans
 
3381
 
 
3382
        if self._isinfinity() == 1:
 
3383
            return _Infinity
 
3384
        if self._isinfinity() == -1:
 
3385
            return _dec_from_triple(1, '9'*context.prec, context.Etop())
 
3386
 
 
3387
        context = context.copy()
 
3388
        context._set_rounding(ROUND_CEILING)
 
3389
        context._ignore_all_flags()
 
3390
        new_self = self._fix(context)
 
3391
        if new_self != self:
 
3392
            return new_self
 
3393
        return self.__add__(_dec_from_triple(0, '1', context.Etiny()-1),
 
3394
                            context)
 
3395
 
 
3396
    def next_toward(self, other, context=None):
 
3397
        """Returns the number closest to self, in the direction towards other.
 
3398
 
 
3399
        The result is the closest representable number to self
 
3400
        (excluding self) that is in the direction towards other,
 
3401
        unless both have the same value.  If the two operands are
 
3402
        numerically equal, then the result is a copy of self with the
 
3403
        sign set to be the same as the sign of other.
 
3404
        """
 
3405
        other = _convert_other(other, raiseit=True)
 
3406
 
 
3407
        if context is None:
 
3408
            context = getcontext()
 
3409
 
 
3410
        ans = self._check_nans(other, context)
 
3411
        if ans:
 
3412
            return ans
 
3413
 
 
3414
        comparison = self._cmp(other)
 
3415
        if comparison == 0:
 
3416
            return self.copy_sign(other)
 
3417
 
 
3418
        if comparison == -1:
 
3419
            ans = self.next_plus(context)
 
3420
        else: # comparison == 1
 
3421
            ans = self.next_minus(context)
 
3422
 
 
3423
        # decide which flags to raise using value of ans
 
3424
        if ans._isinfinity():
 
3425
            context._raise_error(Overflow,
 
3426
                                 'Infinite result from next_toward',
 
3427
                                 ans._sign)
 
3428
            context._raise_error(Rounded)
 
3429
            context._raise_error(Inexact)
 
3430
        elif ans.adjusted() < context.Emin:
 
3431
            context._raise_error(Underflow)
 
3432
            context._raise_error(Subnormal)
 
3433
            context._raise_error(Rounded)
 
3434
            context._raise_error(Inexact)
 
3435
            # if precision == 1 then we don't raise Clamped for a
 
3436
            # result 0E-Etiny.
 
3437
            if not ans:
 
3438
                context._raise_error(Clamped)
 
3439
 
 
3440
        return ans
 
3441
 
 
3442
    def number_class(self, context=None):
 
3443
        """Returns an indication of the class of self.
 
3444
 
 
3445
        The class is one of the following strings:
 
3446
          sNaN
 
3447
          NaN
 
3448
          -Infinity
 
3449
          -Normal
 
3450
          -Subnormal
 
3451
          -Zero
 
3452
          +Zero
 
3453
          +Subnormal
 
3454
          +Normal
 
3455
          +Infinity
 
3456
        """
 
3457
        if self.is_snan():
 
3458
            return "sNaN"
 
3459
        if self.is_qnan():
 
3460
            return "NaN"
 
3461
        inf = self._isinfinity()
 
3462
        if inf == 1:
 
3463
            return "+Infinity"
 
3464
        if inf == -1:
 
3465
            return "-Infinity"
 
3466
        if self.is_zero():
 
3467
            if self._sign:
 
3468
                return "-Zero"
 
3469
            else:
 
3470
                return "+Zero"
 
3471
        if context is None:
 
3472
            context = getcontext()
 
3473
        if self.is_subnormal(context=context):
 
3474
            if self._sign:
 
3475
                return "-Subnormal"
 
3476
            else:
 
3477
                return "+Subnormal"
 
3478
        # just a normal, regular, boring number, :)
 
3479
        if self._sign:
 
3480
            return "-Normal"
 
3481
        else:
 
3482
            return "+Normal"
 
3483
 
 
3484
    def radix(self):
 
3485
        """Just returns 10, as this is Decimal, :)"""
 
3486
        return Decimal(10)
 
3487
 
 
3488
    def rotate(self, other, context=None):
 
3489
        """Returns a rotated copy of self, value-of-other times."""
 
3490
        if context is None:
 
3491
            context = getcontext()
 
3492
 
 
3493
        ans = self._check_nans(other, context)
 
3494
        if ans:
 
3495
            return ans
 
3496
 
 
3497
        if other._exp != 0:
 
3498
            return context._raise_error(InvalidOperation)
 
3499
        if not (-context.prec <= int(other) <= context.prec):
 
3500
            return context._raise_error(InvalidOperation)
 
3501
 
 
3502
        if self._isinfinity():
 
3503
            return Decimal(self)
 
3504
 
 
3505
        # get values, pad if necessary
 
3506
        torot = int(other)
 
3507
        rotdig = self._int
 
3508
        topad = context.prec - len(rotdig)
 
3509
        if topad:
 
3510
            rotdig = '0'*topad + rotdig
 
3511
 
 
3512
        # let's rotate!
 
3513
        rotated = rotdig[torot:] + rotdig[:torot]
 
3514
        return _dec_from_triple(self._sign,
 
3515
                                rotated.lstrip('0') or '0', self._exp)
 
3516
 
 
3517
    def scaleb (self, other, context=None):
 
3518
        """Returns self operand after adding the second value to its exp."""
 
3519
        if context is None:
 
3520
            context = getcontext()
 
3521
 
 
3522
        ans = self._check_nans(other, context)
 
3523
        if ans:
 
3524
            return ans
 
3525
 
 
3526
        if other._exp != 0:
 
3527
            return context._raise_error(InvalidOperation)
 
3528
        liminf = -2 * (context.Emax + context.prec)
 
3529
        limsup =  2 * (context.Emax + context.prec)
 
3530
        if not (liminf <= int(other) <= limsup):
 
3531
            return context._raise_error(InvalidOperation)
 
3532
 
 
3533
        if self._isinfinity():
 
3534
            return Decimal(self)
 
3535
 
 
3536
        d = _dec_from_triple(self._sign, self._int, self._exp + int(other))
 
3537
        d = d._fix(context)
 
3538
        return d
 
3539
 
 
3540
    def shift(self, other, context=None):
 
3541
        """Returns a shifted copy of self, value-of-other times."""
 
3542
        if context is None:
 
3543
            context = getcontext()
 
3544
 
 
3545
        ans = self._check_nans(other, context)
 
3546
        if ans:
 
3547
            return ans
 
3548
 
 
3549
        if other._exp != 0:
 
3550
            return context._raise_error(InvalidOperation)
 
3551
        if not (-context.prec <= int(other) <= context.prec):
 
3552
            return context._raise_error(InvalidOperation)
 
3553
 
 
3554
        if self._isinfinity():
 
3555
            return Decimal(self)
 
3556
 
 
3557
        # get values, pad if necessary
 
3558
        torot = int(other)
 
3559
        if not torot:
 
3560
            return Decimal(self)
 
3561
        rotdig = self._int
 
3562
        topad = context.prec - len(rotdig)
 
3563
        if topad:
 
3564
            rotdig = '0'*topad + rotdig
 
3565
 
 
3566
        # let's shift!
 
3567
        if torot < 0:
 
3568
            rotated = rotdig[:torot]
 
3569
        else:
 
3570
            rotated = rotdig + '0'*torot
 
3571
            rotated = rotated[-context.prec:]
 
3572
 
 
3573
        return _dec_from_triple(self._sign,
 
3574
                                    rotated.lstrip('0') or '0', self._exp)
 
3575
 
 
3576
    # Support for pickling, copy, and deepcopy
 
3577
    def __reduce__(self):
 
3578
        return (self.__class__, (str(self),))
 
3579
 
 
3580
    def __copy__(self):
 
3581
        if type(self) == Decimal:
 
3582
            return self     # I'm immutable; therefore I am my own clone
 
3583
        return self.__class__(str(self))
 
3584
 
 
3585
    def __deepcopy__(self, memo):
 
3586
        if type(self) == Decimal:
 
3587
            return self     # My components are also immutable
 
3588
        return self.__class__(str(self))
 
3589
 
 
3590
    # PEP 3101 support.  the _localeconv keyword argument should be
 
3591
    # considered private: it's provided for ease of testing only.
 
3592
    def __format__(self, specifier, context=None, _localeconv=None):
 
3593
        """Format a Decimal instance according to the given specifier.
 
3594
 
 
3595
        The specifier should be a standard format specifier, with the
 
3596
        form described in PEP 3101.  Formatting types 'e', 'E', 'f',
 
3597
        'F', 'g', 'G', 'n' and '%' are supported.  If the formatting
 
3598
        type is omitted it defaults to 'g' or 'G', depending on the
 
3599
        value of context.capitals.
 
3600
        """
 
3601
 
 
3602
        # Note: PEP 3101 says that if the type is not present then
 
3603
        # there should be at least one digit after the decimal point.
 
3604
        # We take the liberty of ignoring this requirement for
 
3605
        # Decimal---it's presumably there to make sure that
 
3606
        # format(float, '') behaves similarly to str(float).
 
3607
        if context is None:
 
3608
            context = getcontext()
 
3609
 
 
3610
        spec = _parse_format_specifier(specifier, _localeconv=_localeconv)
 
3611
 
 
3612
        # special values don't care about the type or precision
 
3613
        if self._is_special:
 
3614
            sign = _format_sign(self._sign, spec)
 
3615
            body = str(self.copy_abs())
 
3616
            return _format_align(sign, body, spec)
 
3617
 
 
3618
        # a type of None defaults to 'g' or 'G', depending on context
 
3619
        if spec['type'] is None:
 
3620
            spec['type'] = ['g', 'G'][context.capitals]
 
3621
 
 
3622
        # if type is '%', adjust exponent of self accordingly
 
3623
        if spec['type'] == '%':
 
3624
            self = _dec_from_triple(self._sign, self._int, self._exp+2)
 
3625
 
 
3626
        # round if necessary, taking rounding mode from the context
 
3627
        rounding = context.rounding
 
3628
        precision = spec['precision']
 
3629
        if precision is not None:
 
3630
            if spec['type'] in 'eE':
 
3631
                self = self._round(precision+1, rounding)
 
3632
            elif spec['type'] in 'fF%':
 
3633
                self = self._rescale(-precision, rounding)
 
3634
            elif spec['type'] in 'gG' and len(self._int) > precision:
 
3635
                self = self._round(precision, rounding)
 
3636
        # special case: zeros with a positive exponent can't be
 
3637
        # represented in fixed point; rescale them to 0e0.
 
3638
        if not self and self._exp > 0 and spec['type'] in 'fF%':
 
3639
            self = self._rescale(0, rounding)
 
3640
 
 
3641
        # figure out placement of the decimal point
 
3642
        leftdigits = self._exp + len(self._int)
 
3643
        if spec['type'] in 'eE':
 
3644
            if not self and precision is not None:
 
3645
                dotplace = 1 - precision
 
3646
            else:
 
3647
                dotplace = 1
 
3648
        elif spec['type'] in 'fF%':
 
3649
            dotplace = leftdigits
 
3650
        elif spec['type'] in 'gG':
 
3651
            if self._exp <= 0 and leftdigits > -6:
 
3652
                dotplace = leftdigits
 
3653
            else:
 
3654
                dotplace = 1
 
3655
 
 
3656
        # find digits before and after decimal point, and get exponent
 
3657
        if dotplace < 0:
 
3658
            intpart = '0'
 
3659
            fracpart = '0'*(-dotplace) + self._int
 
3660
        elif dotplace > len(self._int):
 
3661
            intpart = self._int + '0'*(dotplace-len(self._int))
 
3662
            fracpart = ''
 
3663
        else:
 
3664
            intpart = self._int[:dotplace] or '0'
 
3665
            fracpart = self._int[dotplace:]
 
3666
        exp = leftdigits-dotplace
 
3667
 
 
3668
        # done with the decimal-specific stuff;  hand over the rest
 
3669
        # of the formatting to the _format_number function
 
3670
        return _format_number(self._sign, intpart, fracpart, exp, spec)
 
3671
 
 
3672
def _dec_from_triple(sign, coefficient, exponent, special=False):
 
3673
    """Create a decimal instance directly, without any validation,
 
3674
    normalization (e.g. removal of leading zeros) or argument
 
3675
    conversion.
 
3676
 
 
3677
    This function is for *internal use only*.
 
3678
    """
 
3679
 
 
3680
    self = object.__new__(Decimal)
 
3681
    self._sign = sign
 
3682
    self._int = coefficient
 
3683
    self._exp = exponent
 
3684
    self._is_special = special
 
3685
 
 
3686
    return self
 
3687
 
 
3688
# Register Decimal as a kind of Number (an abstract base class).
 
3689
# However, do not register it as Real (because Decimals are not
 
3690
# interoperable with floats).
 
3691
_numbers.Number.register(Decimal)
 
3692
 
 
3693
 
 
3694
##### Context class #######################################################
 
3695
 
 
3696
 
 
3697
# get rounding method function:
 
3698
rounding_functions = [name for name in Decimal.__dict__.keys()
 
3699
                                    if name.startswith('_round_')]
 
3700
for name in rounding_functions:
 
3701
    # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
 
3702
    globalname = name[1:].upper()
 
3703
    val = globals()[globalname]
 
3704
    Decimal._pick_rounding_function[val] = name
 
3705
 
 
3706
del name, val, globalname, rounding_functions
 
3707
 
 
3708
class _ContextManager(object):
 
3709
    """Context manager class to support localcontext().
 
3710
 
 
3711
      Sets a copy of the supplied context in __enter__() and restores
 
3712
      the previous decimal context in __exit__()
 
3713
    """
 
3714
    def __init__(self, new_context):
 
3715
        self.new_context = new_context.copy()
 
3716
    def __enter__(self):
 
3717
        self.saved_context = getcontext()
 
3718
        setcontext(self.new_context)
 
3719
        return self.new_context
 
3720
    def __exit__(self, t, v, tb):
 
3721
        setcontext(self.saved_context)
 
3722
 
 
3723
class Context(object):
 
3724
    """Contains the context for a Decimal instance.
 
3725
 
 
3726
    Contains:
 
3727
    prec - precision (for use in rounding, division, square roots..)
 
3728
    rounding - rounding type (how you round)
 
3729
    traps - If traps[exception] = 1, then the exception is
 
3730
                    raised when it is caused.  Otherwise, a value is
 
3731
                    substituted in.
 
3732
    flags  - When an exception is caused, flags[exception] is set.
 
3733
             (Whether or not the trap_enabler is set)
 
3734
             Should be reset by user of Decimal instance.
 
3735
    Emin -   Minimum exponent
 
3736
    Emax -   Maximum exponent
 
3737
    capitals -      If 1, 1*10^1 is printed as 1E+1.
 
3738
                    If 0, printed as 1e1
 
3739
    _clamp - If 1, change exponents if too high (Default 0)
 
3740
    """
 
3741
 
 
3742
    def __init__(self, prec=None, rounding=None,
 
3743
                 traps=None, flags=None,
 
3744
                 Emin=None, Emax=None,
 
3745
                 capitals=None, _clamp=0,
 
3746
                 _ignored_flags=None):
 
3747
        if flags is None:
 
3748
            flags = []
 
3749
        if _ignored_flags is None:
 
3750
            _ignored_flags = []
 
3751
        if not isinstance(flags, dict):
 
3752
            flags = dict([(s, int(s in flags)) for s in _signals])
 
3753
        if traps is not None and not isinstance(traps, dict):
 
3754
            traps = dict([(s, int(s in traps)) for s in _signals])
 
3755
        for name, val in locals().items():
 
3756
            if val is None:
 
3757
                setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
 
3758
            else:
 
3759
                setattr(self, name, val)
 
3760
        del self.self
 
3761
 
 
3762
    def __repr__(self):
 
3763
        """Show the current context."""
 
3764
        s = []
 
3765
        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, '
 
3766
                 'Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d'
 
3767
                 % vars(self))
 
3768
        names = [f.__name__ for f, v in self.flags.items() if v]
 
3769
        s.append('flags=[' + ', '.join(names) + ']')
 
3770
        names = [t.__name__ for t, v in self.traps.items() if v]
 
3771
        s.append('traps=[' + ', '.join(names) + ']')
 
3772
        return ', '.join(s) + ')'
 
3773
 
 
3774
    def clear_flags(self):
 
3775
        """Reset all flags to zero"""
 
3776
        for flag in self.flags:
 
3777
            self.flags[flag] = 0
 
3778
 
 
3779
    def _shallow_copy(self):
 
3780
        """Returns a shallow copy from self."""
 
3781
        nc = Context(self.prec, self.rounding, self.traps,
 
3782
                     self.flags, self.Emin, self.Emax,
 
3783
                     self.capitals, self._clamp, self._ignored_flags)
 
3784
        return nc
 
3785
 
 
3786
    def copy(self):
 
3787
        """Returns a deep copy from self."""
 
3788
        nc = Context(self.prec, self.rounding, self.traps.copy(),
 
3789
                     self.flags.copy(), self.Emin, self.Emax,
 
3790
                     self.capitals, self._clamp, self._ignored_flags)
 
3791
        return nc
 
3792
    __copy__ = copy
 
3793
 
 
3794
    def _raise_error(self, condition, explanation = None, *args):
 
3795
        """Handles an error
 
3796
 
 
3797
        If the flag is in _ignored_flags, returns the default response.
 
3798
        Otherwise, it sets the flag, then, if the corresponding
 
3799
        trap_enabler is set, it reaises the exception.  Otherwise, it returns
 
3800
        the default value after setting the flag.
 
3801
        """
 
3802
        error = _condition_map.get(condition, condition)
 
3803
        if error in self._ignored_flags:
 
3804
            # Don't touch the flag
 
3805
            return error().handle(self, *args)
 
3806
 
 
3807
        self.flags[error] = 1
 
3808
        if not self.traps[error]:
 
3809
            # The errors define how to handle themselves.
 
3810
            return condition().handle(self, *args)
 
3811
 
 
3812
        # Errors should only be risked on copies of the context
 
3813
        # self._ignored_flags = []
 
3814
        raise error(explanation)
 
3815
 
 
3816
    def _ignore_all_flags(self):
 
3817
        """Ignore all flags, if they are raised"""
 
3818
        return self._ignore_flags(*_signals)
 
3819
 
 
3820
    def _ignore_flags(self, *flags):
 
3821
        """Ignore the flags, if they are raised"""
 
3822
        # Do not mutate-- This way, copies of a context leave the original
 
3823
        # alone.
 
3824
        self._ignored_flags = (self._ignored_flags + list(flags))
 
3825
        return list(flags)
 
3826
 
 
3827
    def _regard_flags(self, *flags):
 
3828
        """Stop ignoring the flags, if they are raised"""
 
3829
        if flags and isinstance(flags[0], (tuple,list)):
 
3830
            flags = flags[0]
 
3831
        for flag in flags:
 
3832
            self._ignored_flags.remove(flag)
 
3833
 
 
3834
    # We inherit object.__hash__, so we must deny this explicitly
 
3835
    __hash__ = None
 
3836
 
 
3837
    def Etiny(self):
 
3838
        """Returns Etiny (= Emin - prec + 1)"""
 
3839
        return int(self.Emin - self.prec + 1)
 
3840
 
 
3841
    def Etop(self):
 
3842
        """Returns maximum exponent (= Emax - prec + 1)"""
 
3843
        return int(self.Emax - self.prec + 1)
 
3844
 
 
3845
    def _set_rounding(self, type):
 
3846
        """Sets the rounding type.
 
3847
 
 
3848
        Sets the rounding type, and returns the current (previous)
 
3849
        rounding type.  Often used like:
 
3850
 
 
3851
        context = context.copy()
 
3852
        # so you don't change the calling context
 
3853
        # if an error occurs in the middle.
 
3854
        rounding = context._set_rounding(ROUND_UP)
 
3855
        val = self.__sub__(other, context=context)
 
3856
        context._set_rounding(rounding)
 
3857
 
 
3858
        This will make it round up for that operation.
 
3859
        """
 
3860
        rounding = self.rounding
 
3861
        self.rounding= type
 
3862
        return rounding
 
3863
 
 
3864
    def create_decimal(self, num='0'):
 
3865
        """Creates a new Decimal instance but using self as context.
 
3866
 
 
3867
        This method implements the to-number operation of the
 
3868
        IBM Decimal specification."""
 
3869
 
 
3870
        if isinstance(num, str) and num != num.strip():
 
3871
            return self._raise_error(ConversionSyntax,
 
3872
                                     "no trailing or leading whitespace is "
 
3873
                                     "permitted.")
 
3874
 
 
3875
        d = Decimal(num, context=self)
 
3876
        if d._isnan() and len(d._int) > self.prec - self._clamp:
 
3877
            return self._raise_error(ConversionSyntax,
 
3878
                                     "diagnostic info too long in NaN")
 
3879
        return d._fix(self)
 
3880
 
 
3881
    def create_decimal_from_float(self, f):
 
3882
        """Creates a new Decimal instance from a float but rounding using self
 
3883
        as the context.
 
3884
 
 
3885
        >>> context = Context(prec=5, rounding=ROUND_DOWN)
 
3886
        >>> context.create_decimal_from_float(3.1415926535897932)
 
3887
        Decimal('3.1415')
 
3888
        >>> context = Context(prec=5, traps=[Inexact])
 
3889
        >>> context.create_decimal_from_float(3.1415926535897932)
 
3890
        Traceback (most recent call last):
 
3891
            ...
 
3892
        decimal.Inexact: None
 
3893
 
 
3894
        """
 
3895
        d = Decimal.from_float(f)       # An exact conversion
 
3896
        return d._fix(self)             # Apply the context rounding
 
3897
 
 
3898
    # Methods
 
3899
    def abs(self, a):
 
3900
        """Returns the absolute value of the operand.
 
3901
 
 
3902
        If the operand is negative, the result is the same as using the minus
 
3903
        operation on the operand.  Otherwise, the result is the same as using
 
3904
        the plus operation on the operand.
 
3905
 
 
3906
        >>> ExtendedContext.abs(Decimal('2.1'))
 
3907
        Decimal('2.1')
 
3908
        >>> ExtendedContext.abs(Decimal('-100'))
 
3909
        Decimal('100')
 
3910
        >>> ExtendedContext.abs(Decimal('101.5'))
 
3911
        Decimal('101.5')
 
3912
        >>> ExtendedContext.abs(Decimal('-101.5'))
 
3913
        Decimal('101.5')
 
3914
        """
 
3915
        return a.__abs__(context=self)
 
3916
 
 
3917
    def add(self, a, b):
 
3918
        """Return the sum of the two operands.
 
3919
 
 
3920
        >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
 
3921
        Decimal('19.00')
 
3922
        >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
 
3923
        Decimal('1.02E+4')
 
3924
        """
 
3925
        return a.__add__(b, context=self)
 
3926
 
 
3927
    def _apply(self, a):
 
3928
        return str(a._fix(self))
 
3929
 
 
3930
    def canonical(self, a):
 
3931
        """Returns the same Decimal object.
 
3932
 
 
3933
        As we do not have different encodings for the same number, the
 
3934
        received object already is in its canonical form.
 
3935
 
 
3936
        >>> ExtendedContext.canonical(Decimal('2.50'))
 
3937
        Decimal('2.50')
 
3938
        """
 
3939
        return a.canonical(context=self)
 
3940
 
 
3941
    def compare(self, a, b):
 
3942
        """Compares values numerically.
 
3943
 
 
3944
        If the signs of the operands differ, a value representing each operand
 
3945
        ('-1' if the operand is less than zero, '0' if the operand is zero or
 
3946
        negative zero, or '1' if the operand is greater than zero) is used in
 
3947
        place of that operand for the comparison instead of the actual
 
3948
        operand.
 
3949
 
 
3950
        The comparison is then effected by subtracting the second operand from
 
3951
        the first and then returning a value according to the result of the
 
3952
        subtraction: '-1' if the result is less than zero, '0' if the result is
 
3953
        zero or negative zero, or '1' if the result is greater than zero.
 
3954
 
 
3955
        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
 
3956
        Decimal('-1')
 
3957
        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
 
3958
        Decimal('0')
 
3959
        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
 
3960
        Decimal('0')
 
3961
        >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
 
3962
        Decimal('1')
 
3963
        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
 
3964
        Decimal('1')
 
3965
        >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
 
3966
        Decimal('-1')
 
3967
        """
 
3968
        return a.compare(b, context=self)
 
3969
 
 
3970
    def compare_signal(self, a, b):
 
3971
        """Compares the values of the two operands numerically.
 
3972
 
 
3973
        It's pretty much like compare(), but all NaNs signal, with signaling
 
3974
        NaNs taking precedence over quiet NaNs.
 
3975
 
 
3976
        >>> c = ExtendedContext
 
3977
        >>> c.compare_signal(Decimal('2.1'), Decimal('3'))
 
3978
        Decimal('-1')
 
3979
        >>> c.compare_signal(Decimal('2.1'), Decimal('2.1'))
 
3980
        Decimal('0')
 
3981
        >>> c.flags[InvalidOperation] = 0
 
3982
        >>> print(c.flags[InvalidOperation])
 
3983
        0
 
3984
        >>> c.compare_signal(Decimal('NaN'), Decimal('2.1'))
 
3985
        Decimal('NaN')
 
3986
        >>> print(c.flags[InvalidOperation])
 
3987
        1
 
3988
        >>> c.flags[InvalidOperation] = 0
 
3989
        >>> print(c.flags[InvalidOperation])
 
3990
        0
 
3991
        >>> c.compare_signal(Decimal('sNaN'), Decimal('2.1'))
 
3992
        Decimal('NaN')
 
3993
        >>> print(c.flags[InvalidOperation])
 
3994
        1
 
3995
        """
 
3996
        return a.compare_signal(b, context=self)
 
3997
 
 
3998
    def compare_total(self, a, b):
 
3999
        """Compares two operands using their abstract representation.
 
4000
 
 
4001
        This is not like the standard compare, which use their numerical
 
4002
        value. Note that a total ordering is defined for all possible abstract
 
4003
        representations.
 
4004
 
 
4005
        >>> ExtendedContext.compare_total(Decimal('12.73'), Decimal('127.9'))
 
4006
        Decimal('-1')
 
4007
        >>> ExtendedContext.compare_total(Decimal('-127'),  Decimal('12'))
 
4008
        Decimal('-1')
 
4009
        >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.3'))
 
4010
        Decimal('-1')
 
4011
        >>> ExtendedContext.compare_total(Decimal('12.30'), Decimal('12.30'))
 
4012
        Decimal('0')
 
4013
        >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('12.300'))
 
4014
        Decimal('1')
 
4015
        >>> ExtendedContext.compare_total(Decimal('12.3'),  Decimal('NaN'))
 
4016
        Decimal('-1')
 
4017
        """
 
4018
        return a.compare_total(b)
 
4019
 
 
4020
    def compare_total_mag(self, a, b):
 
4021
        """Compares two operands using their abstract representation ignoring sign.
 
4022
 
 
4023
        Like compare_total, but with operand's sign ignored and assumed to be 0.
 
4024
        """
 
4025
        return a.compare_total_mag(b)
 
4026
 
 
4027
    def copy_abs(self, a):
 
4028
        """Returns a copy of the operand with the sign set to 0.
 
4029
 
 
4030
        >>> ExtendedContext.copy_abs(Decimal('2.1'))
 
4031
        Decimal('2.1')
 
4032
        >>> ExtendedContext.copy_abs(Decimal('-100'))
 
4033
        Decimal('100')
 
4034
        """
 
4035
        return a.copy_abs()
 
4036
 
 
4037
    def copy_decimal(self, a):
 
4038
        """Returns a copy of the decimal objet.
 
4039
 
 
4040
        >>> ExtendedContext.copy_decimal(Decimal('2.1'))
 
4041
        Decimal('2.1')
 
4042
        >>> ExtendedContext.copy_decimal(Decimal('-1.00'))
 
4043
        Decimal('-1.00')
 
4044
        """
 
4045
        return Decimal(a)
 
4046
 
 
4047
    def copy_negate(self, a):
 
4048
        """Returns a copy of the operand with the sign inverted.
 
4049
 
 
4050
        >>> ExtendedContext.copy_negate(Decimal('101.5'))
 
4051
        Decimal('-101.5')
 
4052
        >>> ExtendedContext.copy_negate(Decimal('-101.5'))
 
4053
        Decimal('101.5')
 
4054
        """
 
4055
        return a.copy_negate()
 
4056
 
 
4057
    def copy_sign(self, a, b):
 
4058
        """Copies the second operand's sign to the first one.
 
4059
 
 
4060
        In detail, it returns a copy of the first operand with the sign
 
4061
        equal to the sign of the second operand.
 
4062
 
 
4063
        >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('7.33'))
 
4064
        Decimal('1.50')
 
4065
        >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('7.33'))
 
4066
        Decimal('1.50')
 
4067
        >>> ExtendedContext.copy_sign(Decimal( '1.50'), Decimal('-7.33'))
 
4068
        Decimal('-1.50')
 
4069
        >>> ExtendedContext.copy_sign(Decimal('-1.50'), Decimal('-7.33'))
 
4070
        Decimal('-1.50')
 
4071
        """
 
4072
        return a.copy_sign(b)
 
4073
 
 
4074
    def divide(self, a, b):
 
4075
        """Decimal division in a specified context.
 
4076
 
 
4077
        >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
 
4078
        Decimal('0.333333333')
 
4079
        >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
 
4080
        Decimal('0.666666667')
 
4081
        >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
 
4082
        Decimal('2.5')
 
4083
        >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
 
4084
        Decimal('0.1')
 
4085
        >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
 
4086
        Decimal('1')
 
4087
        >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
 
4088
        Decimal('4.00')
 
4089
        >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
 
4090
        Decimal('1.20')
 
4091
        >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
 
4092
        Decimal('10')
 
4093
        >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
 
4094
        Decimal('1000')
 
4095
        >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
 
4096
        Decimal('1.20E+6')
 
4097
        """
 
4098
        return a.__truediv__(b, context=self)
 
4099
 
 
4100
    def divide_int(self, a, b):
 
4101
        """Divides two numbers and returns the integer part of the result.
 
4102
 
 
4103
        >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
 
4104
        Decimal('0')
 
4105
        >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
 
4106
        Decimal('3')
 
4107
        >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
 
4108
        Decimal('3')
 
4109
        """
 
4110
        return a.__floordiv__(b, context=self)
 
4111
 
 
4112
    def divmod(self, a, b):
 
4113
        return a.__divmod__(b, context=self)
 
4114
 
 
4115
    def exp(self, a):
 
4116
        """Returns e ** a.
 
4117
 
 
4118
        >>> c = ExtendedContext.copy()
 
4119
        >>> c.Emin = -999
 
4120
        >>> c.Emax = 999
 
4121
        >>> c.exp(Decimal('-Infinity'))
 
4122
        Decimal('0')
 
4123
        >>> c.exp(Decimal('-1'))
 
4124
        Decimal('0.367879441')
 
4125
        >>> c.exp(Decimal('0'))
 
4126
        Decimal('1')
 
4127
        >>> c.exp(Decimal('1'))
 
4128
        Decimal('2.71828183')
 
4129
        >>> c.exp(Decimal('0.693147181'))
 
4130
        Decimal('2.00000000')
 
4131
        >>> c.exp(Decimal('+Infinity'))
 
4132
        Decimal('Infinity')
 
4133
        """
 
4134
        return a.exp(context=self)
 
4135
 
 
4136
    def fma(self, a, b, c):
 
4137
        """Returns a multiplied by b, plus c.
 
4138
 
 
4139
        The first two operands are multiplied together, using multiply,
 
4140
        the third operand is then added to the result of that
 
4141
        multiplication, using add, all with only one final rounding.
 
4142
 
 
4143
        >>> ExtendedContext.fma(Decimal('3'), Decimal('5'), Decimal('7'))
 
4144
        Decimal('22')
 
4145
        >>> ExtendedContext.fma(Decimal('3'), Decimal('-5'), Decimal('7'))
 
4146
        Decimal('-8')
 
4147
        >>> ExtendedContext.fma(Decimal('888565290'), Decimal('1557.96930'), Decimal('-86087.7578'))
 
4148
        Decimal('1.38435736E+12')
 
4149
        """
 
4150
        return a.fma(b, c, context=self)
 
4151
 
 
4152
    def is_canonical(self, a):
 
4153
        """Return True if the operand is canonical; otherwise return False.
 
4154
 
 
4155
        Currently, the encoding of a Decimal instance is always
 
4156
        canonical, so this method returns True for any Decimal.
 
4157
 
 
4158
        >>> ExtendedContext.is_canonical(Decimal('2.50'))
 
4159
        True
 
4160
        """
 
4161
        return a.is_canonical()
 
4162
 
 
4163
    def is_finite(self, a):
 
4164
        """Return True if the operand is finite; otherwise return False.
 
4165
 
 
4166
        A Decimal instance is considered finite if it is neither
 
4167
        infinite nor a NaN.
 
4168
 
 
4169
        >>> ExtendedContext.is_finite(Decimal('2.50'))
 
4170
        True
 
4171
        >>> ExtendedContext.is_finite(Decimal('-0.3'))
 
4172
        True
 
4173
        >>> ExtendedContext.is_finite(Decimal('0'))
 
4174
        True
 
4175
        >>> ExtendedContext.is_finite(Decimal('Inf'))
 
4176
        False
 
4177
        >>> ExtendedContext.is_finite(Decimal('NaN'))
 
4178
        False
 
4179
        """
 
4180
        return a.is_finite()
 
4181
 
 
4182
    def is_infinite(self, a):
 
4183
        """Return True if the operand is infinite; otherwise return False.
 
4184
 
 
4185
        >>> ExtendedContext.is_infinite(Decimal('2.50'))
 
4186
        False
 
4187
        >>> ExtendedContext.is_infinite(Decimal('-Inf'))
 
4188
        True
 
4189
        >>> ExtendedContext.is_infinite(Decimal('NaN'))
 
4190
        False
 
4191
        """
 
4192
        return a.is_infinite()
 
4193
 
 
4194
    def is_nan(self, a):
 
4195
        """Return True if the operand is a qNaN or sNaN;
 
4196
        otherwise return False.
 
4197
 
 
4198
        >>> ExtendedContext.is_nan(Decimal('2.50'))
 
4199
        False
 
4200
        >>> ExtendedContext.is_nan(Decimal('NaN'))
 
4201
        True
 
4202
        >>> ExtendedContext.is_nan(Decimal('-sNaN'))
 
4203
        True
 
4204
        """
 
4205
        return a.is_nan()
 
4206
 
 
4207
    def is_normal(self, a):
 
4208
        """Return True if the operand is a normal number;
 
4209
        otherwise return False.
 
4210
 
 
4211
        >>> c = ExtendedContext.copy()
 
4212
        >>> c.Emin = -999
 
4213
        >>> c.Emax = 999
 
4214
        >>> c.is_normal(Decimal('2.50'))
 
4215
        True
 
4216
        >>> c.is_normal(Decimal('0.1E-999'))
 
4217
        False
 
4218
        >>> c.is_normal(Decimal('0.00'))
 
4219
        False
 
4220
        >>> c.is_normal(Decimal('-Inf'))
 
4221
        False
 
4222
        >>> c.is_normal(Decimal('NaN'))
 
4223
        False
 
4224
        """
 
4225
        return a.is_normal(context=self)
 
4226
 
 
4227
    def is_qnan(self, a):
 
4228
        """Return True if the operand is a quiet NaN; otherwise return False.
 
4229
 
 
4230
        >>> ExtendedContext.is_qnan(Decimal('2.50'))
 
4231
        False
 
4232
        >>> ExtendedContext.is_qnan(Decimal('NaN'))
 
4233
        True
 
4234
        >>> ExtendedContext.is_qnan(Decimal('sNaN'))
 
4235
        False
 
4236
        """
 
4237
        return a.is_qnan()
 
4238
 
 
4239
    def is_signed(self, a):
 
4240
        """Return True if the operand is negative; otherwise return False.
 
4241
 
 
4242
        >>> ExtendedContext.is_signed(Decimal('2.50'))
 
4243
        False
 
4244
        >>> ExtendedContext.is_signed(Decimal('-12'))
 
4245
        True
 
4246
        >>> ExtendedContext.is_signed(Decimal('-0'))
 
4247
        True
 
4248
        """
 
4249
        return a.is_signed()
 
4250
 
 
4251
    def is_snan(self, a):
 
4252
        """Return True if the operand is a signaling NaN;
 
4253
        otherwise return False.
 
4254
 
 
4255
        >>> ExtendedContext.is_snan(Decimal('2.50'))
 
4256
        False
 
4257
        >>> ExtendedContext.is_snan(Decimal('NaN'))
 
4258
        False
 
4259
        >>> ExtendedContext.is_snan(Decimal('sNaN'))
 
4260
        True
 
4261
        """
 
4262
        return a.is_snan()
 
4263
 
 
4264
    def is_subnormal(self, a):
 
4265
        """Return True if the operand is subnormal; otherwise return False.
 
4266
 
 
4267
        >>> c = ExtendedContext.copy()
 
4268
        >>> c.Emin = -999
 
4269
        >>> c.Emax = 999
 
4270
        >>> c.is_subnormal(Decimal('2.50'))
 
4271
        False
 
4272
        >>> c.is_subnormal(Decimal('0.1E-999'))
 
4273
        True
 
4274
        >>> c.is_subnormal(Decimal('0.00'))
 
4275
        False
 
4276
        >>> c.is_subnormal(Decimal('-Inf'))
 
4277
        False
 
4278
        >>> c.is_subnormal(Decimal('NaN'))
 
4279
        False
 
4280
        """
 
4281
        return a.is_subnormal(context=self)
 
4282
 
 
4283
    def is_zero(self, a):
 
4284
        """Return True if the operand is a zero; otherwise return False.
 
4285
 
 
4286
        >>> ExtendedContext.is_zero(Decimal('0'))
 
4287
        True
 
4288
        >>> ExtendedContext.is_zero(Decimal('2.50'))
 
4289
        False
 
4290
        >>> ExtendedContext.is_zero(Decimal('-0E+2'))
 
4291
        True
 
4292
        """
 
4293
        return a.is_zero()
 
4294
 
 
4295
    def ln(self, a):
 
4296
        """Returns the natural (base e) logarithm of the operand.
 
4297
 
 
4298
        >>> c = ExtendedContext.copy()
 
4299
        >>> c.Emin = -999
 
4300
        >>> c.Emax = 999
 
4301
        >>> c.ln(Decimal('0'))
 
4302
        Decimal('-Infinity')
 
4303
        >>> c.ln(Decimal('1.000'))
 
4304
        Decimal('0')
 
4305
        >>> c.ln(Decimal('2.71828183'))
 
4306
        Decimal('1.00000000')
 
4307
        >>> c.ln(Decimal('10'))
 
4308
        Decimal('2.30258509')
 
4309
        >>> c.ln(Decimal('+Infinity'))
 
4310
        Decimal('Infinity')
 
4311
        """
 
4312
        return a.ln(context=self)
 
4313
 
 
4314
    def log10(self, a):
 
4315
        """Returns the base 10 logarithm of the operand.
 
4316
 
 
4317
        >>> c = ExtendedContext.copy()
 
4318
        >>> c.Emin = -999
 
4319
        >>> c.Emax = 999
 
4320
        >>> c.log10(Decimal('0'))
 
4321
        Decimal('-Infinity')
 
4322
        >>> c.log10(Decimal('0.001'))
 
4323
        Decimal('-3')
 
4324
        >>> c.log10(Decimal('1.000'))
 
4325
        Decimal('0')
 
4326
        >>> c.log10(Decimal('2'))
 
4327
        Decimal('0.301029996')
 
4328
        >>> c.log10(Decimal('10'))
 
4329
        Decimal('1')
 
4330
        >>> c.log10(Decimal('70'))
 
4331
        Decimal('1.84509804')
 
4332
        >>> c.log10(Decimal('+Infinity'))
 
4333
        Decimal('Infinity')
 
4334
        """
 
4335
        return a.log10(context=self)
 
4336
 
 
4337
    def logb(self, a):
 
4338
        """ Returns the exponent of the magnitude of the operand's MSD.
 
4339
 
 
4340
        The result is the integer which is the exponent of the magnitude
 
4341
        of the most significant digit of the operand (as though the
 
4342
        operand were truncated to a single digit while maintaining the
 
4343
        value of that digit and without limiting the resulting exponent).
 
4344
 
 
4345
        >>> ExtendedContext.logb(Decimal('250'))
 
4346
        Decimal('2')
 
4347
        >>> ExtendedContext.logb(Decimal('2.50'))
 
4348
        Decimal('0')
 
4349
        >>> ExtendedContext.logb(Decimal('0.03'))
 
4350
        Decimal('-2')
 
4351
        >>> ExtendedContext.logb(Decimal('0'))
 
4352
        Decimal('-Infinity')
 
4353
        """
 
4354
        return a.logb(context=self)
 
4355
 
 
4356
    def logical_and(self, a, b):
 
4357
        """Applies the logical operation 'and' between each operand's digits.
 
4358
 
 
4359
        The operands must be both logical numbers.
 
4360
 
 
4361
        >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))
 
4362
        Decimal('0')
 
4363
        >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))
 
4364
        Decimal('0')
 
4365
        >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))
 
4366
        Decimal('0')
 
4367
        >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))
 
4368
        Decimal('1')
 
4369
        >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))
 
4370
        Decimal('1000')
 
4371
        >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))
 
4372
        Decimal('10')
 
4373
        """
 
4374
        return a.logical_and(b, context=self)
 
4375
 
 
4376
    def logical_invert(self, a):
 
4377
        """Invert all the digits in the operand.
 
4378
 
 
4379
        The operand must be a logical number.
 
4380
 
 
4381
        >>> ExtendedContext.logical_invert(Decimal('0'))
 
4382
        Decimal('111111111')
 
4383
        >>> ExtendedContext.logical_invert(Decimal('1'))
 
4384
        Decimal('111111110')
 
4385
        >>> ExtendedContext.logical_invert(Decimal('111111111'))
 
4386
        Decimal('0')
 
4387
        >>> ExtendedContext.logical_invert(Decimal('101010101'))
 
4388
        Decimal('10101010')
 
4389
        """
 
4390
        return a.logical_invert(context=self)
 
4391
 
 
4392
    def logical_or(self, a, b):
 
4393
        """Applies the logical operation 'or' between each operand's digits.
 
4394
 
 
4395
        The operands must be both logical numbers.
 
4396
 
 
4397
        >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))
 
4398
        Decimal('0')
 
4399
        >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))
 
4400
        Decimal('1')
 
4401
        >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))
 
4402
        Decimal('1')
 
4403
        >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))
 
4404
        Decimal('1')
 
4405
        >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))
 
4406
        Decimal('1110')
 
4407
        >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))
 
4408
        Decimal('1110')
 
4409
        """
 
4410
        return a.logical_or(b, context=self)
 
4411
 
 
4412
    def logical_xor(self, a, b):
 
4413
        """Applies the logical operation 'xor' between each operand's digits.
 
4414
 
 
4415
        The operands must be both logical numbers.
 
4416
 
 
4417
        >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))
 
4418
        Decimal('0')
 
4419
        >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))
 
4420
        Decimal('1')
 
4421
        >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))
 
4422
        Decimal('1')
 
4423
        >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))
 
4424
        Decimal('0')
 
4425
        >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))
 
4426
        Decimal('110')
 
4427
        >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))
 
4428
        Decimal('1101')
 
4429
        """
 
4430
        return a.logical_xor(b, context=self)
 
4431
 
 
4432
    def max(self, a,b):
 
4433
        """max compares two values numerically and returns the maximum.
 
4434
 
 
4435
        If either operand is a NaN then the general rules apply.
 
4436
        Otherwise, the operands are compared as though by the compare
 
4437
        operation.  If they are numerically equal then the left-hand operand
 
4438
        is chosen as the result.  Otherwise the maximum (closer to positive
 
4439
        infinity) of the two operands is chosen as the result.
 
4440
 
 
4441
        >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
 
4442
        Decimal('3')
 
4443
        >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
 
4444
        Decimal('3')
 
4445
        >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
 
4446
        Decimal('1')
 
4447
        >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
 
4448
        Decimal('7')
 
4449
        """
 
4450
        return a.max(b, context=self)
 
4451
 
 
4452
    def max_mag(self, a, b):
 
4453
        """Compares the values numerically with their sign ignored."""
 
4454
        return a.max_mag(b, context=self)
 
4455
 
 
4456
    def min(self, a,b):
 
4457
        """min compares two values numerically and returns the minimum.
 
4458
 
 
4459
        If either operand is a NaN then the general rules apply.
 
4460
        Otherwise, the operands are compared as though by the compare
 
4461
        operation.  If they are numerically equal then the left-hand operand
 
4462
        is chosen as the result.  Otherwise the minimum (closer to negative
 
4463
        infinity) of the two operands is chosen as the result.
 
4464
 
 
4465
        >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
 
4466
        Decimal('2')
 
4467
        >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
 
4468
        Decimal('-10')
 
4469
        >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
 
4470
        Decimal('1.0')
 
4471
        >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
 
4472
        Decimal('7')
 
4473
        """
 
4474
        return a.min(b, context=self)
 
4475
 
 
4476
    def min_mag(self, a, b):
 
4477
        """Compares the values numerically with their sign ignored."""
 
4478
        return a.min_mag(b, context=self)
 
4479
 
 
4480
    def minus(self, a):
 
4481
        """Minus corresponds to unary prefix minus in Python.
 
4482
 
 
4483
        The operation is evaluated using the same rules as subtract; the
 
4484
        operation minus(a) is calculated as subtract('0', a) where the '0'
 
4485
        has the same exponent as the operand.
 
4486
 
 
4487
        >>> ExtendedContext.minus(Decimal('1.3'))
 
4488
        Decimal('-1.3')
 
4489
        >>> ExtendedContext.minus(Decimal('-1.3'))
 
4490
        Decimal('1.3')
 
4491
        """
 
4492
        return a.__neg__(context=self)
 
4493
 
 
4494
    def multiply(self, a, b):
 
4495
        """multiply multiplies two operands.
 
4496
 
 
4497
        If either operand is a special value then the general rules apply.
 
4498
        Otherwise, the operands are multiplied together ('long multiplication'),
 
4499
        resulting in a number which may be as long as the sum of the lengths
 
4500
        of the two operands.
 
4501
 
 
4502
        >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
 
4503
        Decimal('3.60')
 
4504
        >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
 
4505
        Decimal('21')
 
4506
        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
 
4507
        Decimal('0.72')
 
4508
        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
 
4509
        Decimal('-0.0')
 
4510
        >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
 
4511
        Decimal('4.28135971E+11')
 
4512
        """
 
4513
        return a.__mul__(b, context=self)
 
4514
 
 
4515
    def next_minus(self, a):
 
4516
        """Returns the largest representable number smaller than a.
 
4517
 
 
4518
        >>> c = ExtendedContext.copy()
 
4519
        >>> c.Emin = -999
 
4520
        >>> c.Emax = 999
 
4521
        >>> ExtendedContext.next_minus(Decimal('1'))
 
4522
        Decimal('0.999999999')
 
4523
        >>> c.next_minus(Decimal('1E-1007'))
 
4524
        Decimal('0E-1007')
 
4525
        >>> ExtendedContext.next_minus(Decimal('-1.00000003'))
 
4526
        Decimal('-1.00000004')
 
4527
        >>> c.next_minus(Decimal('Infinity'))
 
4528
        Decimal('9.99999999E+999')
 
4529
        """
 
4530
        return a.next_minus(context=self)
 
4531
 
 
4532
    def next_plus(self, a):
 
4533
        """Returns the smallest representable number larger than a.
 
4534
 
 
4535
        >>> c = ExtendedContext.copy()
 
4536
        >>> c.Emin = -999
 
4537
        >>> c.Emax = 999
 
4538
        >>> ExtendedContext.next_plus(Decimal('1'))
 
4539
        Decimal('1.00000001')
 
4540
        >>> c.next_plus(Decimal('-1E-1007'))
 
4541
        Decimal('-0E-1007')
 
4542
        >>> ExtendedContext.next_plus(Decimal('-1.00000003'))
 
4543
        Decimal('-1.00000002')
 
4544
        >>> c.next_plus(Decimal('-Infinity'))
 
4545
        Decimal('-9.99999999E+999')
 
4546
        """
 
4547
        return a.next_plus(context=self)
 
4548
 
 
4549
    def next_toward(self, a, b):
 
4550
        """Returns the number closest to a, in direction towards b.
 
4551
 
 
4552
        The result is the closest representable number from the first
 
4553
        operand (but not the first operand) that is in the direction
 
4554
        towards the second operand, unless the operands have the same
 
4555
        value.
 
4556
 
 
4557
        >>> c = ExtendedContext.copy()
 
4558
        >>> c.Emin = -999
 
4559
        >>> c.Emax = 999
 
4560
        >>> c.next_toward(Decimal('1'), Decimal('2'))
 
4561
        Decimal('1.00000001')
 
4562
        >>> c.next_toward(Decimal('-1E-1007'), Decimal('1'))
 
4563
        Decimal('-0E-1007')
 
4564
        >>> c.next_toward(Decimal('-1.00000003'), Decimal('0'))
 
4565
        Decimal('-1.00000002')
 
4566
        >>> c.next_toward(Decimal('1'), Decimal('0'))
 
4567
        Decimal('0.999999999')
 
4568
        >>> c.next_toward(Decimal('1E-1007'), Decimal('-100'))
 
4569
        Decimal('0E-1007')
 
4570
        >>> c.next_toward(Decimal('-1.00000003'), Decimal('-10'))
 
4571
        Decimal('-1.00000004')
 
4572
        >>> c.next_toward(Decimal('0.00'), Decimal('-0.0000'))
 
4573
        Decimal('-0.00')
 
4574
        """
 
4575
        return a.next_toward(b, context=self)
 
4576
 
 
4577
    def normalize(self, a):
 
4578
        """normalize reduces an operand to its simplest form.
 
4579
 
 
4580
        Essentially a plus operation with all trailing zeros removed from the
 
4581
        result.
 
4582
 
 
4583
        >>> ExtendedContext.normalize(Decimal('2.1'))
 
4584
        Decimal('2.1')
 
4585
        >>> ExtendedContext.normalize(Decimal('-2.0'))
 
4586
        Decimal('-2')
 
4587
        >>> ExtendedContext.normalize(Decimal('1.200'))
 
4588
        Decimal('1.2')
 
4589
        >>> ExtendedContext.normalize(Decimal('-120'))
 
4590
        Decimal('-1.2E+2')
 
4591
        >>> ExtendedContext.normalize(Decimal('120.00'))
 
4592
        Decimal('1.2E+2')
 
4593
        >>> ExtendedContext.normalize(Decimal('0.00'))
 
4594
        Decimal('0')
 
4595
        """
 
4596
        return a.normalize(context=self)
 
4597
 
 
4598
    def number_class(self, a):
 
4599
        """Returns an indication of the class of the operand.
 
4600
 
 
4601
        The class is one of the following strings:
 
4602
          -sNaN
 
4603
          -NaN
 
4604
          -Infinity
 
4605
          -Normal
 
4606
          -Subnormal
 
4607
          -Zero
 
4608
          +Zero
 
4609
          +Subnormal
 
4610
          +Normal
 
4611
          +Infinity
 
4612
 
 
4613
        >>> c = Context(ExtendedContext)
 
4614
        >>> c.Emin = -999
 
4615
        >>> c.Emax = 999
 
4616
        >>> c.number_class(Decimal('Infinity'))
 
4617
        '+Infinity'
 
4618
        >>> c.number_class(Decimal('1E-10'))
 
4619
        '+Normal'
 
4620
        >>> c.number_class(Decimal('2.50'))
 
4621
        '+Normal'
 
4622
        >>> c.number_class(Decimal('0.1E-999'))
 
4623
        '+Subnormal'
 
4624
        >>> c.number_class(Decimal('0'))
 
4625
        '+Zero'
 
4626
        >>> c.number_class(Decimal('-0'))
 
4627
        '-Zero'
 
4628
        >>> c.number_class(Decimal('-0.1E-999'))
 
4629
        '-Subnormal'
 
4630
        >>> c.number_class(Decimal('-1E-10'))
 
4631
        '-Normal'
 
4632
        >>> c.number_class(Decimal('-2.50'))
 
4633
        '-Normal'
 
4634
        >>> c.number_class(Decimal('-Infinity'))
 
4635
        '-Infinity'
 
4636
        >>> c.number_class(Decimal('NaN'))
 
4637
        'NaN'
 
4638
        >>> c.number_class(Decimal('-NaN'))
 
4639
        'NaN'
 
4640
        >>> c.number_class(Decimal('sNaN'))
 
4641
        'sNaN'
 
4642
        """
 
4643
        return a.number_class(context=self)
 
4644
 
 
4645
    def plus(self, a):
 
4646
        """Plus corresponds to unary prefix plus in Python.
 
4647
 
 
4648
        The operation is evaluated using the same rules as add; the
 
4649
        operation plus(a) is calculated as add('0', a) where the '0'
 
4650
        has the same exponent as the operand.
 
4651
 
 
4652
        >>> ExtendedContext.plus(Decimal('1.3'))
 
4653
        Decimal('1.3')
 
4654
        >>> ExtendedContext.plus(Decimal('-1.3'))
 
4655
        Decimal('-1.3')
 
4656
        """
 
4657
        return a.__pos__(context=self)
 
4658
 
 
4659
    def power(self, a, b, modulo=None):
 
4660
        """Raises a to the power of b, to modulo if given.
 
4661
 
 
4662
        With two arguments, compute a**b.  If a is negative then b
 
4663
        must be integral.  The result will be inexact unless b is
 
4664
        integral and the result is finite and can be expressed exactly
 
4665
        in 'precision' digits.
 
4666
 
 
4667
        With three arguments, compute (a**b) % modulo.  For the
 
4668
        three argument form, the following restrictions on the
 
4669
        arguments hold:
 
4670
 
 
4671
         - all three arguments must be integral
 
4672
         - b must be nonnegative
 
4673
         - at least one of a or b must be nonzero
 
4674
         - modulo must be nonzero and have at most 'precision' digits
 
4675
 
 
4676
        The result of pow(a, b, modulo) is identical to the result
 
4677
        that would be obtained by computing (a**b) % modulo with
 
4678
        unbounded precision, but is computed more efficiently.  It is
 
4679
        always exact.
 
4680
 
 
4681
        >>> c = ExtendedContext.copy()
 
4682
        >>> c.Emin = -999
 
4683
        >>> c.Emax = 999
 
4684
        >>> c.power(Decimal('2'), Decimal('3'))
 
4685
        Decimal('8')
 
4686
        >>> c.power(Decimal('-2'), Decimal('3'))
 
4687
        Decimal('-8')
 
4688
        >>> c.power(Decimal('2'), Decimal('-3'))
 
4689
        Decimal('0.125')
 
4690
        >>> c.power(Decimal('1.7'), Decimal('8'))
 
4691
        Decimal('69.7575744')
 
4692
        >>> c.power(Decimal('10'), Decimal('0.301029996'))
 
4693
        Decimal('2.00000000')
 
4694
        >>> c.power(Decimal('Infinity'), Decimal('-1'))
 
4695
        Decimal('0')
 
4696
        >>> c.power(Decimal('Infinity'), Decimal('0'))
 
4697
        Decimal('1')
 
4698
        >>> c.power(Decimal('Infinity'), Decimal('1'))
 
4699
        Decimal('Infinity')
 
4700
        >>> c.power(Decimal('-Infinity'), Decimal('-1'))
 
4701
        Decimal('-0')
 
4702
        >>> c.power(Decimal('-Infinity'), Decimal('0'))
 
4703
        Decimal('1')
 
4704
        >>> c.power(Decimal('-Infinity'), Decimal('1'))
 
4705
        Decimal('-Infinity')
 
4706
        >>> c.power(Decimal('-Infinity'), Decimal('2'))
 
4707
        Decimal('Infinity')
 
4708
        >>> c.power(Decimal('0'), Decimal('0'))
 
4709
        Decimal('NaN')
 
4710
 
 
4711
        >>> c.power(Decimal('3'), Decimal('7'), Decimal('16'))
 
4712
        Decimal('11')
 
4713
        >>> c.power(Decimal('-3'), Decimal('7'), Decimal('16'))
 
4714
        Decimal('-11')
 
4715
        >>> c.power(Decimal('-3'), Decimal('8'), Decimal('16'))
 
4716
        Decimal('1')
 
4717
        >>> c.power(Decimal('3'), Decimal('7'), Decimal('-16'))
 
4718
        Decimal('11')
 
4719
        >>> c.power(Decimal('23E12345'), Decimal('67E189'), Decimal('123456789'))
 
4720
        Decimal('11729830')
 
4721
        >>> c.power(Decimal('-0'), Decimal('17'), Decimal('1729'))
 
4722
        Decimal('-0')
 
4723
        >>> c.power(Decimal('-23'), Decimal('0'), Decimal('65537'))
 
4724
        Decimal('1')
 
4725
        """
 
4726
        return a.__pow__(b, modulo, context=self)
 
4727
 
 
4728
    def quantize(self, a, b):
 
4729
        """Returns a value equal to 'a' (rounded), having the exponent of 'b'.
 
4730
 
 
4731
        The coefficient of the result is derived from that of the left-hand
 
4732
        operand.  It may be rounded using the current rounding setting (if the
 
4733
        exponent is being increased), multiplied by a positive power of ten (if
 
4734
        the exponent is being decreased), or is unchanged (if the exponent is
 
4735
        already equal to that of the right-hand operand).
 
4736
 
 
4737
        Unlike other operations, if the length of the coefficient after the
 
4738
        quantize operation would be greater than precision then an Invalid
 
4739
        operation condition is raised.  This guarantees that, unless there is
 
4740
        an error condition, the exponent of the result of a quantize is always
 
4741
        equal to that of the right-hand operand.
 
4742
 
 
4743
        Also unlike other operations, quantize will never raise Underflow, even
 
4744
        if the result is subnormal and inexact.
 
4745
 
 
4746
        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
 
4747
        Decimal('2.170')
 
4748
        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
 
4749
        Decimal('2.17')
 
4750
        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
 
4751
        Decimal('2.2')
 
4752
        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
 
4753
        Decimal('2')
 
4754
        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
 
4755
        Decimal('0E+1')
 
4756
        >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
 
4757
        Decimal('-Infinity')
 
4758
        >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
 
4759
        Decimal('NaN')
 
4760
        >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
 
4761
        Decimal('-0')
 
4762
        >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
 
4763
        Decimal('-0E+5')
 
4764
        >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
 
4765
        Decimal('NaN')
 
4766
        >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
 
4767
        Decimal('NaN')
 
4768
        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
 
4769
        Decimal('217.0')
 
4770
        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
 
4771
        Decimal('217')
 
4772
        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
 
4773
        Decimal('2.2E+2')
 
4774
        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
 
4775
        Decimal('2E+2')
 
4776
        """
 
4777
        return a.quantize(b, context=self)
 
4778
 
 
4779
    def radix(self):
 
4780
        """Just returns 10, as this is Decimal, :)
 
4781
 
 
4782
        >>> ExtendedContext.radix()
 
4783
        Decimal('10')
 
4784
        """
 
4785
        return Decimal(10)
 
4786
 
 
4787
    def remainder(self, a, b):
 
4788
        """Returns the remainder from integer division.
 
4789
 
 
4790
        The result is the residue of the dividend after the operation of
 
4791
        calculating integer division as described for divide-integer, rounded
 
4792
        to precision digits if necessary.  The sign of the result, if
 
4793
        non-zero, is the same as that of the original dividend.
 
4794
 
 
4795
        This operation will fail under the same conditions as integer division
 
4796
        (that is, if integer division on the same two operands would fail, the
 
4797
        remainder cannot be calculated).
 
4798
 
 
4799
        >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
 
4800
        Decimal('2.1')
 
4801
        >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
 
4802
        Decimal('1')
 
4803
        >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
 
4804
        Decimal('-1')
 
4805
        >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
 
4806
        Decimal('0.2')
 
4807
        >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
 
4808
        Decimal('0.1')
 
4809
        >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
 
4810
        Decimal('1.0')
 
4811
        """
 
4812
        return a.__mod__(b, context=self)
 
4813
 
 
4814
    def remainder_near(self, a, b):
 
4815
        """Returns to be "a - b * n", where n is the integer nearest the exact
 
4816
        value of "x / b" (if two integers are equally near then the even one
 
4817
        is chosen).  If the result is equal to 0 then its sign will be the
 
4818
        sign of a.
 
4819
 
 
4820
        This operation will fail under the same conditions as integer division
 
4821
        (that is, if integer division on the same two operands would fail, the
 
4822
        remainder cannot be calculated).
 
4823
 
 
4824
        >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
 
4825
        Decimal('-0.9')
 
4826
        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
 
4827
        Decimal('-2')
 
4828
        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
 
4829
        Decimal('1')
 
4830
        >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
 
4831
        Decimal('-1')
 
4832
        >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
 
4833
        Decimal('0.2')
 
4834
        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
 
4835
        Decimal('0.1')
 
4836
        >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
 
4837
        Decimal('-0.3')
 
4838
        """
 
4839
        return a.remainder_near(b, context=self)
 
4840
 
 
4841
    def rotate(self, a, b):
 
4842
        """Returns a rotated copy of a, b times.
 
4843
 
 
4844
        The coefficient of the result is a rotated copy of the digits in
 
4845
        the coefficient of the first operand.  The number of places of
 
4846
        rotation is taken from the absolute value of the second operand,
 
4847
        with the rotation being to the left if the second operand is
 
4848
        positive or to the right otherwise.
 
4849
 
 
4850
        >>> ExtendedContext.rotate(Decimal('34'), Decimal('8'))
 
4851
        Decimal('400000003')
 
4852
        >>> ExtendedContext.rotate(Decimal('12'), Decimal('9'))
 
4853
        Decimal('12')
 
4854
        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('-2'))
 
4855
        Decimal('891234567')
 
4856
        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('0'))
 
4857
        Decimal('123456789')
 
4858
        >>> ExtendedContext.rotate(Decimal('123456789'), Decimal('+2'))
 
4859
        Decimal('345678912')
 
4860
        """
 
4861
        return a.rotate(b, context=self)
 
4862
 
 
4863
    def same_quantum(self, a, b):
 
4864
        """Returns True if the two operands have the same exponent.
 
4865
 
 
4866
        The result is never affected by either the sign or the coefficient of
 
4867
        either operand.
 
4868
 
 
4869
        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
 
4870
        False
 
4871
        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
 
4872
        True
 
4873
        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
 
4874
        False
 
4875
        >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
 
4876
        True
 
4877
        """
 
4878
        return a.same_quantum(b)
 
4879
 
 
4880
    def scaleb (self, a, b):
 
4881
        """Returns the first operand after adding the second value its exp.
 
4882
 
 
4883
        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('-2'))
 
4884
        Decimal('0.0750')
 
4885
        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('0'))
 
4886
        Decimal('7.50')
 
4887
        >>> ExtendedContext.scaleb(Decimal('7.50'), Decimal('3'))
 
4888
        Decimal('7.50E+3')
 
4889
        """
 
4890
        return a.scaleb (b, context=self)
 
4891
 
 
4892
    def shift(self, a, b):
 
4893
        """Returns a shifted copy of a, b times.
 
4894
 
 
4895
        The coefficient of the result is a shifted copy of the digits
 
4896
        in the coefficient of the first operand.  The number of places
 
4897
        to shift is taken from the absolute value of the second operand,
 
4898
        with the shift being to the left if the second operand is
 
4899
        positive or to the right otherwise.  Digits shifted into the
 
4900
        coefficient are zeros.
 
4901
 
 
4902
        >>> ExtendedContext.shift(Decimal('34'), Decimal('8'))
 
4903
        Decimal('400000000')
 
4904
        >>> ExtendedContext.shift(Decimal('12'), Decimal('9'))
 
4905
        Decimal('0')
 
4906
        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('-2'))
 
4907
        Decimal('1234567')
 
4908
        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('0'))
 
4909
        Decimal('123456789')
 
4910
        >>> ExtendedContext.shift(Decimal('123456789'), Decimal('+2'))
 
4911
        Decimal('345678900')
 
4912
        """
 
4913
        return a.shift(b, context=self)
 
4914
 
 
4915
    def sqrt(self, a):
 
4916
        """Square root of a non-negative number to context precision.
 
4917
 
 
4918
        If the result must be inexact, it is rounded using the round-half-even
 
4919
        algorithm.
 
4920
 
 
4921
        >>> ExtendedContext.sqrt(Decimal('0'))
 
4922
        Decimal('0')
 
4923
        >>> ExtendedContext.sqrt(Decimal('-0'))
 
4924
        Decimal('-0')
 
4925
        >>> ExtendedContext.sqrt(Decimal('0.39'))
 
4926
        Decimal('0.624499800')
 
4927
        >>> ExtendedContext.sqrt(Decimal('100'))
 
4928
        Decimal('10')
 
4929
        >>> ExtendedContext.sqrt(Decimal('1'))
 
4930
        Decimal('1')
 
4931
        >>> ExtendedContext.sqrt(Decimal('1.0'))
 
4932
        Decimal('1.0')
 
4933
        >>> ExtendedContext.sqrt(Decimal('1.00'))
 
4934
        Decimal('1.0')
 
4935
        >>> ExtendedContext.sqrt(Decimal('7'))
 
4936
        Decimal('2.64575131')
 
4937
        >>> ExtendedContext.sqrt(Decimal('10'))
 
4938
        Decimal('3.16227766')
 
4939
        >>> ExtendedContext.prec
 
4940
        9
 
4941
        """
 
4942
        return a.sqrt(context=self)
 
4943
 
 
4944
    def subtract(self, a, b):
 
4945
        """Return the difference between the two operands.
 
4946
 
 
4947
        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
 
4948
        Decimal('0.23')
 
4949
        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
 
4950
        Decimal('0.00')
 
4951
        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
 
4952
        Decimal('-0.77')
 
4953
        """
 
4954
        return a.__sub__(b, context=self)
 
4955
 
 
4956
    def to_eng_string(self, a):
 
4957
        """Converts a number to a string, using scientific notation.
 
4958
 
 
4959
        The operation is not affected by the context.
 
4960
        """
 
4961
        return a.to_eng_string(context=self)
 
4962
 
 
4963
    def to_sci_string(self, a):
 
4964
        """Converts a number to a string, using scientific notation.
 
4965
 
 
4966
        The operation is not affected by the context.
 
4967
        """
 
4968
        return a.__str__(context=self)
 
4969
 
 
4970
    def to_integral_exact(self, a):
 
4971
        """Rounds to an integer.
 
4972
 
 
4973
        When the operand has a negative exponent, the result is the same
 
4974
        as using the quantize() operation using the given operand as the
 
4975
        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
 
4976
        of the operand as the precision setting; Inexact and Rounded flags
 
4977
        are allowed in this operation.  The rounding mode is taken from the
 
4978
        context.
 
4979
 
 
4980
        >>> ExtendedContext.to_integral_exact(Decimal('2.1'))
 
4981
        Decimal('2')
 
4982
        >>> ExtendedContext.to_integral_exact(Decimal('100'))
 
4983
        Decimal('100')
 
4984
        >>> ExtendedContext.to_integral_exact(Decimal('100.0'))
 
4985
        Decimal('100')
 
4986
        >>> ExtendedContext.to_integral_exact(Decimal('101.5'))
 
4987
        Decimal('102')
 
4988
        >>> ExtendedContext.to_integral_exact(Decimal('-101.5'))
 
4989
        Decimal('-102')
 
4990
        >>> ExtendedContext.to_integral_exact(Decimal('10E+5'))
 
4991
        Decimal('1.0E+6')
 
4992
        >>> ExtendedContext.to_integral_exact(Decimal('7.89E+77'))
 
4993
        Decimal('7.89E+77')
 
4994
        >>> ExtendedContext.to_integral_exact(Decimal('-Inf'))
 
4995
        Decimal('-Infinity')
 
4996
        """
 
4997
        return a.to_integral_exact(context=self)
 
4998
 
 
4999
    def to_integral_value(self, a):
 
5000
        """Rounds to an integer.
 
5001
 
 
5002
        When the operand has a negative exponent, the result is the same
 
5003
        as using the quantize() operation using the given operand as the
 
5004
        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
 
5005
        of the operand as the precision setting, except that no flags will
 
5006
        be set.  The rounding mode is taken from the context.
 
5007
 
 
5008
        >>> ExtendedContext.to_integral_value(Decimal('2.1'))
 
5009
        Decimal('2')
 
5010
        >>> ExtendedContext.to_integral_value(Decimal('100'))
 
5011
        Decimal('100')
 
5012
        >>> ExtendedContext.to_integral_value(Decimal('100.0'))
 
5013
        Decimal('100')
 
5014
        >>> ExtendedContext.to_integral_value(Decimal('101.5'))
 
5015
        Decimal('102')
 
5016
        >>> ExtendedContext.to_integral_value(Decimal('-101.5'))
 
5017
        Decimal('-102')
 
5018
        >>> ExtendedContext.to_integral_value(Decimal('10E+5'))
 
5019
        Decimal('1.0E+6')
 
5020
        >>> ExtendedContext.to_integral_value(Decimal('7.89E+77'))
 
5021
        Decimal('7.89E+77')
 
5022
        >>> ExtendedContext.to_integral_value(Decimal('-Inf'))
 
5023
        Decimal('-Infinity')
 
5024
        """
 
5025
        return a.to_integral_value(context=self)
 
5026
 
 
5027
    # the method name changed, but we provide also the old one, for compatibility
 
5028
    to_integral = to_integral_value
 
5029
 
 
5030
class _WorkRep(object):
 
5031
    __slots__ = ('sign','int','exp')
 
5032
    # sign: 0 or 1
 
5033
    # int:  int
 
5034
    # exp:  None, int, or string
 
5035
 
 
5036
    def __init__(self, value=None):
 
5037
        if value is None:
 
5038
            self.sign = None
 
5039
            self.int = 0
 
5040
            self.exp = None
 
5041
        elif isinstance(value, Decimal):
 
5042
            self.sign = value._sign
 
5043
            self.int = int(value._int)
 
5044
            self.exp = value._exp
 
5045
        else:
 
5046
            # assert isinstance(value, tuple)
 
5047
            self.sign = value[0]
 
5048
            self.int = value[1]
 
5049
            self.exp = value[2]
 
5050
 
 
5051
    def __repr__(self):
 
5052
        return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
 
5053
 
 
5054
    __str__ = __repr__
 
5055
 
 
5056
 
 
5057
 
 
5058
def _normalize(op1, op2, prec = 0):
 
5059
    """Normalizes op1, op2 to have the same exp and length of coefficient.
 
5060
 
 
5061
    Done during addition.
 
5062
    """
 
5063
    if op1.exp < op2.exp:
 
5064
        tmp = op2
 
5065
        other = op1
 
5066
    else:
 
5067
        tmp = op1
 
5068
        other = op2
 
5069
 
 
5070
    # Let exp = min(tmp.exp - 1, tmp.adjusted() - precision - 1).
 
5071
    # Then adding 10**exp to tmp has the same effect (after rounding)
 
5072
    # as adding any positive quantity smaller than 10**exp; similarly
 
5073
    # for subtraction.  So if other is smaller than 10**exp we replace
 
5074
    # it with 10**exp.  This avoids tmp.exp - other.exp getting too large.
 
5075
    tmp_len = len(str(tmp.int))
 
5076
    other_len = len(str(other.int))
 
5077
    exp = tmp.exp + min(-1, tmp_len - prec - 2)
 
5078
    if other_len + other.exp - 1 < exp:
 
5079
        other.int = 1
 
5080
        other.exp = exp
 
5081
 
 
5082
    tmp.int *= 10 ** (tmp.exp - other.exp)
 
5083
    tmp.exp = other.exp
 
5084
    return op1, op2
 
5085
 
 
5086
##### Integer arithmetic functions used by ln, log10, exp and __pow__ #####
 
5087
 
 
5088
# This function from Tim Peters was taken from here:
 
5089
# http://mail.python.org/pipermail/python-list/1999-July/007758.html
 
5090
# The correction being in the function definition is for speed, and
 
5091
# the whole function is not resolved with math.log because of avoiding
 
5092
# the use of floats.
 
5093
def _nbits(n, correction = {
 
5094
        '0': 4, '1': 3, '2': 2, '3': 2,
 
5095
        '4': 1, '5': 1, '6': 1, '7': 1,
 
5096
        '8': 0, '9': 0, 'a': 0, 'b': 0,
 
5097
        'c': 0, 'd': 0, 'e': 0, 'f': 0}):
 
5098
    """Number of bits in binary representation of the positive integer n,
 
5099
    or 0 if n == 0.
 
5100
    """
 
5101
    if n < 0:
 
5102
        raise ValueError("The argument to _nbits should be nonnegative.")
 
5103
    hex_n = "%x" % n
 
5104
    return 4*len(hex_n) - correction[hex_n[0]]
 
5105
 
 
5106
def _sqrt_nearest(n, a):
 
5107
    """Closest integer to the square root of the positive integer n.  a is
 
5108
    an initial approximation to the square root.  Any positive integer
 
5109
    will do for a, but the closer a is to the square root of n the
 
5110
    faster convergence will be.
 
5111
 
 
5112
    """
 
5113
    if n <= 0 or a <= 0:
 
5114
        raise ValueError("Both arguments to _sqrt_nearest should be positive.")
 
5115
 
 
5116
    b=0
 
5117
    while a != b:
 
5118
        b, a = a, a--n//a>>1
 
5119
    return a
 
5120
 
 
5121
def _rshift_nearest(x, shift):
 
5122
    """Given an integer x and a nonnegative integer shift, return closest
 
5123
    integer to x / 2**shift; use round-to-even in case of a tie.
 
5124
 
 
5125
    """
 
5126
    b, q = 1 << shift, x >> shift
 
5127
    return q + (2*(x & (b-1)) + (q&1) > b)
 
5128
 
 
5129
def _div_nearest(a, b):
 
5130
    """Closest integer to a/b, a and b positive integers; rounds to even
 
5131
    in the case of a tie.
 
5132
 
 
5133
    """
 
5134
    q, r = divmod(a, b)
 
5135
    return q + (2*r + (q&1) > b)
 
5136
 
 
5137
def _ilog(x, M, L = 8):
 
5138
    """Integer approximation to M*log(x/M), with absolute error boundable
 
5139
    in terms only of x/M.
 
5140
 
 
5141
    Given positive integers x and M, return an integer approximation to
 
5142
    M * log(x/M).  For L = 8 and 0.1 <= x/M <= 10 the difference
 
5143
    between the approximation and the exact result is at most 22.  For
 
5144
    L = 8 and 1.0 <= x/M <= 10.0 the difference is at most 15.  In
 
5145
    both cases these are upper bounds on the error; it will usually be
 
5146
    much smaller."""
 
5147
 
 
5148
    # The basic algorithm is the following: let log1p be the function
 
5149
    # log1p(x) = log(1+x).  Then log(x/M) = log1p((x-M)/M).  We use
 
5150
    # the reduction
 
5151
    #
 
5152
    #    log1p(y) = 2*log1p(y/(1+sqrt(1+y)))
 
5153
    #
 
5154
    # repeatedly until the argument to log1p is small (< 2**-L in
 
5155
    # absolute value).  For small y we can use the Taylor series
 
5156
    # expansion
 
5157
    #
 
5158
    #    log1p(y) ~ y - y**2/2 + y**3/3 - ... - (-y)**T/T
 
5159
    #
 
5160
    # truncating at T such that y**T is small enough.  The whole
 
5161
    # computation is carried out in a form of fixed-point arithmetic,
 
5162
    # with a real number z being represented by an integer
 
5163
    # approximation to z*M.  To avoid loss of precision, the y below
 
5164
    # is actually an integer approximation to 2**R*y*M, where R is the
 
5165
    # number of reductions performed so far.
 
5166
 
 
5167
    y = x-M
 
5168
    # argument reduction; R = number of reductions performed
 
5169
    R = 0
 
5170
    while (R <= L and abs(y) << L-R >= M or
 
5171
           R > L and abs(y) >> R-L >= M):
 
5172
        y = _div_nearest((M*y) << 1,
 
5173
                         M + _sqrt_nearest(M*(M+_rshift_nearest(y, R)), M))
 
5174
        R += 1
 
5175
 
 
5176
    # Taylor series with T terms
 
5177
    T = -int(-10*len(str(M))//(3*L))
 
5178
    yshift = _rshift_nearest(y, R)
 
5179
    w = _div_nearest(M, T)
 
5180
    for k in range(T-1, 0, -1):
 
5181
        w = _div_nearest(M, k) - _div_nearest(yshift*w, M)
 
5182
 
 
5183
    return _div_nearest(w*y, M)
 
5184
 
 
5185
def _dlog10(c, e, p):
 
5186
    """Given integers c, e and p with c > 0, p >= 0, compute an integer
 
5187
    approximation to 10**p * log10(c*10**e), with an absolute error of
 
5188
    at most 1.  Assumes that c*10**e is not exactly 1."""
 
5189
 
 
5190
    # increase precision by 2; compensate for this by dividing
 
5191
    # final result by 100
 
5192
    p += 2
 
5193
 
 
5194
    # write c*10**e as d*10**f with either:
 
5195
    #   f >= 0 and 1 <= d <= 10, or
 
5196
    #   f <= 0 and 0.1 <= d <= 1.
 
5197
    # Thus for c*10**e close to 1, f = 0
 
5198
    l = len(str(c))
 
5199
    f = e+l - (e+l >= 1)
 
5200
 
 
5201
    if p > 0:
 
5202
        M = 10**p
 
5203
        k = e+p-f
 
5204
        if k >= 0:
 
5205
            c *= 10**k
 
5206
        else:
 
5207
            c = _div_nearest(c, 10**-k)
 
5208
 
 
5209
        log_d = _ilog(c, M) # error < 5 + 22 = 27
 
5210
        log_10 = _log10_digits(p) # error < 1
 
5211
        log_d = _div_nearest(log_d*M, log_10)
 
5212
        log_tenpower = f*M # exact
 
5213
    else:
 
5214
        log_d = 0  # error < 2.31
 
5215
        log_tenpower = _div_nearest(f, 10**-p) # error < 0.5
 
5216
 
 
5217
    return _div_nearest(log_tenpower+log_d, 100)
 
5218
 
 
5219
def _dlog(c, e, p):
 
5220
    """Given integers c, e and p with c > 0, compute an integer
 
5221
    approximation to 10**p * log(c*10**e), with an absolute error of
 
5222
    at most 1.  Assumes that c*10**e is not exactly 1."""
 
5223
 
 
5224
    # Increase precision by 2. The precision increase is compensated
 
5225
    # for at the end with a division by 100.
 
5226
    p += 2
 
5227
 
 
5228
    # rewrite c*10**e as d*10**f with either f >= 0 and 1 <= d <= 10,
 
5229
    # or f <= 0 and 0.1 <= d <= 1.  Then we can compute 10**p * log(c*10**e)
 
5230
    # as 10**p * log(d) + 10**p*f * log(10).
 
5231
    l = len(str(c))
 
5232
    f = e+l - (e+l >= 1)
 
5233
 
 
5234
    # compute approximation to 10**p*log(d), with error < 27
 
5235
    if p > 0:
 
5236
        k = e+p-f
 
5237
        if k >= 0:
 
5238
            c *= 10**k
 
5239
        else:
 
5240
            c = _div_nearest(c, 10**-k)  # error of <= 0.5 in c
 
5241
 
 
5242
        # _ilog magnifies existing error in c by a factor of at most 10
 
5243
        log_d = _ilog(c, 10**p) # error < 5 + 22 = 27
 
5244
    else:
 
5245
        # p <= 0: just approximate the whole thing by 0; error < 2.31
 
5246
        log_d = 0
 
5247
 
 
5248
    # compute approximation to f*10**p*log(10), with error < 11.
 
5249
    if f:
 
5250
        extra = len(str(abs(f)))-1
 
5251
        if p + extra >= 0:
 
5252
            # error in f * _log10_digits(p+extra) < |f| * 1 = |f|
 
5253
            # after division, error < |f|/10**extra + 0.5 < 10 + 0.5 < 11
 
5254
            f_log_ten = _div_nearest(f*_log10_digits(p+extra), 10**extra)
 
5255
        else:
 
5256
            f_log_ten = 0
 
5257
    else:
 
5258
        f_log_ten = 0
 
5259
 
 
5260
    # error in sum < 11+27 = 38; error after division < 0.38 + 0.5 < 1
 
5261
    return _div_nearest(f_log_ten + log_d, 100)
 
5262
 
 
5263
class _Log10Memoize(object):
 
5264
    """Class to compute, store, and allow retrieval of, digits of the
 
5265
    constant log(10) = 2.302585....  This constant is needed by
 
5266
    Decimal.ln, Decimal.log10, Decimal.exp and Decimal.__pow__."""
 
5267
    def __init__(self):
 
5268
        self.digits = "23025850929940456840179914546843642076011014886"
 
5269
 
 
5270
    def getdigits(self, p):
 
5271
        """Given an integer p >= 0, return floor(10**p)*log(10).
 
5272
 
 
5273
        For example, self.getdigits(3) returns 2302.
 
5274
        """
 
5275
        # digits are stored as a string, for quick conversion to
 
5276
        # integer in the case that we've already computed enough
 
5277
        # digits; the stored digits should always be correct
 
5278
        # (truncated, not rounded to nearest).
 
5279
        if p < 0:
 
5280
            raise ValueError("p should be nonnegative")
 
5281
 
 
5282
        if p >= len(self.digits):
 
5283
            # compute p+3, p+6, p+9, ... digits; continue until at
 
5284
            # least one of the extra digits is nonzero
 
5285
            extra = 3
 
5286
            while True:
 
5287
                # compute p+extra digits, correct to within 1ulp
 
5288
                M = 10**(p+extra+2)
 
5289
                digits = str(_div_nearest(_ilog(10*M, M), 100))
 
5290
                if digits[-extra:] != '0'*extra:
 
5291
                    break
 
5292
                extra += 3
 
5293
            # keep all reliable digits so far; remove trailing zeros
 
5294
            # and next nonzero digit
 
5295
            self.digits = digits.rstrip('0')[:-1]
 
5296
        return int(self.digits[:p+1])
 
5297
 
 
5298
_log10_digits = _Log10Memoize().getdigits
 
5299
 
 
5300
def _iexp(x, M, L=8):
 
5301
    """Given integers x and M, M > 0, such that x/M is small in absolute
 
5302
    value, compute an integer approximation to M*exp(x/M).  For 0 <=
 
5303
    x/M <= 2.4, the absolute error in the result is bounded by 60 (and
 
5304
    is usually much smaller)."""
 
5305
 
 
5306
    # Algorithm: to compute exp(z) for a real number z, first divide z
 
5307
    # by a suitable power R of 2 so that |z/2**R| < 2**-L.  Then
 
5308
    # compute expm1(z/2**R) = exp(z/2**R) - 1 using the usual Taylor
 
5309
    # series
 
5310
    #
 
5311
    #     expm1(x) = x + x**2/2! + x**3/3! + ...
 
5312
    #
 
5313
    # Now use the identity
 
5314
    #
 
5315
    #     expm1(2x) = expm1(x)*(expm1(x)+2)
 
5316
    #
 
5317
    # R times to compute the sequence expm1(z/2**R),
 
5318
    # expm1(z/2**(R-1)), ... , exp(z/2), exp(z).
 
5319
 
 
5320
    # Find R such that x/2**R/M <= 2**-L
 
5321
    R = _nbits((x<<L)//M)
 
5322
 
 
5323
    # Taylor series.  (2**L)**T > M
 
5324
    T = -int(-10*len(str(M))//(3*L))
 
5325
    y = _div_nearest(x, T)
 
5326
    Mshift = M<<R
 
5327
    for i in range(T-1, 0, -1):
 
5328
        y = _div_nearest(x*(Mshift + y), Mshift * i)
 
5329
 
 
5330
    # Expansion
 
5331
    for k in range(R-1, -1, -1):
 
5332
        Mshift = M<<(k+2)
 
5333
        y = _div_nearest(y*(y+Mshift), Mshift)
 
5334
 
 
5335
    return M+y
 
5336
 
 
5337
def _dexp(c, e, p):
 
5338
    """Compute an approximation to exp(c*10**e), with p decimal places of
 
5339
    precision.
 
5340
 
 
5341
    Returns integers d, f such that:
 
5342
 
 
5343
      10**(p-1) <= d <= 10**p, and
 
5344
      (d-1)*10**f < exp(c*10**e) < (d+1)*10**f
 
5345
 
 
5346
    In other words, d*10**f is an approximation to exp(c*10**e) with p
 
5347
    digits of precision, and with an error in d of at most 1.  This is
 
5348
    almost, but not quite, the same as the error being < 1ulp: when d
 
5349
    = 10**(p-1) the error could be up to 10 ulp."""
 
5350
 
 
5351
    # we'll call iexp with M = 10**(p+2), giving p+3 digits of precision
 
5352
    p += 2
 
5353
 
 
5354
    # compute log(10) with extra precision = adjusted exponent of c*10**e
 
5355
    extra = max(0, e + len(str(c)) - 1)
 
5356
    q = p + extra
 
5357
 
 
5358
    # compute quotient c*10**e/(log(10)) = c*10**(e+q)/(log(10)*10**q),
 
5359
    # rounding down
 
5360
    shift = e+q
 
5361
    if shift >= 0:
 
5362
        cshift = c*10**shift
 
5363
    else:
 
5364
        cshift = c//10**-shift
 
5365
    quot, rem = divmod(cshift, _log10_digits(q))
 
5366
 
 
5367
    # reduce remainder back to original precision
 
5368
    rem = _div_nearest(rem, 10**extra)
 
5369
 
 
5370
    # error in result of _iexp < 120;  error after division < 0.62
 
5371
    return _div_nearest(_iexp(rem, 10**p), 1000), quot - p + 3
 
5372
 
 
5373
def _dpower(xc, xe, yc, ye, p):
 
5374
    """Given integers xc, xe, yc and ye representing Decimals x = xc*10**xe and
 
5375
    y = yc*10**ye, compute x**y.  Returns a pair of integers (c, e) such that:
 
5376
 
 
5377
      10**(p-1) <= c <= 10**p, and
 
5378
      (c-1)*10**e < x**y < (c+1)*10**e
 
5379
 
 
5380
    in other words, c*10**e is an approximation to x**y with p digits
 
5381
    of precision, and with an error in c of at most 1.  (This is
 
5382
    almost, but not quite, the same as the error being < 1ulp: when c
 
5383
    == 10**(p-1) we can only guarantee error < 10ulp.)
 
5384
 
 
5385
    We assume that: x is positive and not equal to 1, and y is nonzero.
 
5386
    """
 
5387
 
 
5388
    # Find b such that 10**(b-1) <= |y| <= 10**b
 
5389
    b = len(str(abs(yc))) + ye
 
5390
 
 
5391
    # log(x) = lxc*10**(-p-b-1), to p+b+1 places after the decimal point
 
5392
    lxc = _dlog(xc, xe, p+b+1)
 
5393
 
 
5394
    # compute product y*log(x) = yc*lxc*10**(-p-b-1+ye) = pc*10**(-p-1)
 
5395
    shift = ye-b
 
5396
    if shift >= 0:
 
5397
        pc = lxc*yc*10**shift
 
5398
    else:
 
5399
        pc = _div_nearest(lxc*yc, 10**-shift)
 
5400
 
 
5401
    if pc == 0:
 
5402
        # we prefer a result that isn't exactly 1; this makes it
 
5403
        # easier to compute a correctly rounded result in __pow__
 
5404
        if ((len(str(xc)) + xe >= 1) == (yc > 0)): # if x**y > 1:
 
5405
            coeff, exp = 10**(p-1)+1, 1-p
 
5406
        else:
 
5407
            coeff, exp = 10**p-1, -p
 
5408
    else:
 
5409
        coeff, exp = _dexp(pc, -(p+1), p+1)
 
5410
        coeff = _div_nearest(coeff, 10)
 
5411
        exp += 1
 
5412
 
 
5413
    return coeff, exp
 
5414
 
 
5415
def _log10_lb(c, correction = {
 
5416
        '1': 100, '2': 70, '3': 53, '4': 40, '5': 31,
 
5417
        '6': 23, '7': 16, '8': 10, '9': 5}):
 
5418
    """Compute a lower bound for 100*log10(c) for a positive integer c."""
 
5419
    if c <= 0:
 
5420
        raise ValueError("The argument to _log10_lb should be nonnegative.")
 
5421
    str_c = str(c)
 
5422
    return 100*len(str_c) - correction[str_c[0]]
 
5423
 
 
5424
##### Helper Functions ####################################################
 
5425
 
 
5426
def _convert_other(other, raiseit=False):
 
5427
    """Convert other to Decimal.
 
5428
 
 
5429
    Verifies that it's ok to use in an implicit construction.
 
5430
    """
 
5431
    if isinstance(other, Decimal):
 
5432
        return other
 
5433
    if isinstance(other, int):
 
5434
        return Decimal(other)
 
5435
    if raiseit:
 
5436
        raise TypeError("Unable to convert %s to Decimal" % other)
 
5437
    return NotImplemented
 
5438
 
 
5439
##### Setup Specific Contexts ############################################
 
5440
 
 
5441
# The default context prototype used by Context()
 
5442
# Is mutable, so that new contexts can have different default values
 
5443
 
 
5444
DefaultContext = Context(
 
5445
        prec=28, rounding=ROUND_HALF_EVEN,
 
5446
        traps=[DivisionByZero, Overflow, InvalidOperation],
 
5447
        flags=[],
 
5448
        Emax=999999999,
 
5449
        Emin=-999999999,
 
5450
        capitals=1
 
5451
)
 
5452
 
 
5453
# Pre-made alternate contexts offered by the specification
 
5454
# Don't change these; the user should be able to select these
 
5455
# contexts and be able to reproduce results from other implementations
 
5456
# of the spec.
 
5457
 
 
5458
BasicContext = Context(
 
5459
        prec=9, rounding=ROUND_HALF_UP,
 
5460
        traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
 
5461
        flags=[],
 
5462
)
 
5463
 
 
5464
ExtendedContext = Context(
 
5465
        prec=9, rounding=ROUND_HALF_EVEN,
 
5466
        traps=[],
 
5467
        flags=[],
 
5468
)
 
5469
 
 
5470
 
 
5471
##### crud for parsing strings #############################################
 
5472
#
 
5473
# Regular expression used for parsing numeric strings.  Additional
 
5474
# comments:
 
5475
#
 
5476
# 1. Uncomment the two '\s*' lines to allow leading and/or trailing
 
5477
# whitespace.  But note that the specification disallows whitespace in
 
5478
# a numeric string.
 
5479
#
 
5480
# 2. For finite numbers (not infinities and NaNs) the body of the
 
5481
# number between the optional sign and the optional exponent must have
 
5482
# at least one decimal digit, possibly after the decimal point.  The
 
5483
# lookahead expression '(?=[0-9]|\.[0-9])' checks this.
 
5484
#
 
5485
# As the flag UNICODE is not enabled here, we're explicitly avoiding any
 
5486
# other meaning for \d than the numbers [0-9].
 
5487
 
 
5488
import re
 
5489
_parser = re.compile(r"""        # A numeric string consists of:
 
5490
#    \s*
 
5491
    (?P<sign>[-+])?              # an optional sign, followed by either...
 
5492
    (
 
5493
        (?=[0-9]|\.[0-9])        # ...a number (with at least one digit)
 
5494
        (?P<int>[0-9]*)          # having a (possibly empty) integer part
 
5495
        (\.(?P<frac>[0-9]*))?    # followed by an optional fractional part
 
5496
        (E(?P<exp>[-+]?[0-9]+))? # followed by an optional exponent, or...
 
5497
    |
 
5498
        Inf(inity)?              # ...an infinity, or...
 
5499
    |
 
5500
        (?P<signal>s)?           # ...an (optionally signaling)
 
5501
        NaN                      # NaN
 
5502
        (?P<diag>[0-9]*)         # with (possibly empty) diagnostic info.
 
5503
    )
 
5504
#    \s*
 
5505
    \Z
 
5506
""", re.VERBOSE | re.IGNORECASE).match
 
5507
 
 
5508
_all_zeros = re.compile('0*$').match
 
5509
_exact_half = re.compile('50*$').match
 
5510
 
 
5511
##### PEP3101 support functions ##############################################
 
5512
# The functions in this section have little to do with the Decimal
 
5513
# class, and could potentially be reused or adapted for other pure
 
5514
# Python numeric classes that want to implement __format__
 
5515
#
 
5516
# A format specifier for Decimal looks like:
 
5517
#
 
5518
#   [[fill]align][sign][0][minimumwidth][,][.precision][type]
 
5519
 
 
5520
_parse_format_specifier_regex = re.compile(r"""\A
 
5521
(?:
 
5522
   (?P<fill>.)?
 
5523
   (?P<align>[<>=^])
 
5524
)?
 
5525
(?P<sign>[-+ ])?
 
5526
(?P<zeropad>0)?
 
5527
(?P<minimumwidth>(?!0)\d+)?
 
5528
(?P<thousands_sep>,)?
 
5529
(?:\.(?P<precision>0|(?!0)\d+))?
 
5530
(?P<type>[eEfFgGn%])?
 
5531
\Z
 
5532
""", re.VERBOSE)
 
5533
 
 
5534
del re
 
5535
 
 
5536
# The locale module is only needed for the 'n' format specifier.  The
 
5537
# rest of the PEP 3101 code functions quite happily without it, so we
 
5538
# don't care too much if locale isn't present.
 
5539
try:
 
5540
    import locale as _locale
 
5541
except ImportError:
 
5542
    pass
 
5543
 
 
5544
def _parse_format_specifier(format_spec, _localeconv=None):
 
5545
    """Parse and validate a format specifier.
 
5546
 
 
5547
    Turns a standard numeric format specifier into a dict, with the
 
5548
    following entries:
 
5549
 
 
5550
      fill: fill character to pad field to minimum width
 
5551
      align: alignment type, either '<', '>', '=' or '^'
 
5552
      sign: either '+', '-' or ' '
 
5553
      minimumwidth: nonnegative integer giving minimum width
 
5554
      zeropad: boolean, indicating whether to pad with zeros
 
5555
      thousands_sep: string to use as thousands separator, or ''
 
5556
      grouping: grouping for thousands separators, in format
 
5557
        used by localeconv
 
5558
      decimal_point: string to use for decimal point
 
5559
      precision: nonnegative integer giving precision, or None
 
5560
      type: one of the characters 'eEfFgG%', or None
 
5561
 
 
5562
    """
 
5563
    m = _parse_format_specifier_regex.match(format_spec)
 
5564
    if m is None:
 
5565
        raise ValueError("Invalid format specifier: " + format_spec)
 
5566
 
 
5567
    # get the dictionary
 
5568
    format_dict = m.groupdict()
 
5569
 
 
5570
    # zeropad; defaults for fill and alignment.  If zero padding
 
5571
    # is requested, the fill and align fields should be absent.
 
5572
    fill = format_dict['fill']
 
5573
    align = format_dict['align']
 
5574
    format_dict['zeropad'] = (format_dict['zeropad'] is not None)
 
5575
    if format_dict['zeropad']:
 
5576
        if fill is not None:
 
5577
            raise ValueError("Fill character conflicts with '0'"
 
5578
                             " in format specifier: " + format_spec)
 
5579
        if align is not None:
 
5580
            raise ValueError("Alignment conflicts with '0' in "
 
5581
                             "format specifier: " + format_spec)
 
5582
    format_dict['fill'] = fill or ' '
 
5583
    format_dict['align'] = align or '<'
 
5584
 
 
5585
    # default sign handling: '-' for negative, '' for positive
 
5586
    if format_dict['sign'] is None:
 
5587
        format_dict['sign'] = '-'
 
5588
 
 
5589
    # minimumwidth defaults to 0; precision remains None if not given
 
5590
    format_dict['minimumwidth'] = int(format_dict['minimumwidth'] or '0')
 
5591
    if format_dict['precision'] is not None:
 
5592
        format_dict['precision'] = int(format_dict['precision'])
 
5593
 
 
5594
    # if format type is 'g' or 'G' then a precision of 0 makes little
 
5595
    # sense; convert it to 1.  Same if format type is unspecified.
 
5596
    if format_dict['precision'] == 0:
 
5597
        if format_dict['type'] in 'gG' or format_dict['type'] is None:
 
5598
            format_dict['precision'] = 1
 
5599
 
 
5600
    # determine thousands separator, grouping, and decimal separator, and
 
5601
    # add appropriate entries to format_dict
 
5602
    if format_dict['type'] == 'n':
 
5603
        # apart from separators, 'n' behaves just like 'g'
 
5604
        format_dict['type'] = 'g'
 
5605
        if _localeconv is None:
 
5606
            _localeconv = _locale.localeconv()
 
5607
        if format_dict['thousands_sep'] is not None:
 
5608
            raise ValueError("Explicit thousands separator conflicts with "
 
5609
                             "'n' type in format specifier: " + format_spec)
 
5610
        format_dict['thousands_sep'] = _localeconv['thousands_sep']
 
5611
        format_dict['grouping'] = _localeconv['grouping']
 
5612
        format_dict['decimal_point'] = _localeconv['decimal_point']
 
5613
    else:
 
5614
        if format_dict['thousands_sep'] is None:
 
5615
            format_dict['thousands_sep'] = ''
 
5616
        format_dict['grouping'] = [3, 0]
 
5617
        format_dict['decimal_point'] = '.'
 
5618
 
 
5619
    return format_dict
 
5620
 
 
5621
def _format_align(sign, body, spec):
 
5622
    """Given an unpadded, non-aligned numeric string 'body' and sign
 
5623
    string 'sign', add padding and aligment conforming to the given
 
5624
    format specifier dictionary 'spec' (as produced by
 
5625
    parse_format_specifier).
 
5626
 
 
5627
    """
 
5628
    # how much extra space do we have to play with?
 
5629
    minimumwidth = spec['minimumwidth']
 
5630
    fill = spec['fill']
 
5631
    padding = fill*(minimumwidth - len(sign) - len(body))
 
5632
 
 
5633
    align = spec['align']
 
5634
    if align == '<':
 
5635
        result = sign + body + padding
 
5636
    elif align == '>':
 
5637
        result = padding + sign + body
 
5638
    elif align == '=':
 
5639
        result = sign + padding + body
 
5640
    elif align == '^':
 
5641
        half = len(padding)//2
 
5642
        result = padding[:half] + sign + body + padding[half:]
 
5643
    else:
 
5644
        raise ValueError('Unrecognised alignment field')
 
5645
 
 
5646
    return result
 
5647
 
 
5648
def _group_lengths(grouping):
 
5649
    """Convert a localeconv-style grouping into a (possibly infinite)
 
5650
    iterable of integers representing group lengths.
 
5651
 
 
5652
    """
 
5653
    # The result from localeconv()['grouping'], and the input to this
 
5654
    # function, should be a list of integers in one of the
 
5655
    # following three forms:
 
5656
    #
 
5657
    #   (1) an empty list, or
 
5658
    #   (2) nonempty list of positive integers + [0]
 
5659
    #   (3) list of positive integers + [locale.CHAR_MAX], or
 
5660
 
 
5661
    from itertools import chain, repeat
 
5662
    if not grouping:
 
5663
        return []
 
5664
    elif grouping[-1] == 0 and len(grouping) >= 2:
 
5665
        return chain(grouping[:-1], repeat(grouping[-2]))
 
5666
    elif grouping[-1] == _locale.CHAR_MAX:
 
5667
        return grouping[:-1]
 
5668
    else:
 
5669
        raise ValueError('unrecognised format for grouping')
 
5670
 
 
5671
def _insert_thousands_sep(digits, spec, min_width=1):
 
5672
    """Insert thousands separators into a digit string.
 
5673
 
 
5674
    spec is a dictionary whose keys should include 'thousands_sep' and
 
5675
    'grouping'; typically it's the result of parsing the format
 
5676
    specifier using _parse_format_specifier.
 
5677
 
 
5678
    The min_width keyword argument gives the minimum length of the
 
5679
    result, which will be padded on the left with zeros if necessary.
 
5680
 
 
5681
    If necessary, the zero padding adds an extra '0' on the left to
 
5682
    avoid a leading thousands separator.  For example, inserting
 
5683
    commas every three digits in '123456', with min_width=8, gives
 
5684
    '0,123,456', even though that has length 9.
 
5685
 
 
5686
    """
 
5687
 
 
5688
    sep = spec['thousands_sep']
 
5689
    grouping = spec['grouping']
 
5690
 
 
5691
    groups = []
 
5692
    for l in _group_lengths(grouping):
 
5693
        if l <= 0:
 
5694
            raise ValueError("group length should be positive")
 
5695
        # max(..., 1) forces at least 1 digit to the left of a separator
 
5696
        l = min(max(len(digits), min_width, 1), l)
 
5697
        groups.append('0'*(l - len(digits)) + digits[-l:])
 
5698
        digits = digits[:-l]
 
5699
        min_width -= l
 
5700
        if not digits and min_width <= 0:
 
5701
            break
 
5702
        min_width -= len(sep)
 
5703
    else:
 
5704
        l = max(len(digits), min_width, 1)
 
5705
        groups.append('0'*(l - len(digits)) + digits[-l:])
 
5706
    return sep.join(reversed(groups))
 
5707
 
 
5708
def _format_sign(is_negative, spec):
 
5709
    """Determine sign character."""
 
5710
 
 
5711
    if is_negative:
 
5712
        return '-'
 
5713
    elif spec['sign'] in ' +':
 
5714
        return spec['sign']
 
5715
    else:
 
5716
        return ''
 
5717
 
 
5718
def _format_number(is_negative, intpart, fracpart, exp, spec):
 
5719
    """Format a number, given the following data:
 
5720
 
 
5721
    is_negative: true if the number is negative, else false
 
5722
    intpart: string of digits that must appear before the decimal point
 
5723
    fracpart: string of digits that must come after the point
 
5724
    exp: exponent, as an integer
 
5725
    spec: dictionary resulting from parsing the format specifier
 
5726
 
 
5727
    This function uses the information in spec to:
 
5728
      insert separators (decimal separator and thousands separators)
 
5729
      format the sign
 
5730
      format the exponent
 
5731
      add trailing '%' for the '%' type
 
5732
      zero-pad if necessary
 
5733
      fill and align if necessary
 
5734
    """
 
5735
 
 
5736
    sign = _format_sign(is_negative, spec)
 
5737
 
 
5738
    if fracpart:
 
5739
        fracpart = spec['decimal_point'] + fracpart
 
5740
 
 
5741
    if exp != 0 or spec['type'] in 'eE':
 
5742
        echar = {'E': 'E', 'e': 'e', 'G': 'E', 'g': 'e'}[spec['type']]
 
5743
        fracpart += "{0}{1:+}".format(echar, exp)
 
5744
    if spec['type'] == '%':
 
5745
        fracpart += '%'
 
5746
 
 
5747
    if spec['zeropad']:
 
5748
        min_width = spec['minimumwidth'] - len(fracpart) - len(sign)
 
5749
    else:
 
5750
        min_width = 0
 
5751
    intpart = _insert_thousands_sep(intpart, spec, min_width)
 
5752
 
 
5753
    return _format_align(sign, intpart+fracpart, spec)
 
5754
 
 
5755
 
 
5756
##### Useful Constants (internal use only) ################################
 
5757
 
 
5758
# Reusable defaults
 
5759
_Infinity = Decimal('Inf')
 
5760
_NegativeInfinity = Decimal('-Inf')
 
5761
_NaN = Decimal('NaN')
 
5762
_Zero = Decimal(0)
 
5763
_One = Decimal(1)
 
5764
_NegativeOne = Decimal(-1)
 
5765
 
 
5766
# _SignedInfinity[sign] is infinity w/ that sign
 
5767
_SignedInfinity = (_Infinity, _NegativeInfinity)
 
5768
 
 
5769
 
 
5770
 
 
5771
if __name__ == '__main__':
 
5772
    import doctest, sys
 
5773
    doctest.testmod(sys.modules[__name__])