~ubuntu-branches/ubuntu/quantal/python-django/quantal

« back to all changes in this revision

Viewing changes to django/utils/_decimal.py

  • Committer: Bazaar Package Importer
  • Author(s): Scott James Remnant, Eddy Mulyono
  • Date: 2008-09-16 12:18:47 UTC
  • mfrom: (1.1.5 upstream) (4.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080916121847-mg225rg5mnsdqzr0
Tags: 1.0-1ubuntu1
* Merge from Debian (LP: #264191), remaining changes:
  - Run test suite on build.

[Eddy Mulyono]
* Update patch to workaround network test case failures.

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 is currently Py2.3 compatible and should be kept that way
 
11
# unless a major compelling advantage arises.  IOW, 2.3 compatibility is
 
12
# strongly preferred, but not guaranteed.
 
13
 
 
14
# Also, this module should be kept in sync with the latest updates of
 
15
# the IBM specification as it evolves.  Those updates will be treated
 
16
# as bug fixes (deviation from the spec is a compatibility, usability
 
17
# bug) and will be backported.  At this point the spec is stabilizing
 
18
# and the updates are becoming fewer, smaller, and less significant.
 
19
 
 
20
"""
 
21
This is a Py2.3 implementation of decimal floating point arithmetic based on
 
22
the General Decimal Arithmetic Specification:
 
23
 
 
24
    www2.hursley.ibm.com/decimal/decarith.html
 
25
 
 
26
and IEEE standard 854-1987:
 
27
 
 
28
    www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
 
29
 
 
30
Decimal floating point has finite precision with arbitrarily large bounds.
 
31
 
 
32
The purpose of the module is to support arithmetic using familiar
 
33
"schoolhouse" rules and to avoid the some of tricky representation
 
34
issues associated with binary floating point.  The package is especially
 
35
useful for financial applications or for contexts where users have
 
36
expectations that are at odds with binary floating point (for instance,
 
37
in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
 
38
of the expected Decimal("0.00") returned by decimal floating point).
 
39
 
 
40
Here are some examples of using the decimal module:
 
41
 
 
42
>>> from decimal import *
 
43
>>> setcontext(ExtendedContext)
 
44
>>> Decimal(0)
 
45
Decimal("0")
 
46
>>> Decimal("1")
 
47
Decimal("1")
 
48
>>> Decimal("-.0123")
 
49
Decimal("-0.0123")
 
50
>>> Decimal(123456)
 
51
Decimal("123456")
 
52
>>> Decimal("123.45e12345678901234567890")
 
53
Decimal("1.2345E+12345678901234567892")
 
54
>>> Decimal("1.33") + Decimal("1.27")
 
55
Decimal("2.60")
 
56
>>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41")
 
57
Decimal("-2.20")
 
58
>>> dig = Decimal(1)
 
59
>>> print dig / Decimal(3)
 
60
0.333333333
 
61
>>> getcontext().prec = 18
 
62
>>> print dig / Decimal(3)
 
63
0.333333333333333333
 
64
>>> print dig.sqrt()
 
65
1
 
66
>>> print Decimal(3).sqrt()
 
67
1.73205080756887729
 
68
>>> print Decimal(3) ** 123
 
69
4.85192780976896427E+58
 
70
>>> inf = Decimal(1) / Decimal(0)
 
71
>>> print inf
 
72
Infinity
 
73
>>> neginf = Decimal(-1) / Decimal(0)
 
74
>>> print neginf
 
75
-Infinity
 
76
>>> print neginf + inf
 
77
NaN
 
78
>>> print neginf * inf
 
79
-Infinity
 
80
>>> print dig / 0
 
81
Infinity
 
82
>>> getcontext().traps[DivisionByZero] = 1
 
83
>>> print dig / 0
 
84
Traceback (most recent call last):
 
85
  ...
 
86
  ...
 
87
  ...
 
88
DivisionByZero: x / 0
 
89
>>> c = Context()
 
90
>>> c.traps[InvalidOperation] = 0
 
91
>>> print c.flags[InvalidOperation]
 
92
0
 
93
>>> c.divide(Decimal(0), Decimal(0))
 
94
Decimal("NaN")
 
95
>>> c.traps[InvalidOperation] = 1
 
96
>>> print c.flags[InvalidOperation]
 
97
1
 
98
>>> c.flags[InvalidOperation] = 0
 
99
>>> print c.flags[InvalidOperation]
 
100
0
 
101
>>> print c.divide(Decimal(0), Decimal(0))
 
102
Traceback (most recent call last):
 
103
  ...
 
104
  ...
 
105
  ...
 
106
InvalidOperation: 0 / 0
 
107
>>> print c.flags[InvalidOperation]
 
108
1
 
109
>>> c.flags[InvalidOperation] = 0
 
110
>>> c.traps[InvalidOperation] = 0
 
111
>>> print c.divide(Decimal(0), Decimal(0))
 
112
NaN
 
113
>>> print c.flags[InvalidOperation]
 
114
1
 
115
>>>
 
116
"""
 
117
 
 
118
__all__ = [
 
119
    # Two major classes
 
120
    'Decimal', 'Context',
 
121
 
 
122
    # Contexts
 
123
    'DefaultContext', 'BasicContext', 'ExtendedContext',
 
124
 
 
125
    # Exceptions
 
126
    'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
 
127
    'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
 
128
 
 
129
    # Constants for use in setting up contexts
 
130
    'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
 
131
    'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN',
 
132
 
 
133
    # Functions for manipulating contexts
 
134
    'setcontext', 'getcontext'
 
135
]
 
136
 
 
137
import copy as _copy
 
138
 
 
139
#Rounding
 
140
ROUND_DOWN = 'ROUND_DOWN'
 
141
ROUND_HALF_UP = 'ROUND_HALF_UP'
 
142
ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
 
143
ROUND_CEILING = 'ROUND_CEILING'
 
144
ROUND_FLOOR = 'ROUND_FLOOR'
 
145
ROUND_UP = 'ROUND_UP'
 
146
ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
 
147
 
 
148
#Rounding decision (not part of the public API)
 
149
NEVER_ROUND = 'NEVER_ROUND'    # Round in division (non-divmod), sqrt ONLY
 
150
ALWAYS_ROUND = 'ALWAYS_ROUND'  # Every operation rounds at end.
 
151
 
 
152
#Errors
 
153
 
 
154
class DecimalException(ArithmeticError):
 
155
    """Base exception class.
 
156
 
 
157
    Used exceptions derive from this.
 
158
    If an exception derives from another exception besides this (such as
 
159
    Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
 
160
    called if the others are present.  This isn't actually used for
 
161
    anything, though.
 
162
 
 
163
    handle  -- Called when context._raise_error is called and the
 
164
               trap_enabler is set.  First argument is self, second is the
 
165
               context.  More arguments can be given, those being after
 
166
               the explanation in _raise_error (For example,
 
167
               context._raise_error(NewError, '(-x)!', self._sign) would
 
168
               call NewError().handle(context, self._sign).)
 
169
 
 
170
    To define a new exception, it should be sufficient to have it derive
 
171
    from DecimalException.
 
172
    """
 
173
    def handle(self, context, *args):
 
174
        pass
 
175
 
 
176
 
 
177
class Clamped(DecimalException):
 
178
    """Exponent of a 0 changed to fit bounds.
 
179
 
 
180
    This occurs and signals clamped if the exponent of a result has been
 
181
    altered in order to fit the constraints of a specific concrete
 
182
    representation. This may occur when the exponent of a zero result would
 
183
    be outside the bounds of a representation, or  when a large normal
 
184
    number would have an encoded exponent that cannot be represented. In
 
185
    this latter case, the exponent is reduced to fit and the corresponding
 
186
    number of zero digits are appended to the coefficient ("fold-down").
 
187
    """
 
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
    def handle(self, context, *args):
 
209
        if args:
 
210
            if args[0] == 1: #sNaN, must drop 's' but keep diagnostics
 
211
                return Decimal( (args[1]._sign, args[1]._int, 'n') )
 
212
        return NaN
 
213
 
 
214
class ConversionSyntax(InvalidOperation):
 
215
    """Trying to convert badly formed string.
 
216
 
 
217
    This occurs and signals invalid-operation if an string is being
 
218
    converted to a number and it does not conform to the numeric string
 
219
    syntax. The result is [0,qNaN].
 
220
    """
 
221
 
 
222
    def handle(self, context, *args):
 
223
        return (0, (0,), 'n') #Passed to something which uses a tuple.
 
224
 
 
225
class DivisionByZero(DecimalException, ZeroDivisionError):
 
226
    """Division by 0.
 
227
 
 
228
    This occurs and signals division-by-zero if division of a finite number
 
229
    by zero was attempted (during a divide-integer or divide operation, or a
 
230
    power operation with negative right-hand operand), and the dividend was
 
231
    not zero.
 
232
 
 
233
    The result of the operation is [sign,inf], where sign is the exclusive
 
234
    or of the signs of the operands for divide, or is 1 for an odd power of
 
235
    -0, for power.
 
236
    """
 
237
 
 
238
    def handle(self, context, sign, double = None, *args):
 
239
        if double is not None:
 
240
            return (Infsign[sign],)*2
 
241
        return Infsign[sign]
 
242
 
 
243
class DivisionImpossible(InvalidOperation):
 
244
    """Cannot perform the division adequately.
 
245
 
 
246
    This occurs and signals invalid-operation if the integer result of a
 
247
    divide-integer or remainder operation had too many digits (would be
 
248
    longer than precision). The result is [0,qNaN].
 
249
    """
 
250
 
 
251
    def handle(self, context, *args):
 
252
        return (NaN, NaN)
 
253
 
 
254
class DivisionUndefined(InvalidOperation, ZeroDivisionError):
 
255
    """Undefined result of division.
 
256
 
 
257
    This occurs and signals invalid-operation if division by zero was
 
258
    attempted (during a divide-integer, divide, or remainder operation), and
 
259
    the dividend is also zero. The result is [0,qNaN].
 
260
    """
 
261
 
 
262
    def handle(self, context, tup=None, *args):
 
263
        if tup is not None:
 
264
            return (NaN, NaN) #for 0 %0, 0 // 0
 
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
    pass
 
279
 
 
280
class InvalidContext(InvalidOperation):
 
281
    """Invalid context.  Unknown rounding, for example.
 
282
 
 
283
    This occurs and signals invalid-operation if an invalid context was
 
284
    detected during an operation. This can occur if contexts are not checked
 
285
    on creation and either the precision exceeds the capability of the
 
286
    underlying concrete representation or an unknown or unsupported rounding
 
287
    was specified. These aspects of the context need only be checked when
 
288
    the values are required to be used. The result is [0,qNaN].
 
289
    """
 
290
 
 
291
    def handle(self, context, *args):
 
292
        return NaN
 
293
 
 
294
class Rounded(DecimalException):
 
295
    """Number got rounded (not  necessarily changed during rounding).
 
296
 
 
297
    This occurs and signals rounded whenever the result of an operation is
 
298
    rounded (that is, some zero or non-zero digits were discarded from the
 
299
    coefficient), or if an overflow or underflow condition occurs. The
 
300
    result in all cases is unchanged.
 
301
 
 
302
    The rounded signal may be tested (or trapped) to determine if a given
 
303
    operation (or sequence of operations) caused a loss of precision.
 
304
    """
 
305
    pass
 
306
 
 
307
class Subnormal(DecimalException):
 
308
    """Exponent < Emin before rounding.
 
309
 
 
310
    This occurs and signals subnormal whenever the result of a conversion or
 
311
    operation is subnormal (that is, its adjusted exponent is less than
 
312
    Emin, before any rounding). The result in all cases is unchanged.
 
313
 
 
314
    The subnormal signal may be tested (or trapped) to determine if a given
 
315
    or operation (or sequence of operations) yielded a subnormal result.
 
316
    """
 
317
    pass
 
318
 
 
319
class Overflow(Inexact, Rounded):
 
320
    """Numerical overflow.
 
321
 
 
322
    This occurs and signals overflow if the adjusted exponent of a result
 
323
    (from a conversion or from an operation that is not an attempt to divide
 
324
    by zero), after rounding, would be greater than the largest value that
 
325
    can be handled by the implementation (the value Emax).
 
326
 
 
327
    The result depends on the rounding mode:
 
328
 
 
329
    For round-half-up and round-half-even (and for round-half-down and
 
330
    round-up, if implemented), the result of the operation is [sign,inf],
 
331
    where sign is the sign of the intermediate result. For round-down, the
 
332
    result is the largest finite number that can be represented in the
 
333
    current precision, with the sign of the intermediate result. For
 
334
    round-ceiling, the result is the same as for round-down if the sign of
 
335
    the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
 
336
    the result is the same as for round-down if the sign of the intermediate
 
337
    result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
 
338
    will also be raised.
 
339
   """
 
340
 
 
341
    def handle(self, context, sign, *args):
 
342
        if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
 
343
                                     ROUND_HALF_DOWN, ROUND_UP):
 
344
            return Infsign[sign]
 
345
        if sign == 0:
 
346
            if context.rounding == ROUND_CEILING:
 
347
                return Infsign[sign]
 
348
            return Decimal((sign, (9,)*context.prec,
 
349
                            context.Emax-context.prec+1))
 
350
        if sign == 1:
 
351
            if context.rounding == ROUND_FLOOR:
 
352
                return Infsign[sign]
 
353
            return Decimal( (sign, (9,)*context.prec,
 
354
                             context.Emax-context.prec+1))
 
355
 
 
356
 
 
357
class Underflow(Inexact, Rounded, Subnormal):
 
358
    """Numerical underflow with result rounded to 0.
 
359
 
 
360
    This occurs and signals underflow if a result is inexact and the
 
361
    adjusted exponent of the result would be smaller (more negative) than
 
362
    the smallest value that can be handled by the implementation (the value
 
363
    Emin). That is, the result is both inexact and subnormal.
 
364
 
 
365
    The result after an underflow will be a subnormal number rounded, if
 
366
    necessary, so that its exponent is not less than Etiny. This may result
 
367
    in 0 with the sign of the intermediate result and an exponent of Etiny.
 
368
 
 
369
    In all cases, Inexact, Rounded, and Subnormal will also be raised.
 
370
    """
 
371
 
 
372
# List of public traps and flags
 
373
_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
 
374
           Underflow, InvalidOperation, Subnormal]
 
375
 
 
376
# Map conditions (per the spec) to signals
 
377
_condition_map = {ConversionSyntax:InvalidOperation,
 
378
                  DivisionImpossible:InvalidOperation,
 
379
                  DivisionUndefined:InvalidOperation,
 
380
                  InvalidContext:InvalidOperation}
 
381
 
 
382
##### Context Functions #######################################
 
383
 
 
384
# The getcontext() and setcontext() function manage access to a thread-local
 
385
# current context.  Py2.4 offers direct support for thread locals.  If that
 
386
# is not available, use threading.currentThread() which is slower but will
 
387
# work for older Pythons.  If threads are not part of the build, create a
 
388
# mock threading object with threading.local() returning the module namespace.
 
389
 
 
390
try:
 
391
    import threading
 
392
except ImportError:
 
393
    # Python was compiled without threads; create a mock object instead
 
394
    import sys
 
395
    class MockThreading:
 
396
        def local(self, sys=sys):
 
397
            return sys.modules[__name__]
 
398
    threading = MockThreading()
 
399
    del sys, MockThreading
 
400
 
 
401
try:
 
402
    threading.local
 
403
 
 
404
except AttributeError:
 
405
 
 
406
    #To fix reloading, force it to create a new context
 
407
    #Old contexts have different exceptions in their dicts, making problems.
 
408
    if hasattr(threading.currentThread(), '__decimal_context__'):
 
409
        del threading.currentThread().__decimal_context__
 
410
 
 
411
    def setcontext(context):
 
412
        """Set this thread's context to context."""
 
413
        if context in (DefaultContext, BasicContext, ExtendedContext):
 
414
            context = context.copy()
 
415
            context.clear_flags()
 
416
        threading.currentThread().__decimal_context__ = context
 
417
 
 
418
    def getcontext():
 
419
        """Returns this thread's context.
 
420
 
 
421
        If this thread does not yet have a context, returns
 
422
        a new context and sets this thread's context.
 
423
        New contexts are copies of DefaultContext.
 
424
        """
 
425
        try:
 
426
            return threading.currentThread().__decimal_context__
 
427
        except AttributeError:
 
428
            context = Context()
 
429
            threading.currentThread().__decimal_context__ = context
 
430
            return context
 
431
 
 
432
else:
 
433
 
 
434
    local = threading.local()
 
435
    if hasattr(local, '__decimal_context__'):
 
436
        del local.__decimal_context__
 
437
 
 
438
    def getcontext(_local=local):
 
439
        """Returns this thread's context.
 
440
 
 
441
        If this thread does not yet have a context, returns
 
442
        a new context and sets this thread's context.
 
443
        New contexts are copies of DefaultContext.
 
444
        """
 
445
        try:
 
446
            return _local.__decimal_context__
 
447
        except AttributeError:
 
448
            context = Context()
 
449
            _local.__decimal_context__ = context
 
450
            return context
 
451
 
 
452
    def setcontext(context, _local=local):
 
453
        """Set this thread's context to context."""
 
454
        if context in (DefaultContext, BasicContext, ExtendedContext):
 
455
            context = context.copy()
 
456
            context.clear_flags()
 
457
        _local.__decimal_context__ = context
 
458
 
 
459
    del threading, local        # Don't contaminate the namespace
 
460
 
 
461
 
 
462
##### Decimal class ###########################################
 
463
 
 
464
class Decimal(object):
 
465
    """Floating point class for decimal arithmetic."""
 
466
 
 
467
    __slots__ = ('_exp','_int','_sign', '_is_special')
 
468
    # Generally, the value of the Decimal instance is given by
 
469
    #  (-1)**_sign * _int * 10**_exp
 
470
    # Special values are signified by _is_special == True
 
471
 
 
472
    # We're immutable, so use __new__ not __init__
 
473
    def __new__(cls, value="0", context=None):
 
474
        """Create a decimal point instance.
 
475
 
 
476
        >>> Decimal('3.14')              # string input
 
477
        Decimal("3.14")
 
478
        >>> Decimal((0, (3, 1, 4), -2))  # tuple input (sign, digit_tuple, exponent)
 
479
        Decimal("3.14")
 
480
        >>> Decimal(314)                 # int or long
 
481
        Decimal("314")
 
482
        >>> Decimal(Decimal(314))        # another decimal instance
 
483
        Decimal("314")
 
484
        """
 
485
 
 
486
        self = object.__new__(cls)
 
487
        self._is_special = False
 
488
 
 
489
        # From an internal working value
 
490
        if isinstance(value, _WorkRep):
 
491
            self._sign = value.sign
 
492
            self._int = tuple(map(int, str(value.int)))
 
493
            self._exp = int(value.exp)
 
494
            return self
 
495
 
 
496
        # From another decimal
 
497
        if isinstance(value, Decimal):
 
498
            self._exp  = value._exp
 
499
            self._sign = value._sign
 
500
            self._int  = value._int
 
501
            self._is_special  = value._is_special
 
502
            return self
 
503
 
 
504
        # From an integer
 
505
        if isinstance(value, (int,long)):
 
506
            if value >= 0:
 
507
                self._sign = 0
 
508
            else:
 
509
                self._sign = 1
 
510
            self._exp = 0
 
511
            self._int = tuple(map(int, str(abs(value))))
 
512
            return self
 
513
 
 
514
        # tuple/list conversion (possibly from as_tuple())
 
515
        if isinstance(value, (list,tuple)):
 
516
            if len(value) != 3:
 
517
                raise ValueError, 'Invalid arguments'
 
518
            if value[0] not in (0,1):
 
519
                raise ValueError, 'Invalid sign'
 
520
            for digit in value[1]:
 
521
                if not isinstance(digit, (int,long)) or digit < 0:
 
522
                    raise ValueError, "The second value in the tuple must be composed of non negative integer elements."
 
523
 
 
524
            self._sign = value[0]
 
525
            self._int  = tuple(value[1])
 
526
            if value[2] in ('F','n','N'):
 
527
                self._exp = value[2]
 
528
                self._is_special = True
 
529
            else:
 
530
                self._exp  = int(value[2])
 
531
            return self
 
532
 
 
533
        if isinstance(value, float):
 
534
            raise TypeError("Cannot convert float to Decimal.  " +
 
535
                            "First convert the float to a string")
 
536
 
 
537
        # Other argument types may require the context during interpretation
 
538
        if context is None:
 
539
            context = getcontext()
 
540
 
 
541
        # From a string
 
542
        # REs insist on real strings, so we can too.
 
543
        if isinstance(value, basestring):
 
544
            if _isinfinity(value):
 
545
                self._exp = 'F'
 
546
                self._int = (0,)
 
547
                self._is_special = True
 
548
                if _isinfinity(value) == 1:
 
549
                    self._sign = 0
 
550
                else:
 
551
                    self._sign = 1
 
552
                return self
 
553
            if _isnan(value):
 
554
                sig, sign, diag = _isnan(value)
 
555
                self._is_special = True
 
556
                if len(diag) > context.prec: #Diagnostic info too long
 
557
                    self._sign, self._int, self._exp = \
 
558
                                context._raise_error(ConversionSyntax)
 
559
                    return self
 
560
                if sig == 1:
 
561
                    self._exp = 'n' #qNaN
 
562
                else: #sig == 2
 
563
                    self._exp = 'N' #sNaN
 
564
                self._sign = sign
 
565
                self._int = tuple(map(int, diag)) #Diagnostic info
 
566
                return self
 
567
            try:
 
568
                self._sign, self._int, self._exp = _string2exact(value)
 
569
            except ValueError:
 
570
                self._is_special = True
 
571
                self._sign, self._int, self._exp = context._raise_error(ConversionSyntax)
 
572
            return self
 
573
 
 
574
        raise TypeError("Cannot convert %r to Decimal" % value)
 
575
 
 
576
    def _isnan(self):
 
577
        """Returns whether the number is not actually one.
 
578
 
 
579
        0 if a number
 
580
        1 if NaN
 
581
        2 if sNaN
 
582
        """
 
583
        if self._is_special:
 
584
            exp = self._exp
 
585
            if exp == 'n':
 
586
                return 1
 
587
            elif exp == 'N':
 
588
                return 2
 
589
        return 0
 
590
 
 
591
    def _isinfinity(self):
 
592
        """Returns whether the number is infinite
 
593
 
 
594
        0 if finite or not a number
 
595
        1 if +INF
 
596
        -1 if -INF
 
597
        """
 
598
        if self._exp == 'F':
 
599
            if self._sign:
 
600
                return -1
 
601
            return 1
 
602
        return 0
 
603
 
 
604
    def _check_nans(self, other = None, context=None):
 
605
        """Returns whether the number is not actually one.
 
606
 
 
607
        if self, other are sNaN, signal
 
608
        if self, other are NaN return nan
 
609
        return 0
 
610
 
 
611
        Done before operations.
 
612
        """
 
613
 
 
614
        self_is_nan = self._isnan()
 
615
        if other is None:
 
616
            other_is_nan = False
 
617
        else:
 
618
            other_is_nan = other._isnan()
 
619
 
 
620
        if self_is_nan or other_is_nan:
 
621
            if context is None:
 
622
                context = getcontext()
 
623
 
 
624
            if self_is_nan == 2:
 
625
                return context._raise_error(InvalidOperation, 'sNaN',
 
626
                                        1, self)
 
627
            if other_is_nan == 2:
 
628
                return context._raise_error(InvalidOperation, 'sNaN',
 
629
                                        1, other)
 
630
            if self_is_nan:
 
631
                return self
 
632
 
 
633
            return other
 
634
        return 0
 
635
 
 
636
    def __nonzero__(self):
 
637
        """Is the number non-zero?
 
638
 
 
639
        0 if self == 0
 
640
        1 if self != 0
 
641
        """
 
642
        if self._is_special:
 
643
            return 1
 
644
        return sum(self._int) != 0
 
645
 
 
646
    def __cmp__(self, other, context=None):
 
647
        other = _convert_other(other)
 
648
        if other is NotImplemented:
 
649
            return other
 
650
 
 
651
        if self._is_special or other._is_special:
 
652
            ans = self._check_nans(other, context)
 
653
            if ans:
 
654
                return 1 # Comparison involving NaN's always reports self > other
 
655
 
 
656
            # INF = INF
 
657
            return cmp(self._isinfinity(), other._isinfinity())
 
658
 
 
659
        if not self and not other:
 
660
            return 0 #If both 0, sign comparison isn't certain.
 
661
 
 
662
        #If different signs, neg one is less
 
663
        if other._sign < self._sign:
 
664
            return -1
 
665
        if self._sign < other._sign:
 
666
            return 1
 
667
 
 
668
        self_adjusted = self.adjusted()
 
669
        other_adjusted = other.adjusted()
 
670
        if self_adjusted == other_adjusted and \
 
671
           self._int + (0,)*(self._exp - other._exp) == \
 
672
           other._int + (0,)*(other._exp - self._exp):
 
673
            return 0 #equal, except in precision. ([0]*(-x) = [])
 
674
        elif self_adjusted > other_adjusted and self._int[0] != 0:
 
675
            return (-1)**self._sign
 
676
        elif self_adjusted < other_adjusted and other._int[0] != 0:
 
677
            return -((-1)**self._sign)
 
678
 
 
679
        # Need to round, so make sure we have a valid context
 
680
        if context is None:
 
681
            context = getcontext()
 
682
 
 
683
        context = context._shallow_copy()
 
684
        rounding = context._set_rounding(ROUND_UP) #round away from 0
 
685
 
 
686
        flags = context._ignore_all_flags()
 
687
        res = self.__sub__(other, context=context)
 
688
 
 
689
        context._regard_flags(*flags)
 
690
 
 
691
        context.rounding = rounding
 
692
 
 
693
        if not res:
 
694
            return 0
 
695
        elif res._sign:
 
696
            return -1
 
697
        return 1
 
698
 
 
699
    def __eq__(self, other):
 
700
        if not isinstance(other, (Decimal, int, long)):
 
701
            return NotImplemented
 
702
        return self.__cmp__(other) == 0
 
703
 
 
704
    def __ne__(self, other):
 
705
        if not isinstance(other, (Decimal, int, long)):
 
706
            return NotImplemented
 
707
        return self.__cmp__(other) != 0
 
708
 
 
709
    def compare(self, other, context=None):
 
710
        """Compares one to another.
 
711
 
 
712
        -1 => a < b
 
713
        0  => a = b
 
714
        1  => a > b
 
715
        NaN => one is NaN
 
716
        Like __cmp__, but returns Decimal instances.
 
717
        """
 
718
        other = _convert_other(other)
 
719
        if other is NotImplemented:
 
720
            return other
 
721
 
 
722
        #compare(NaN, NaN) = NaN
 
723
        if (self._is_special or other and other._is_special):
 
724
            ans = self._check_nans(other, context)
 
725
            if ans:
 
726
                return ans
 
727
 
 
728
        return Decimal(self.__cmp__(other, context))
 
729
 
 
730
    def __hash__(self):
 
731
        """x.__hash__() <==> hash(x)"""
 
732
        # Decimal integers must hash the same as the ints
 
733
        # Non-integer decimals are normalized and hashed as strings
 
734
        # Normalization assures that hast(100E-1) == hash(10)
 
735
        if self._is_special:
 
736
            if self._isnan():
 
737
                raise TypeError('Cannot hash a NaN value.')
 
738
            return hash(str(self))
 
739
        i = int(self)
 
740
        if self == Decimal(i):
 
741
            return hash(i)
 
742
        assert self.__nonzero__()   # '-0' handled by integer case
 
743
        return hash(str(self.normalize()))
 
744
 
 
745
    def as_tuple(self):
 
746
        """Represents the number as a triple tuple.
 
747
 
 
748
        To show the internals exactly as they are.
 
749
        """
 
750
        return (self._sign, self._int, self._exp)
 
751
 
 
752
    def __repr__(self):
 
753
        """Represents the number as an instance of Decimal."""
 
754
        # Invariant:  eval(repr(d)) == d
 
755
        return 'Decimal("%s")' % str(self)
 
756
 
 
757
    def __str__(self, eng = 0, context=None):
 
758
        """Return string representation of the number in scientific notation.
 
759
 
 
760
        Captures all of the information in the underlying representation.
 
761
        """
 
762
 
 
763
        if self._is_special:
 
764
            if self._isnan():
 
765
                minus = '-'*self._sign
 
766
                if self._int == (0,):
 
767
                    info = ''
 
768
                else:
 
769
                    info = ''.join(map(str, self._int))
 
770
                if self._isnan() == 2:
 
771
                    return minus + 'sNaN' + info
 
772
                return minus + 'NaN' + info
 
773
            if self._isinfinity():
 
774
                minus = '-'*self._sign
 
775
                return minus + 'Infinity'
 
776
 
 
777
        if context is None:
 
778
            context = getcontext()
 
779
 
 
780
        tmp = map(str, self._int)
 
781
        numdigits = len(self._int)
 
782
        leftdigits = self._exp + numdigits
 
783
        if eng and not self: #self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY
 
784
            if self._exp < 0 and self._exp >= -6: #short, no need for e/E
 
785
                s = '-'*self._sign + '0.' + '0'*(abs(self._exp))
 
786
                return s
 
787
            #exp is closest mult. of 3 >= self._exp
 
788
            exp = ((self._exp - 1)// 3 + 1) * 3
 
789
            if exp != self._exp:
 
790
                s = '0.'+'0'*(exp - self._exp)
 
791
            else:
 
792
                s = '0'
 
793
            if exp != 0:
 
794
                if context.capitals:
 
795
                    s += 'E'
 
796
                else:
 
797
                    s += 'e'
 
798
                if exp > 0:
 
799
                    s += '+' #0.0e+3, not 0.0e3
 
800
                s += str(exp)
 
801
            s = '-'*self._sign + s
 
802
            return s
 
803
        if eng:
 
804
            dotplace = (leftdigits-1)%3+1
 
805
            adjexp = leftdigits -1 - (leftdigits-1)%3
 
806
        else:
 
807
            adjexp = leftdigits-1
 
808
            dotplace = 1
 
809
        if self._exp == 0:
 
810
            pass
 
811
        elif self._exp < 0 and adjexp >= 0:
 
812
            tmp.insert(leftdigits, '.')
 
813
        elif self._exp < 0 and adjexp >= -6:
 
814
            tmp[0:0] = ['0'] * int(-leftdigits)
 
815
            tmp.insert(0, '0.')
 
816
        else:
 
817
            if numdigits > dotplace:
 
818
                tmp.insert(dotplace, '.')
 
819
            elif numdigits < dotplace:
 
820
                tmp.extend(['0']*(dotplace-numdigits))
 
821
            if adjexp:
 
822
                if not context.capitals:
 
823
                    tmp.append('e')
 
824
                else:
 
825
                    tmp.append('E')
 
826
                    if adjexp > 0:
 
827
                        tmp.append('+')
 
828
                tmp.append(str(adjexp))
 
829
        if eng:
 
830
            while tmp[0:1] == ['0']:
 
831
                tmp[0:1] = []
 
832
            if len(tmp) == 0 or tmp[0] == '.' or tmp[0].lower() == 'e':
 
833
                tmp[0:0] = ['0']
 
834
        if self._sign:
 
835
            tmp.insert(0, '-')
 
836
 
 
837
        return ''.join(tmp)
 
838
 
 
839
    def to_eng_string(self, context=None):
 
840
        """Convert to engineering-type string.
 
841
 
 
842
        Engineering notation has an exponent which is a multiple of 3, so there
 
843
        are up to 3 digits left of the decimal place.
 
844
 
 
845
        Same rules for when in exponential and when as a value as in __str__.
 
846
        """
 
847
        return self.__str__(eng=1, context=context)
 
848
 
 
849
    def __neg__(self, context=None):
 
850
        """Returns a copy with the sign switched.
 
851
 
 
852
        Rounds, if it has reason.
 
853
        """
 
854
        if self._is_special:
 
855
            ans = self._check_nans(context=context)
 
856
            if ans:
 
857
                return ans
 
858
 
 
859
        if not self:
 
860
            # -Decimal('0') is Decimal('0'), not Decimal('-0')
 
861
            sign = 0
 
862
        elif self._sign:
 
863
            sign = 0
 
864
        else:
 
865
            sign = 1
 
866
 
 
867
        if context is None:
 
868
            context = getcontext()
 
869
        if context._rounding_decision == ALWAYS_ROUND:
 
870
            return Decimal((sign, self._int, self._exp))._fix(context)
 
871
        return Decimal( (sign, self._int, self._exp))
 
872
 
 
873
    def __pos__(self, context=None):
 
874
        """Returns a copy, unless it is a sNaN.
 
875
 
 
876
        Rounds the number (if more then precision digits)
 
877
        """
 
878
        if self._is_special:
 
879
            ans = self._check_nans(context=context)
 
880
            if ans:
 
881
                return ans
 
882
 
 
883
        sign = self._sign
 
884
        if not self:
 
885
            # + (-0) = 0
 
886
            sign = 0
 
887
 
 
888
        if context is None:
 
889
            context = getcontext()
 
890
 
 
891
        if context._rounding_decision == ALWAYS_ROUND:
 
892
            ans = self._fix(context)
 
893
        else:
 
894
            ans = Decimal(self)
 
895
        ans._sign = sign
 
896
        return ans
 
897
 
 
898
    def __abs__(self, round=1, context=None):
 
899
        """Returns the absolute value of self.
 
900
 
 
901
        If the second argument is 0, do not round.
 
902
        """
 
903
        if self._is_special:
 
904
            ans = self._check_nans(context=context)
 
905
            if ans:
 
906
                return ans
 
907
 
 
908
        if not round:
 
909
            if context is None:
 
910
                context = getcontext()
 
911
            context = context._shallow_copy()
 
912
            context._set_rounding_decision(NEVER_ROUND)
 
913
 
 
914
        if self._sign:
 
915
            ans = self.__neg__(context=context)
 
916
        else:
 
917
            ans = self.__pos__(context=context)
 
918
 
 
919
        return ans
 
920
 
 
921
    def __add__(self, other, context=None):
 
922
        """Returns self + other.
 
923
 
 
924
        -INF + INF (or the reverse) cause InvalidOperation errors.
 
925
        """
 
926
        other = _convert_other(other)
 
927
        if other is NotImplemented:
 
928
            return other
 
929
 
 
930
        if context is None:
 
931
            context = getcontext()
 
932
 
 
933
        if self._is_special or other._is_special:
 
934
            ans = self._check_nans(other, context)
 
935
            if ans:
 
936
                return ans
 
937
 
 
938
            if self._isinfinity():
 
939
                #If both INF, same sign => same as both, opposite => error.
 
940
                if self._sign != other._sign and other._isinfinity():
 
941
                    return context._raise_error(InvalidOperation, '-INF + INF')
 
942
                return Decimal(self)
 
943
            if other._isinfinity():
 
944
                return Decimal(other)  #Can't both be infinity here
 
945
 
 
946
        shouldround = context._rounding_decision == ALWAYS_ROUND
 
947
 
 
948
        exp = min(self._exp, other._exp)
 
949
        negativezero = 0
 
950
        if context.rounding == ROUND_FLOOR and self._sign != other._sign:
 
951
            #If the answer is 0, the sign should be negative, in this case.
 
952
            negativezero = 1
 
953
 
 
954
        if not self and not other:
 
955
            sign = min(self._sign, other._sign)
 
956
            if negativezero:
 
957
                sign = 1
 
958
            return Decimal( (sign, (0,), exp))
 
959
        if not self:
 
960
            exp = max(exp, other._exp - context.prec-1)
 
961
            ans = other._rescale(exp, watchexp=0, context=context)
 
962
            if shouldround:
 
963
                ans = ans._fix(context)
 
964
            return ans
 
965
        if not other:
 
966
            exp = max(exp, self._exp - context.prec-1)
 
967
            ans = self._rescale(exp, watchexp=0, context=context)
 
968
            if shouldround:
 
969
                ans = ans._fix(context)
 
970
            return ans
 
971
 
 
972
        op1 = _WorkRep(self)
 
973
        op2 = _WorkRep(other)
 
974
        op1, op2 = _normalize(op1, op2, shouldround, context.prec)
 
975
 
 
976
        result = _WorkRep()
 
977
        if op1.sign != op2.sign:
 
978
            # Equal and opposite
 
979
            if op1.int == op2.int:
 
980
                if exp < context.Etiny():
 
981
                    exp = context.Etiny()
 
982
                    context._raise_error(Clamped)
 
983
                return Decimal((negativezero, (0,), exp))
 
984
            if op1.int < op2.int:
 
985
                op1, op2 = op2, op1
 
986
                #OK, now abs(op1) > abs(op2)
 
987
            if op1.sign == 1:
 
988
                result.sign = 1
 
989
                op1.sign, op2.sign = op2.sign, op1.sign
 
990
            else:
 
991
                result.sign = 0
 
992
                #So we know the sign, and op1 > 0.
 
993
        elif op1.sign == 1:
 
994
            result.sign = 1
 
995
            op1.sign, op2.sign = (0, 0)
 
996
        else:
 
997
            result.sign = 0
 
998
        #Now, op1 > abs(op2) > 0
 
999
 
 
1000
        if op2.sign == 0:
 
1001
            result.int = op1.int + op2.int
 
1002
        else:
 
1003
            result.int = op1.int - op2.int
 
1004
 
 
1005
        result.exp = op1.exp
 
1006
        ans = Decimal(result)
 
1007
        if shouldround:
 
1008
            ans = ans._fix(context)
 
1009
        return ans
 
1010
 
 
1011
    __radd__ = __add__
 
1012
 
 
1013
    def __sub__(self, other, context=None):
 
1014
        """Return self + (-other)"""
 
1015
        other = _convert_other(other)
 
1016
        if other is NotImplemented:
 
1017
            return other
 
1018
 
 
1019
        if self._is_special or other._is_special:
 
1020
            ans = self._check_nans(other, context=context)
 
1021
            if ans:
 
1022
                return ans
 
1023
 
 
1024
        # -Decimal(0) = Decimal(0), which we don't want since
 
1025
        # (-0 - 0 = -0 + (-0) = -0, but -0 + 0 = 0.)
 
1026
        # so we change the sign directly to a copy
 
1027
        tmp = Decimal(other)
 
1028
        tmp._sign = 1-tmp._sign
 
1029
 
 
1030
        return self.__add__(tmp, context=context)
 
1031
 
 
1032
    def __rsub__(self, other, context=None):
 
1033
        """Return other + (-self)"""
 
1034
        other = _convert_other(other)
 
1035
        if other is NotImplemented:
 
1036
            return other
 
1037
 
 
1038
        tmp = Decimal(self)
 
1039
        tmp._sign = 1 - tmp._sign
 
1040
        return other.__add__(tmp, context=context)
 
1041
 
 
1042
    def _increment(self, round=1, context=None):
 
1043
        """Special case of add, adding 1eExponent
 
1044
 
 
1045
        Since it is common, (rounding, for example) this adds
 
1046
        (sign)*one E self._exp to the number more efficiently than add.
 
1047
 
 
1048
        For example:
 
1049
        Decimal('5.624e10')._increment() == Decimal('5.625e10')
 
1050
        """
 
1051
        if self._is_special:
 
1052
            ans = self._check_nans(context=context)
 
1053
            if ans:
 
1054
                return ans
 
1055
 
 
1056
            return Decimal(self) # Must be infinite, and incrementing makes no difference
 
1057
 
 
1058
        L = list(self._int)
 
1059
        L[-1] += 1
 
1060
        spot = len(L)-1
 
1061
        while L[spot] == 10:
 
1062
            L[spot] = 0
 
1063
            if spot == 0:
 
1064
                L[0:0] = [1]
 
1065
                break
 
1066
            L[spot-1] += 1
 
1067
            spot -= 1
 
1068
        ans = Decimal((self._sign, L, self._exp))
 
1069
 
 
1070
        if context is None:
 
1071
            context = getcontext()
 
1072
        if round and context._rounding_decision == ALWAYS_ROUND:
 
1073
            ans = ans._fix(context)
 
1074
        return ans
 
1075
 
 
1076
    def __mul__(self, other, context=None):
 
1077
        """Return self * other.
 
1078
 
 
1079
        (+-) INF * 0 (or its reverse) raise InvalidOperation.
 
1080
        """
 
1081
        other = _convert_other(other)
 
1082
        if other is NotImplemented:
 
1083
            return other
 
1084
 
 
1085
        if context is None:
 
1086
            context = getcontext()
 
1087
 
 
1088
        resultsign = self._sign ^ other._sign
 
1089
 
 
1090
        if self._is_special or other._is_special:
 
1091
            ans = self._check_nans(other, context)
 
1092
            if ans:
 
1093
                return ans
 
1094
 
 
1095
            if self._isinfinity():
 
1096
                if not other:
 
1097
                    return context._raise_error(InvalidOperation, '(+-)INF * 0')
 
1098
                return Infsign[resultsign]
 
1099
 
 
1100
            if other._isinfinity():
 
1101
                if not self:
 
1102
                    return context._raise_error(InvalidOperation, '0 * (+-)INF')
 
1103
                return Infsign[resultsign]
 
1104
 
 
1105
        resultexp = self._exp + other._exp
 
1106
        shouldround = context._rounding_decision == ALWAYS_ROUND
 
1107
 
 
1108
        # Special case for multiplying by zero
 
1109
        if not self or not other:
 
1110
            ans = Decimal((resultsign, (0,), resultexp))
 
1111
            if shouldround:
 
1112
                #Fixing in case the exponent is out of bounds
 
1113
                ans = ans._fix(context)
 
1114
            return ans
 
1115
 
 
1116
        # Special case for multiplying by power of 10
 
1117
        if self._int == (1,):
 
1118
            ans = Decimal((resultsign, other._int, resultexp))
 
1119
            if shouldround:
 
1120
                ans = ans._fix(context)
 
1121
            return ans
 
1122
        if other._int == (1,):
 
1123
            ans = Decimal((resultsign, self._int, resultexp))
 
1124
            if shouldround:
 
1125
                ans = ans._fix(context)
 
1126
            return ans
 
1127
 
 
1128
        op1 = _WorkRep(self)
 
1129
        op2 = _WorkRep(other)
 
1130
 
 
1131
        ans = Decimal( (resultsign, map(int, str(op1.int * op2.int)), resultexp))
 
1132
        if shouldround:
 
1133
            ans = ans._fix(context)
 
1134
 
 
1135
        return ans
 
1136
    __rmul__ = __mul__
 
1137
 
 
1138
    def __div__(self, other, context=None):
 
1139
        """Return self / other."""
 
1140
        return self._divide(other, context=context)
 
1141
    __truediv__ = __div__
 
1142
 
 
1143
    def _divide(self, other, divmod = 0, context=None):
 
1144
        """Return a / b, to context.prec precision.
 
1145
 
 
1146
        divmod:
 
1147
        0 => true division
 
1148
        1 => (a //b, a%b)
 
1149
        2 => a //b
 
1150
        3 => a%b
 
1151
 
 
1152
        Actually, if divmod is 2 or 3 a tuple is returned, but errors for
 
1153
        computing the other value are not raised.
 
1154
        """
 
1155
        other = _convert_other(other)
 
1156
        if other is NotImplemented:
 
1157
            if divmod in (0, 1):
 
1158
                return NotImplemented
 
1159
            return (NotImplemented, NotImplemented)
 
1160
 
 
1161
        if context is None:
 
1162
            context = getcontext()
 
1163
 
 
1164
        sign = self._sign ^ other._sign
 
1165
 
 
1166
        if self._is_special or other._is_special:
 
1167
            ans = self._check_nans(other, context)
 
1168
            if ans:
 
1169
                if divmod:
 
1170
                    return (ans, ans)
 
1171
                return ans
 
1172
 
 
1173
            if self._isinfinity() and other._isinfinity():
 
1174
                if divmod:
 
1175
                    return (context._raise_error(InvalidOperation,
 
1176
                                            '(+-)INF // (+-)INF'),
 
1177
                            context._raise_error(InvalidOperation,
 
1178
                                            '(+-)INF % (+-)INF'))
 
1179
                return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
 
1180
 
 
1181
            if self._isinfinity():
 
1182
                if divmod == 1:
 
1183
                    return (Infsign[sign],
 
1184
                            context._raise_error(InvalidOperation, 'INF % x'))
 
1185
                elif divmod == 2:
 
1186
                    return (Infsign[sign], NaN)
 
1187
                elif divmod == 3:
 
1188
                    return (Infsign[sign],
 
1189
                            context._raise_error(InvalidOperation, 'INF % x'))
 
1190
                return Infsign[sign]
 
1191
 
 
1192
            if other._isinfinity():
 
1193
                if divmod:
 
1194
                    return (Decimal((sign, (0,), 0)), Decimal(self))
 
1195
                context._raise_error(Clamped, 'Division by infinity')
 
1196
                return Decimal((sign, (0,), context.Etiny()))
 
1197
 
 
1198
        # Special cases for zeroes
 
1199
        if not self and not other:
 
1200
            if divmod:
 
1201
                return context._raise_error(DivisionUndefined, '0 / 0', 1)
 
1202
            return context._raise_error(DivisionUndefined, '0 / 0')
 
1203
 
 
1204
        if not self:
 
1205
            if divmod:
 
1206
                otherside = Decimal(self)
 
1207
                otherside._exp = min(self._exp, other._exp)
 
1208
                return (Decimal((sign, (0,), 0)),  otherside)
 
1209
            exp = self._exp - other._exp
 
1210
            if exp < context.Etiny():
 
1211
                exp = context.Etiny()
 
1212
                context._raise_error(Clamped, '0e-x / y')
 
1213
            if exp > context.Emax:
 
1214
                exp = context.Emax
 
1215
                context._raise_error(Clamped, '0e+x / y')
 
1216
            return Decimal( (sign, (0,), exp) )
 
1217
 
 
1218
        if not other:
 
1219
            if divmod:
 
1220
                return context._raise_error(DivisionByZero, 'divmod(x,0)',
 
1221
                                           sign, 1)
 
1222
            return context._raise_error(DivisionByZero, 'x / 0', sign)
 
1223
 
 
1224
        #OK, so neither = 0, INF or NaN
 
1225
 
 
1226
        shouldround = context._rounding_decision == ALWAYS_ROUND
 
1227
 
 
1228
        #If we're dividing into ints, and self < other, stop.
 
1229
        #self.__abs__(0) does not round.
 
1230
        if divmod and (self.__abs__(0, context) < other.__abs__(0, context)):
 
1231
 
 
1232
            if divmod == 1 or divmod == 3:
 
1233
                exp = min(self._exp, other._exp)
 
1234
                ans2 = self._rescale(exp, context=context, watchexp=0)
 
1235
                if shouldround:
 
1236
                    ans2 = ans2._fix(context)
 
1237
                return (Decimal( (sign, (0,), 0) ),
 
1238
                        ans2)
 
1239
 
 
1240
            elif divmod == 2:
 
1241
                #Don't round the mod part, if we don't need it.
 
1242
                return (Decimal( (sign, (0,), 0) ), Decimal(self))
 
1243
 
 
1244
        op1 = _WorkRep(self)
 
1245
        op2 = _WorkRep(other)
 
1246
        op1, op2, adjust = _adjust_coefficients(op1, op2)
 
1247
        res = _WorkRep( (sign, 0, (op1.exp - op2.exp)) )
 
1248
        if divmod and res.exp > context.prec + 1:
 
1249
            return context._raise_error(DivisionImpossible)
 
1250
 
 
1251
        prec_limit = 10 ** context.prec
 
1252
        while 1:
 
1253
            while op2.int <= op1.int:
 
1254
                res.int += 1
 
1255
                op1.int -= op2.int
 
1256
            if res.exp == 0 and divmod:
 
1257
                if res.int >= prec_limit and shouldround:
 
1258
                    return context._raise_error(DivisionImpossible)
 
1259
                otherside = Decimal(op1)
 
1260
                frozen = context._ignore_all_flags()
 
1261
 
 
1262
                exp = min(self._exp, other._exp)
 
1263
                otherside = otherside._rescale(exp, context=context, watchexp=0)
 
1264
                context._regard_flags(*frozen)
 
1265
                if shouldround:
 
1266
                    otherside = otherside._fix(context)
 
1267
                return (Decimal(res), otherside)
 
1268
 
 
1269
            if op1.int == 0 and adjust >= 0 and not divmod:
 
1270
                break
 
1271
            if res.int >= prec_limit and shouldround:
 
1272
                if divmod:
 
1273
                    return context._raise_error(DivisionImpossible)
 
1274
                shouldround=1
 
1275
                # Really, the answer is a bit higher, so adding a one to
 
1276
                # the end will make sure the rounding is right.
 
1277
                if op1.int != 0:
 
1278
                    res.int *= 10
 
1279
                    res.int += 1
 
1280
                    res.exp -= 1
 
1281
 
 
1282
                break
 
1283
            res.int *= 10
 
1284
            res.exp -= 1
 
1285
            adjust += 1
 
1286
            op1.int *= 10
 
1287
            op1.exp -= 1
 
1288
 
 
1289
            if res.exp == 0 and divmod and op2.int > op1.int:
 
1290
                #Solves an error in precision.  Same as a previous block.
 
1291
 
 
1292
                if res.int >= prec_limit and shouldround:
 
1293
                    return context._raise_error(DivisionImpossible)
 
1294
                otherside = Decimal(op1)
 
1295
                frozen = context._ignore_all_flags()
 
1296
 
 
1297
                exp = min(self._exp, other._exp)
 
1298
                otherside = otherside._rescale(exp, context=context)
 
1299
 
 
1300
                context._regard_flags(*frozen)
 
1301
 
 
1302
                return (Decimal(res), otherside)
 
1303
 
 
1304
        ans = Decimal(res)
 
1305
        if shouldround:
 
1306
            ans = ans._fix(context)
 
1307
        return ans
 
1308
 
 
1309
    def __rdiv__(self, other, context=None):
 
1310
        """Swaps self/other and returns __div__."""
 
1311
        other = _convert_other(other)
 
1312
        if other is NotImplemented:
 
1313
            return other
 
1314
        return other.__div__(self, context=context)
 
1315
    __rtruediv__ = __rdiv__
 
1316
 
 
1317
    def __divmod__(self, other, context=None):
 
1318
        """
 
1319
        (self // other, self % other)
 
1320
        """
 
1321
        return self._divide(other, 1, context)
 
1322
 
 
1323
    def __rdivmod__(self, other, context=None):
 
1324
        """Swaps self/other and returns __divmod__."""
 
1325
        other = _convert_other(other)
 
1326
        if other is NotImplemented:
 
1327
            return other
 
1328
        return other.__divmod__(self, context=context)
 
1329
 
 
1330
    def __mod__(self, other, context=None):
 
1331
        """
 
1332
        self % other
 
1333
        """
 
1334
        other = _convert_other(other)
 
1335
        if other is NotImplemented:
 
1336
            return other
 
1337
 
 
1338
        if self._is_special or other._is_special:
 
1339
            ans = self._check_nans(other, context)
 
1340
            if ans:
 
1341
                return ans
 
1342
 
 
1343
        if self and not other:
 
1344
            return context._raise_error(InvalidOperation, 'x % 0')
 
1345
 
 
1346
        return self._divide(other, 3, context)[1]
 
1347
 
 
1348
    def __rmod__(self, other, context=None):
 
1349
        """Swaps self/other and returns __mod__."""
 
1350
        other = _convert_other(other)
 
1351
        if other is NotImplemented:
 
1352
            return other
 
1353
        return other.__mod__(self, context=context)
 
1354
 
 
1355
    def remainder_near(self, other, context=None):
 
1356
        """
 
1357
        Remainder nearest to 0-  abs(remainder-near) <= other/2
 
1358
        """
 
1359
        other = _convert_other(other)
 
1360
        if other is NotImplemented:
 
1361
            return other
 
1362
 
 
1363
        if self._is_special or other._is_special:
 
1364
            ans = self._check_nans(other, context)
 
1365
            if ans:
 
1366
                return ans
 
1367
        if self and not other:
 
1368
            return context._raise_error(InvalidOperation, 'x % 0')
 
1369
 
 
1370
        if context is None:
 
1371
            context = getcontext()
 
1372
        # If DivisionImpossible causes an error, do not leave Rounded/Inexact
 
1373
        # ignored in the calling function.
 
1374
        context = context._shallow_copy()
 
1375
        flags = context._ignore_flags(Rounded, Inexact)
 
1376
        #keep DivisionImpossible flags
 
1377
        (side, r) = self.__divmod__(other, context=context)
 
1378
 
 
1379
        if r._isnan():
 
1380
            context._regard_flags(*flags)
 
1381
            return r
 
1382
 
 
1383
        context = context._shallow_copy()
 
1384
        rounding = context._set_rounding_decision(NEVER_ROUND)
 
1385
 
 
1386
        if other._sign:
 
1387
            comparison = other.__div__(Decimal(-2), context=context)
 
1388
        else:
 
1389
            comparison = other.__div__(Decimal(2), context=context)
 
1390
 
 
1391
        context._set_rounding_decision(rounding)
 
1392
        context._regard_flags(*flags)
 
1393
 
 
1394
        s1, s2 = r._sign, comparison._sign
 
1395
        r._sign, comparison._sign = 0, 0
 
1396
 
 
1397
        if r < comparison:
 
1398
            r._sign, comparison._sign = s1, s2
 
1399
            #Get flags now
 
1400
            self.__divmod__(other, context=context)
 
1401
            return r._fix(context)
 
1402
        r._sign, comparison._sign = s1, s2
 
1403
 
 
1404
        rounding = context._set_rounding_decision(NEVER_ROUND)
 
1405
 
 
1406
        (side, r) = self.__divmod__(other, context=context)
 
1407
        context._set_rounding_decision(rounding)
 
1408
        if r._isnan():
 
1409
            return r
 
1410
 
 
1411
        decrease = not side._iseven()
 
1412
        rounding = context._set_rounding_decision(NEVER_ROUND)
 
1413
        side = side.__abs__(context=context)
 
1414
        context._set_rounding_decision(rounding)
 
1415
 
 
1416
        s1, s2 = r._sign, comparison._sign
 
1417
        r._sign, comparison._sign = 0, 0
 
1418
        if r > comparison or decrease and r == comparison:
 
1419
            r._sign, comparison._sign = s1, s2
 
1420
            context.prec += 1
 
1421
            if len(side.__add__(Decimal(1), context=context)._int) >= context.prec:
 
1422
                context.prec -= 1
 
1423
                return context._raise_error(DivisionImpossible)[1]
 
1424
            context.prec -= 1
 
1425
            if self._sign == other._sign:
 
1426
                r = r.__sub__(other, context=context)
 
1427
            else:
 
1428
                r = r.__add__(other, context=context)
 
1429
        else:
 
1430
            r._sign, comparison._sign = s1, s2
 
1431
 
 
1432
        return r._fix(context)
 
1433
 
 
1434
    def __floordiv__(self, other, context=None):
 
1435
        """self // other"""
 
1436
        return self._divide(other, 2, context)[0]
 
1437
 
 
1438
    def __rfloordiv__(self, other, context=None):
 
1439
        """Swaps self/other and returns __floordiv__."""
 
1440
        other = _convert_other(other)
 
1441
        if other is NotImplemented:
 
1442
            return other
 
1443
        return other.__floordiv__(self, context=context)
 
1444
 
 
1445
    def __float__(self):
 
1446
        """Float representation."""
 
1447
        return float(str(self))
 
1448
 
 
1449
    def __int__(self):
 
1450
        """Converts self to an int, truncating if necessary."""
 
1451
        if self._is_special:
 
1452
            if self._isnan():
 
1453
                context = getcontext()
 
1454
                return context._raise_error(InvalidContext)
 
1455
            elif self._isinfinity():
 
1456
                raise OverflowError, "Cannot convert infinity to long"
 
1457
        if self._exp >= 0:
 
1458
            s = ''.join(map(str, self._int)) + '0'*self._exp
 
1459
        else:
 
1460
            s = ''.join(map(str, self._int))[:self._exp]
 
1461
        if s == '':
 
1462
            s = '0'
 
1463
        sign = '-'*self._sign
 
1464
        return int(sign + s)
 
1465
 
 
1466
    def __long__(self):
 
1467
        """Converts to a long.
 
1468
 
 
1469
        Equivalent to long(int(self))
 
1470
        """
 
1471
        return long(self.__int__())
 
1472
 
 
1473
    def _fix(self, context):
 
1474
        """Round if it is necessary to keep self within prec precision.
 
1475
 
 
1476
        Rounds and fixes the exponent.  Does not raise on a sNaN.
 
1477
 
 
1478
        Arguments:
 
1479
        self - Decimal instance
 
1480
        context - context used.
 
1481
        """
 
1482
        if self._is_special:
 
1483
            return self
 
1484
        if context is None:
 
1485
            context = getcontext()
 
1486
        prec = context.prec
 
1487
        ans = self._fixexponents(context)
 
1488
        if len(ans._int) > prec:
 
1489
            ans = ans._round(prec, context=context)
 
1490
            ans = ans._fixexponents(context)
 
1491
        return ans
 
1492
 
 
1493
    def _fixexponents(self, context):
 
1494
        """Fix the exponents and return a copy with the exponent in bounds.
 
1495
        Only call if known to not be a special value.
 
1496
        """
 
1497
        folddown = context._clamp
 
1498
        Emin = context.Emin
 
1499
        ans = self
 
1500
        ans_adjusted = ans.adjusted()
 
1501
        if ans_adjusted < Emin:
 
1502
            Etiny = context.Etiny()
 
1503
            if ans._exp < Etiny:
 
1504
                if not ans:
 
1505
                    ans = Decimal(self)
 
1506
                    ans._exp = Etiny
 
1507
                    context._raise_error(Clamped)
 
1508
                    return ans
 
1509
                ans = ans._rescale(Etiny, context=context)
 
1510
                #It isn't zero, and exp < Emin => subnormal
 
1511
                context._raise_error(Subnormal)
 
1512
                if context.flags[Inexact]:
 
1513
                    context._raise_error(Underflow)
 
1514
            else:
 
1515
                if ans:
 
1516
                    #Only raise subnormal if non-zero.
 
1517
                    context._raise_error(Subnormal)
 
1518
        else:
 
1519
            Etop = context.Etop()
 
1520
            if folddown and ans._exp > Etop:
 
1521
                context._raise_error(Clamped)
 
1522
                ans = ans._rescale(Etop, context=context)
 
1523
            else:
 
1524
                Emax = context.Emax
 
1525
                if ans_adjusted > Emax:
 
1526
                    if not ans:
 
1527
                        ans = Decimal(self)
 
1528
                        ans._exp = Emax
 
1529
                        context._raise_error(Clamped)
 
1530
                        return ans
 
1531
                    context._raise_error(Inexact)
 
1532
                    context._raise_error(Rounded)
 
1533
                    return context._raise_error(Overflow, 'above Emax', ans._sign)
 
1534
        return ans
 
1535
 
 
1536
    def _round(self, prec=None, rounding=None, context=None):
 
1537
        """Returns a rounded version of self.
 
1538
 
 
1539
        You can specify the precision or rounding method.  Otherwise, the
 
1540
        context determines it.
 
1541
        """
 
1542
 
 
1543
        if self._is_special:
 
1544
            ans = self._check_nans(context=context)
 
1545
            if ans:
 
1546
                return ans
 
1547
 
 
1548
            if self._isinfinity():
 
1549
                return Decimal(self)
 
1550
 
 
1551
        if context is None:
 
1552
            context = getcontext()
 
1553
 
 
1554
        if rounding is None:
 
1555
            rounding = context.rounding
 
1556
        if prec is None:
 
1557
            prec = context.prec
 
1558
 
 
1559
        if not self:
 
1560
            if prec <= 0:
 
1561
                dig = (0,)
 
1562
                exp = len(self._int) - prec + self._exp
 
1563
            else:
 
1564
                dig = (0,) * prec
 
1565
                exp = len(self._int) + self._exp - prec
 
1566
            ans = Decimal((self._sign, dig, exp))
 
1567
            context._raise_error(Rounded)
 
1568
            return ans
 
1569
 
 
1570
        if prec == 0:
 
1571
            temp = Decimal(self)
 
1572
            temp._int = (0,)+temp._int
 
1573
            prec = 1
 
1574
        elif prec < 0:
 
1575
            exp = self._exp + len(self._int) - prec - 1
 
1576
            temp = Decimal( (self._sign, (0, 1), exp))
 
1577
            prec = 1
 
1578
        else:
 
1579
            temp = Decimal(self)
 
1580
 
 
1581
        numdigits = len(temp._int)
 
1582
        if prec == numdigits:
 
1583
            return temp
 
1584
 
 
1585
        # See if we need to extend precision
 
1586
        expdiff = prec - numdigits
 
1587
        if expdiff > 0:
 
1588
            tmp = list(temp._int)
 
1589
            tmp.extend([0] * expdiff)
 
1590
            ans =  Decimal( (temp._sign, tmp, temp._exp - expdiff))
 
1591
            return ans
 
1592
 
 
1593
        #OK, but maybe all the lost digits are 0.
 
1594
        lostdigits = self._int[expdiff:]
 
1595
        if lostdigits == (0,) * len(lostdigits):
 
1596
            ans = Decimal( (temp._sign, temp._int[:prec], temp._exp - expdiff))
 
1597
            #Rounded, but not Inexact
 
1598
            context._raise_error(Rounded)
 
1599
            return ans
 
1600
 
 
1601
        # Okay, let's round and lose data
 
1602
 
 
1603
        this_function = getattr(temp, self._pick_rounding_function[rounding])
 
1604
        #Now we've got the rounding function
 
1605
 
 
1606
        if prec != context.prec:
 
1607
            context = context._shallow_copy()
 
1608
            context.prec = prec
 
1609
        ans = this_function(prec, expdiff, context)
 
1610
        context._raise_error(Rounded)
 
1611
        context._raise_error(Inexact, 'Changed in rounding')
 
1612
 
 
1613
        return ans
 
1614
 
 
1615
    _pick_rounding_function = {}
 
1616
 
 
1617
    def _round_down(self, prec, expdiff, context):
 
1618
        """Also known as round-towards-0, truncate."""
 
1619
        return Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
 
1620
 
 
1621
    def _round_half_up(self, prec, expdiff, context, tmp = None):
 
1622
        """Rounds 5 up (away from 0)"""
 
1623
 
 
1624
        if tmp is None:
 
1625
            tmp = Decimal( (self._sign,self._int[:prec], self._exp - expdiff))
 
1626
        if self._int[prec] >= 5:
 
1627
            tmp = tmp._increment(round=0, context=context)
 
1628
            if len(tmp._int) > prec:
 
1629
                return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
 
1630
        return tmp
 
1631
 
 
1632
    def _round_half_even(self, prec, expdiff, context):
 
1633
        """Round 5 to even, rest to nearest."""
 
1634
 
 
1635
        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
 
1636
        half = (self._int[prec] == 5)
 
1637
        if half:
 
1638
            for digit in self._int[prec+1:]:
 
1639
                if digit != 0:
 
1640
                    half = 0
 
1641
                    break
 
1642
        if half:
 
1643
            if self._int[prec-1] & 1 == 0:
 
1644
                return tmp
 
1645
        return self._round_half_up(prec, expdiff, context, tmp)
 
1646
 
 
1647
    def _round_half_down(self, prec, expdiff, context):
 
1648
        """Round 5 down"""
 
1649
 
 
1650
        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
 
1651
        half = (self._int[prec] == 5)
 
1652
        if half:
 
1653
            for digit in self._int[prec+1:]:
 
1654
                if digit != 0:
 
1655
                    half = 0
 
1656
                    break
 
1657
        if half:
 
1658
            return tmp
 
1659
        return self._round_half_up(prec, expdiff, context, tmp)
 
1660
 
 
1661
    def _round_up(self, prec, expdiff, context):
 
1662
        """Rounds away from 0."""
 
1663
        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
 
1664
        for digit in self._int[prec:]:
 
1665
            if digit != 0:
 
1666
                tmp = tmp._increment(round=1, context=context)
 
1667
                if len(tmp._int) > prec:
 
1668
                    return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
 
1669
                else:
 
1670
                    return tmp
 
1671
        return tmp
 
1672
 
 
1673
    def _round_ceiling(self, prec, expdiff, context):
 
1674
        """Rounds up (not away from 0 if negative.)"""
 
1675
        if self._sign:
 
1676
            return self._round_down(prec, expdiff, context)
 
1677
        else:
 
1678
            return self._round_up(prec, expdiff, context)
 
1679
 
 
1680
    def _round_floor(self, prec, expdiff, context):
 
1681
        """Rounds down (not towards 0 if negative)"""
 
1682
        if not self._sign:
 
1683
            return self._round_down(prec, expdiff, context)
 
1684
        else:
 
1685
            return self._round_up(prec, expdiff, context)
 
1686
 
 
1687
    def __pow__(self, n, modulo = None, context=None):
 
1688
        """Return self ** n (mod modulo)
 
1689
 
 
1690
        If modulo is None (default), don't take it mod modulo.
 
1691
        """
 
1692
        n = _convert_other(n)
 
1693
        if n is NotImplemented:
 
1694
            return n
 
1695
 
 
1696
        if context is None:
 
1697
            context = getcontext()
 
1698
 
 
1699
        if self._is_special or n._is_special or n.adjusted() > 8:
 
1700
            #Because the spot << doesn't work with really big exponents
 
1701
            if n._isinfinity() or n.adjusted() > 8:
 
1702
                return context._raise_error(InvalidOperation, 'x ** INF')
 
1703
 
 
1704
            ans = self._check_nans(n, context)
 
1705
            if ans:
 
1706
                return ans
 
1707
 
 
1708
        if not n._isinteger():
 
1709
            return context._raise_error(InvalidOperation, 'x ** (non-integer)')
 
1710
 
 
1711
        if not self and not n:
 
1712
            return context._raise_error(InvalidOperation, '0 ** 0')
 
1713
 
 
1714
        if not n:
 
1715
            return Decimal(1)
 
1716
 
 
1717
        if self == Decimal(1):
 
1718
            return Decimal(1)
 
1719
 
 
1720
        sign = self._sign and not n._iseven()
 
1721
        n = int(n)
 
1722
 
 
1723
        if self._isinfinity():
 
1724
            if modulo:
 
1725
                return context._raise_error(InvalidOperation, 'INF % x')
 
1726
            if n > 0:
 
1727
                return Infsign[sign]
 
1728
            return Decimal( (sign, (0,), 0) )
 
1729
 
 
1730
        #with ludicrously large exponent, just raise an overflow and return inf.
 
1731
        if not modulo and n > 0 and (self._exp + len(self._int) - 1) * n > context.Emax \
 
1732
           and self:
 
1733
 
 
1734
            tmp = Decimal('inf')
 
1735
            tmp._sign = sign
 
1736
            context._raise_error(Rounded)
 
1737
            context._raise_error(Inexact)
 
1738
            context._raise_error(Overflow, 'Big power', sign)
 
1739
            return tmp
 
1740
 
 
1741
        elength = len(str(abs(n)))
 
1742
        firstprec = context.prec
 
1743
 
 
1744
        if not modulo and firstprec + elength + 1 > DefaultContext.Emax:
 
1745
            return context._raise_error(Overflow, 'Too much precision.', sign)
 
1746
 
 
1747
        mul = Decimal(self)
 
1748
        val = Decimal(1)
 
1749
        context = context._shallow_copy()
 
1750
        context.prec = firstprec + elength + 1
 
1751
        if n < 0:
 
1752
            #n is a long now, not Decimal instance
 
1753
            n = -n
 
1754
            mul = Decimal(1).__div__(mul, context=context)
 
1755
 
 
1756
        spot = 1
 
1757
        while spot <= n:
 
1758
            spot <<= 1
 
1759
 
 
1760
        spot >>= 1
 
1761
        #Spot is the highest power of 2 less than n
 
1762
        while spot:
 
1763
            val = val.__mul__(val, context=context)
 
1764
            if val._isinfinity():
 
1765
                val = Infsign[sign]
 
1766
                break
 
1767
            if spot & n:
 
1768
                val = val.__mul__(mul, context=context)
 
1769
            if modulo is not None:
 
1770
                val = val.__mod__(modulo, context=context)
 
1771
            spot >>= 1
 
1772
        context.prec = firstprec
 
1773
 
 
1774
        if context._rounding_decision == ALWAYS_ROUND:
 
1775
            return val._fix(context)
 
1776
        return val
 
1777
 
 
1778
    def __rpow__(self, other, context=None):
 
1779
        """Swaps self/other and returns __pow__."""
 
1780
        other = _convert_other(other)
 
1781
        if other is NotImplemented:
 
1782
            return other
 
1783
        return other.__pow__(self, context=context)
 
1784
 
 
1785
    def normalize(self, context=None):
 
1786
        """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
 
1787
 
 
1788
        if self._is_special:
 
1789
            ans = self._check_nans(context=context)
 
1790
            if ans:
 
1791
                return ans
 
1792
 
 
1793
        dup = self._fix(context)
 
1794
        if dup._isinfinity():
 
1795
            return dup
 
1796
 
 
1797
        if not dup:
 
1798
            return Decimal( (dup._sign, (0,), 0) )
 
1799
        end = len(dup._int)
 
1800
        exp = dup._exp
 
1801
        while dup._int[end-1] == 0:
 
1802
            exp += 1
 
1803
            end -= 1
 
1804
        return Decimal( (dup._sign, dup._int[:end], exp) )
 
1805
 
 
1806
 
 
1807
    def quantize(self, exp, rounding=None, context=None, watchexp=1):
 
1808
        """Quantize self so its exponent is the same as that of exp.
 
1809
 
 
1810
        Similar to self._rescale(exp._exp) but with error checking.
 
1811
        """
 
1812
        if self._is_special or exp._is_special:
 
1813
            ans = self._check_nans(exp, context)
 
1814
            if ans:
 
1815
                return ans
 
1816
 
 
1817
            if exp._isinfinity() or self._isinfinity():
 
1818
                if exp._isinfinity() and self._isinfinity():
 
1819
                    return self  #if both are inf, it is OK
 
1820
                if context is None:
 
1821
                    context = getcontext()
 
1822
                return context._raise_error(InvalidOperation,
 
1823
                                        'quantize with one INF')
 
1824
        return self._rescale(exp._exp, rounding, context, watchexp)
 
1825
 
 
1826
    def same_quantum(self, other):
 
1827
        """Test whether self and other have the same exponent.
 
1828
 
 
1829
        same as self._exp == other._exp, except NaN == sNaN
 
1830
        """
 
1831
        if self._is_special or other._is_special:
 
1832
            if self._isnan() or other._isnan():
 
1833
                return self._isnan() and other._isnan() and True
 
1834
            if self._isinfinity() or other._isinfinity():
 
1835
                return self._isinfinity() and other._isinfinity() and True
 
1836
        return self._exp == other._exp
 
1837
 
 
1838
    def _rescale(self, exp, rounding=None, context=None, watchexp=1):
 
1839
        """Rescales so that the exponent is exp.
 
1840
 
 
1841
        exp = exp to scale to (an integer)
 
1842
        rounding = rounding version
 
1843
        watchexp: if set (default) an error is returned if exp is greater
 
1844
        than Emax or less than Etiny.
 
1845
        """
 
1846
        if context is None:
 
1847
            context = getcontext()
 
1848
 
 
1849
        if self._is_special:
 
1850
            if self._isinfinity():
 
1851
                return context._raise_error(InvalidOperation, 'rescale with an INF')
 
1852
 
 
1853
            ans = self._check_nans(context=context)
 
1854
            if ans:
 
1855
                return ans
 
1856
 
 
1857
        if watchexp and (context.Emax  < exp or context.Etiny() > exp):
 
1858
            return context._raise_error(InvalidOperation, 'rescale(a, INF)')
 
1859
 
 
1860
        if not self:
 
1861
            ans = Decimal(self)
 
1862
            ans._int = (0,)
 
1863
            ans._exp = exp
 
1864
            return ans
 
1865
 
 
1866
        diff = self._exp - exp
 
1867
        digits = len(self._int) + diff
 
1868
 
 
1869
        if watchexp and digits > context.prec:
 
1870
            return context._raise_error(InvalidOperation, 'Rescale > prec')
 
1871
 
 
1872
        tmp = Decimal(self)
 
1873
        tmp._int = (0,) + tmp._int
 
1874
        digits += 1
 
1875
 
 
1876
        if digits < 0:
 
1877
            tmp._exp = -digits + tmp._exp
 
1878
            tmp._int = (0,1)
 
1879
            digits = 1
 
1880
        tmp = tmp._round(digits, rounding, context=context)
 
1881
 
 
1882
        if tmp._int[0] == 0 and len(tmp._int) > 1:
 
1883
            tmp._int = tmp._int[1:]
 
1884
        tmp._exp = exp
 
1885
 
 
1886
        tmp_adjusted = tmp.adjusted()
 
1887
        if tmp and tmp_adjusted < context.Emin:
 
1888
            context._raise_error(Subnormal)
 
1889
        elif tmp and tmp_adjusted > context.Emax:
 
1890
            return context._raise_error(InvalidOperation, 'rescale(a, INF)')
 
1891
        return tmp
 
1892
 
 
1893
    def to_integral(self, rounding=None, context=None):
 
1894
        """Rounds to the nearest integer, without raising inexact, rounded."""
 
1895
        if self._is_special:
 
1896
            ans = self._check_nans(context=context)
 
1897
            if ans:
 
1898
                return ans
 
1899
        if self._exp >= 0:
 
1900
            return self
 
1901
        if context is None:
 
1902
            context = getcontext()
 
1903
        flags = context._ignore_flags(Rounded, Inexact)
 
1904
        ans = self._rescale(0, rounding, context=context)
 
1905
        context._regard_flags(flags)
 
1906
        return ans
 
1907
 
 
1908
    def sqrt(self, context=None):
 
1909
        """Return the square root of self.
 
1910
 
 
1911
        Uses a converging algorithm (Xn+1 = 0.5*(Xn + self / Xn))
 
1912
        Should quadratically approach the right answer.
 
1913
        """
 
1914
        if self._is_special:
 
1915
            ans = self._check_nans(context=context)
 
1916
            if ans:
 
1917
                return ans
 
1918
 
 
1919
            if self._isinfinity() and self._sign == 0:
 
1920
                return Decimal(self)
 
1921
 
 
1922
        if not self:
 
1923
            #exponent = self._exp / 2, using round_down.
 
1924
            #if self._exp < 0:
 
1925
            #    exp = (self._exp+1) // 2
 
1926
            #else:
 
1927
            exp = (self._exp) // 2
 
1928
            if self._sign == 1:
 
1929
                #sqrt(-0) = -0
 
1930
                return Decimal( (1, (0,), exp))
 
1931
            else:
 
1932
                return Decimal( (0, (0,), exp))
 
1933
 
 
1934
        if context is None:
 
1935
            context = getcontext()
 
1936
 
 
1937
        if self._sign == 1:
 
1938
            return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
 
1939
 
 
1940
        tmp = Decimal(self)
 
1941
 
 
1942
        expadd = tmp._exp // 2
 
1943
        if tmp._exp & 1:
 
1944
            tmp._int += (0,)
 
1945
            tmp._exp = 0
 
1946
        else:
 
1947
            tmp._exp = 0
 
1948
 
 
1949
        context = context._shallow_copy()
 
1950
        flags = context._ignore_all_flags()
 
1951
        firstprec = context.prec
 
1952
        context.prec = 3
 
1953
        if tmp.adjusted() & 1 == 0:
 
1954
            ans = Decimal( (0, (8,1,9), tmp.adjusted()  - 2) )
 
1955
            ans = ans.__add__(tmp.__mul__(Decimal((0, (2,5,9), -2)),
 
1956
                                          context=context), context=context)
 
1957
            ans._exp -= 1 + tmp.adjusted() // 2
 
1958
        else:
 
1959
            ans = Decimal( (0, (2,5,9), tmp._exp + len(tmp._int)- 3) )
 
1960
            ans = ans.__add__(tmp.__mul__(Decimal((0, (8,1,9), -3)),
 
1961
                                          context=context), context=context)
 
1962
            ans._exp -= 1 + tmp.adjusted()  // 2
 
1963
 
 
1964
        #ans is now a linear approximation.
 
1965
 
 
1966
        Emax, Emin = context.Emax, context.Emin
 
1967
        context.Emax, context.Emin = DefaultContext.Emax, DefaultContext.Emin
 
1968
 
 
1969
        half = Decimal('0.5')
 
1970
 
 
1971
        maxp = firstprec + 2
 
1972
        rounding = context._set_rounding(ROUND_HALF_EVEN)
 
1973
        while 1:
 
1974
            context.prec = min(2*context.prec - 2, maxp)
 
1975
            ans = half.__mul__(ans.__add__(tmp.__div__(ans, context=context),
 
1976
                                           context=context), context=context)
 
1977
            if context.prec == maxp:
 
1978
                break
 
1979
 
 
1980
        #round to the answer's precision-- the only error can be 1 ulp.
 
1981
        context.prec = firstprec
 
1982
        prevexp = ans.adjusted()
 
1983
        ans = ans._round(context=context)
 
1984
 
 
1985
        #Now, check if the other last digits are better.
 
1986
        context.prec = firstprec + 1
 
1987
        # In case we rounded up another digit and we should actually go lower.
 
1988
        if prevexp != ans.adjusted():
 
1989
            ans._int += (0,)
 
1990
            ans._exp -= 1
 
1991
 
 
1992
 
 
1993
        lower = ans.__sub__(Decimal((0, (5,), ans._exp-1)), context=context)
 
1994
        context._set_rounding(ROUND_UP)
 
1995
        if lower.__mul__(lower, context=context) > (tmp):
 
1996
            ans = ans.__sub__(Decimal((0, (1,), ans._exp)), context=context)
 
1997
 
 
1998
        else:
 
1999
            upper = ans.__add__(Decimal((0, (5,), ans._exp-1)),context=context)
 
2000
            context._set_rounding(ROUND_DOWN)
 
2001
            if upper.__mul__(upper, context=context) < tmp:
 
2002
                ans = ans.__add__(Decimal((0, (1,), ans._exp)),context=context)
 
2003
 
 
2004
        ans._exp += expadd
 
2005
 
 
2006
        context.prec = firstprec
 
2007
        context.rounding = rounding
 
2008
        ans = ans._fix(context)
 
2009
 
 
2010
        rounding = context._set_rounding_decision(NEVER_ROUND)
 
2011
        if not ans.__mul__(ans, context=context) == self:
 
2012
            # Only rounded/inexact if here.
 
2013
            context._regard_flags(flags)
 
2014
            context._raise_error(Rounded)
 
2015
            context._raise_error(Inexact)
 
2016
        else:
 
2017
            #Exact answer, so let's set the exponent right.
 
2018
            #if self._exp < 0:
 
2019
            #    exp = (self._exp +1)// 2
 
2020
            #else:
 
2021
            exp = self._exp // 2
 
2022
            context.prec += ans._exp - exp
 
2023
            ans = ans._rescale(exp, context=context)
 
2024
            context.prec = firstprec
 
2025
            context._regard_flags(flags)
 
2026
        context.Emax, context.Emin = Emax, Emin
 
2027
 
 
2028
        return ans._fix(context)
 
2029
 
 
2030
    def max(self, other, context=None):
 
2031
        """Returns the larger value.
 
2032
 
 
2033
        like max(self, other) except if one is not a number, returns
 
2034
        NaN (and signals if one is sNaN).  Also rounds.
 
2035
        """
 
2036
        other = _convert_other(other)
 
2037
        if other is NotImplemented:
 
2038
            return other
 
2039
 
 
2040
        if self._is_special or other._is_special:
 
2041
            # if one operand is a quiet NaN and the other is number, then the
 
2042
            # number is always returned
 
2043
            sn = self._isnan()
 
2044
            on = other._isnan()
 
2045
            if sn or on:
 
2046
                if on == 1 and sn != 2:
 
2047
                    return self
 
2048
                if sn == 1 and on != 2:
 
2049
                    return other
 
2050
                return self._check_nans(other, context)
 
2051
 
 
2052
        ans = self
 
2053
        c = self.__cmp__(other)
 
2054
        if c == 0:
 
2055
            # if both operands are finite and equal in numerical value
 
2056
            # then an ordering is applied:
 
2057
            #
 
2058
            # if the signs differ then max returns the operand with the
 
2059
            # positive sign and min returns the operand with the negative sign
 
2060
            #
 
2061
            # if the signs are the same then the exponent is used to select
 
2062
            # the result.
 
2063
            if self._sign != other._sign:
 
2064
                if self._sign:
 
2065
                    ans = other
 
2066
            elif self._exp < other._exp and not self._sign:
 
2067
                ans = other
 
2068
            elif self._exp > other._exp and self._sign:
 
2069
                ans = other
 
2070
        elif c == -1:
 
2071
            ans = other
 
2072
 
 
2073
        if context is None:
 
2074
            context = getcontext()
 
2075
        if context._rounding_decision == ALWAYS_ROUND:
 
2076
            return ans._fix(context)
 
2077
        return ans
 
2078
 
 
2079
    def min(self, other, context=None):
 
2080
        """Returns the smaller value.
 
2081
 
 
2082
        like min(self, other) except if one is not a number, returns
 
2083
        NaN (and signals if one is sNaN).  Also rounds.
 
2084
        """
 
2085
        other = _convert_other(other)
 
2086
        if other is NotImplemented:
 
2087
            return other
 
2088
 
 
2089
        if self._is_special or other._is_special:
 
2090
            # if one operand is a quiet NaN and the other is number, then the
 
2091
            # number is always returned
 
2092
            sn = self._isnan()
 
2093
            on = other._isnan()
 
2094
            if sn or on:
 
2095
                if on == 1 and sn != 2:
 
2096
                    return self
 
2097
                if sn == 1 and on != 2:
 
2098
                    return other
 
2099
                return self._check_nans(other, context)
 
2100
 
 
2101
        ans = self
 
2102
        c = self.__cmp__(other)
 
2103
        if c == 0:
 
2104
            # if both operands are finite and equal in numerical value
 
2105
            # then an ordering is applied:
 
2106
            #
 
2107
            # if the signs differ then max returns the operand with the
 
2108
            # positive sign and min returns the operand with the negative sign
 
2109
            #
 
2110
            # if the signs are the same then the exponent is used to select
 
2111
            # the result.
 
2112
            if self._sign != other._sign:
 
2113
                if other._sign:
 
2114
                    ans = other
 
2115
            elif self._exp > other._exp and not self._sign:
 
2116
                ans = other
 
2117
            elif self._exp < other._exp and self._sign:
 
2118
                ans = other
 
2119
        elif c == 1:
 
2120
            ans = other
 
2121
 
 
2122
        if context is None:
 
2123
            context = getcontext()
 
2124
        if context._rounding_decision == ALWAYS_ROUND:
 
2125
            return ans._fix(context)
 
2126
        return ans
 
2127
 
 
2128
    def _isinteger(self):
 
2129
        """Returns whether self is an integer"""
 
2130
        if self._exp >= 0:
 
2131
            return True
 
2132
        rest = self._int[self._exp:]
 
2133
        return rest == (0,)*len(rest)
 
2134
 
 
2135
    def _iseven(self):
 
2136
        """Returns 1 if self is even.  Assumes self is an integer."""
 
2137
        if self._exp > 0:
 
2138
            return 1
 
2139
        return self._int[-1+self._exp] & 1 == 0
 
2140
 
 
2141
    def adjusted(self):
 
2142
        """Return the adjusted exponent of self"""
 
2143
        try:
 
2144
            return self._exp + len(self._int) - 1
 
2145
        #If NaN or Infinity, self._exp is string
 
2146
        except TypeError:
 
2147
            return 0
 
2148
 
 
2149
    # support for pickling, copy, and deepcopy
 
2150
    def __reduce__(self):
 
2151
        return (self.__class__, (str(self),))
 
2152
 
 
2153
    def __copy__(self):
 
2154
        if type(self) == Decimal:
 
2155
            return self     # I'm immutable; therefore I am my own clone
 
2156
        return self.__class__(str(self))
 
2157
 
 
2158
    def __deepcopy__(self, memo):
 
2159
        if type(self) == Decimal:
 
2160
            return self     # My components are also immutable
 
2161
        return self.__class__(str(self))
 
2162
 
 
2163
##### Context class ###########################################
 
2164
 
 
2165
 
 
2166
# get rounding method function:
 
2167
rounding_functions = [name for name in Decimal.__dict__.keys() if name.startswith('_round_')]
 
2168
for name in rounding_functions:
 
2169
    #name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
 
2170
    globalname = name[1:].upper()
 
2171
    val = globals()[globalname]
 
2172
    Decimal._pick_rounding_function[val] = name
 
2173
 
 
2174
del name, val, globalname, rounding_functions
 
2175
 
 
2176
class Context(object):
 
2177
    """Contains the context for a Decimal instance.
 
2178
 
 
2179
    Contains:
 
2180
    prec - precision (for use in rounding, division, square roots..)
 
2181
    rounding - rounding type. (how you round)
 
2182
    _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round?
 
2183
    traps - If traps[exception] = 1, then the exception is
 
2184
                    raised when it is caused.  Otherwise, a value is
 
2185
                    substituted in.
 
2186
    flags  - When an exception is caused, flags[exception] is incremented.
 
2187
             (Whether or not the trap_enabler is set)
 
2188
             Should be reset by user of Decimal instance.
 
2189
    Emin -   Minimum exponent
 
2190
    Emax -   Maximum exponent
 
2191
    capitals -      If 1, 1*10^1 is printed as 1E+1.
 
2192
                    If 0, printed as 1e1
 
2193
    _clamp - If 1, change exponents if too high (Default 0)
 
2194
    """
 
2195
 
 
2196
    def __init__(self, prec=None, rounding=None,
 
2197
                 traps=None, flags=None,
 
2198
                 _rounding_decision=None,
 
2199
                 Emin=None, Emax=None,
 
2200
                 capitals=None, _clamp=0,
 
2201
                 _ignored_flags=None):
 
2202
        if flags is None:
 
2203
            flags = []
 
2204
        if _ignored_flags is None:
 
2205
            _ignored_flags = []
 
2206
        if not isinstance(flags, dict):
 
2207
            flags = dict([(s,s in flags) for s in _signals])
 
2208
            del s
 
2209
        if traps is not None and not isinstance(traps, dict):
 
2210
            traps = dict([(s,s in traps) for s in _signals])
 
2211
            del s
 
2212
        for name, val in locals().items():
 
2213
            if val is None:
 
2214
                setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
 
2215
            else:
 
2216
                setattr(self, name, val)
 
2217
        del self.self
 
2218
 
 
2219
    def __repr__(self):
 
2220
        """Show the current context."""
 
2221
        s = []
 
2222
        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' % vars(self))
 
2223
        s.append('flags=[' + ', '.join([f.__name__ for f, v in self.flags.items() if v]) + ']')
 
2224
        s.append('traps=[' + ', '.join([t.__name__ for t, v in self.traps.items() if v]) + ']')
 
2225
        return ', '.join(s) + ')'
 
2226
 
 
2227
    def clear_flags(self):
 
2228
        """Reset all flags to zero"""
 
2229
        for flag in self.flags:
 
2230
            self.flags[flag] = 0
 
2231
 
 
2232
    def _shallow_copy(self):
 
2233
        """Returns a shallow copy from self."""
 
2234
        nc = Context(self.prec, self.rounding, self.traps, self.flags,
 
2235
                         self._rounding_decision, self.Emin, self.Emax,
 
2236
                         self.capitals, self._clamp, self._ignored_flags)
 
2237
        return nc
 
2238
 
 
2239
    def copy(self):
 
2240
        """Returns a deep copy from self."""
 
2241
        nc = Context(self.prec, self.rounding, self.traps.copy(), self.flags.copy(),
 
2242
                         self._rounding_decision, self.Emin, self.Emax,
 
2243
                         self.capitals, self._clamp, self._ignored_flags)
 
2244
        return nc
 
2245
    __copy__ = copy
 
2246
 
 
2247
    def _raise_error(self, condition, explanation = None, *args):
 
2248
        """Handles an error
 
2249
 
 
2250
        If the flag is in _ignored_flags, returns the default response.
 
2251
        Otherwise, it increments the flag, then, if the corresponding
 
2252
        trap_enabler is set, it reaises the exception.  Otherwise, it returns
 
2253
        the default value after incrementing the flag.
 
2254
        """
 
2255
        error = _condition_map.get(condition, condition)
 
2256
        if error in self._ignored_flags:
 
2257
            #Don't touch the flag
 
2258
            return error().handle(self, *args)
 
2259
 
 
2260
        self.flags[error] += 1
 
2261
        if not self.traps[error]:
 
2262
            #The errors define how to handle themselves.
 
2263
            return condition().handle(self, *args)
 
2264
 
 
2265
        # Errors should only be risked on copies of the context
 
2266
        #self._ignored_flags = []
 
2267
        raise error, explanation
 
2268
 
 
2269
    def _ignore_all_flags(self):
 
2270
        """Ignore all flags, if they are raised"""
 
2271
        return self._ignore_flags(*_signals)
 
2272
 
 
2273
    def _ignore_flags(self, *flags):
 
2274
        """Ignore the flags, if they are raised"""
 
2275
        # Do not mutate-- This way, copies of a context leave the original
 
2276
        # alone.
 
2277
        self._ignored_flags = (self._ignored_flags + list(flags))
 
2278
        return list(flags)
 
2279
 
 
2280
    def _regard_flags(self, *flags):
 
2281
        """Stop ignoring the flags, if they are raised"""
 
2282
        if flags and isinstance(flags[0], (tuple,list)):
 
2283
            flags = flags[0]
 
2284
        for flag in flags:
 
2285
            self._ignored_flags.remove(flag)
 
2286
 
 
2287
    def __hash__(self):
 
2288
        """A Context cannot be hashed."""
 
2289
        # We inherit object.__hash__, so we must deny this explicitly
 
2290
        raise TypeError, "Cannot hash a Context."
 
2291
 
 
2292
    def Etiny(self):
 
2293
        """Returns Etiny (= Emin - prec + 1)"""
 
2294
        return int(self.Emin - self.prec + 1)
 
2295
 
 
2296
    def Etop(self):
 
2297
        """Returns maximum exponent (= Emax - prec + 1)"""
 
2298
        return int(self.Emax - self.prec + 1)
 
2299
 
 
2300
    def _set_rounding_decision(self, type):
 
2301
        """Sets the rounding decision.
 
2302
 
 
2303
        Sets the rounding decision, and returns the current (previous)
 
2304
        rounding decision.  Often used like:
 
2305
 
 
2306
        context = context._shallow_copy()
 
2307
        # That so you don't change the calling context
 
2308
        # if an error occurs in the middle (say DivisionImpossible is raised).
 
2309
 
 
2310
        rounding = context._set_rounding_decision(NEVER_ROUND)
 
2311
        instance = instance / Decimal(2)
 
2312
        context._set_rounding_decision(rounding)
 
2313
 
 
2314
        This will make it not round for that operation.
 
2315
        """
 
2316
 
 
2317
        rounding = self._rounding_decision
 
2318
        self._rounding_decision = type
 
2319
        return rounding
 
2320
 
 
2321
    def _set_rounding(self, type):
 
2322
        """Sets the rounding type.
 
2323
 
 
2324
        Sets the rounding type, and returns the current (previous)
 
2325
        rounding type.  Often used like:
 
2326
 
 
2327
        context = context.copy()
 
2328
        # so you don't change the calling context
 
2329
        # if an error occurs in the middle.
 
2330
        rounding = context._set_rounding(ROUND_UP)
 
2331
        val = self.__sub__(other, context=context)
 
2332
        context._set_rounding(rounding)
 
2333
 
 
2334
        This will make it round up for that operation.
 
2335
        """
 
2336
        rounding = self.rounding
 
2337
        self.rounding= type
 
2338
        return rounding
 
2339
 
 
2340
    def create_decimal(self, num='0'):
 
2341
        """Creates a new Decimal instance but using self as context."""
 
2342
        d = Decimal(num, context=self)
 
2343
        return d._fix(self)
 
2344
 
 
2345
    #Methods
 
2346
    def abs(self, a):
 
2347
        """Returns the absolute value of the operand.
 
2348
 
 
2349
        If the operand is negative, the result is the same as using the minus
 
2350
        operation on the operand. Otherwise, the result is the same as using
 
2351
        the plus operation on the operand.
 
2352
 
 
2353
        >>> ExtendedContext.abs(Decimal('2.1'))
 
2354
        Decimal("2.1")
 
2355
        >>> ExtendedContext.abs(Decimal('-100'))
 
2356
        Decimal("100")
 
2357
        >>> ExtendedContext.abs(Decimal('101.5'))
 
2358
        Decimal("101.5")
 
2359
        >>> ExtendedContext.abs(Decimal('-101.5'))
 
2360
        Decimal("101.5")
 
2361
        """
 
2362
        return a.__abs__(context=self)
 
2363
 
 
2364
    def add(self, a, b):
 
2365
        """Return the sum of the two operands.
 
2366
 
 
2367
        >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
 
2368
        Decimal("19.00")
 
2369
        >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
 
2370
        Decimal("1.02E+4")
 
2371
        """
 
2372
        return a.__add__(b, context=self)
 
2373
 
 
2374
    def _apply(self, a):
 
2375
        return str(a._fix(self))
 
2376
 
 
2377
    def compare(self, a, b):
 
2378
        """Compares values numerically.
 
2379
 
 
2380
        If the signs of the operands differ, a value representing each operand
 
2381
        ('-1' if the operand is less than zero, '0' if the operand is zero or
 
2382
        negative zero, or '1' if the operand is greater than zero) is used in
 
2383
        place of that operand for the comparison instead of the actual
 
2384
        operand.
 
2385
 
 
2386
        The comparison is then effected by subtracting the second operand from
 
2387
        the first and then returning a value according to the result of the
 
2388
        subtraction: '-1' if the result is less than zero, '0' if the result is
 
2389
        zero or negative zero, or '1' if the result is greater than zero.
 
2390
 
 
2391
        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
 
2392
        Decimal("-1")
 
2393
        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
 
2394
        Decimal("0")
 
2395
        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
 
2396
        Decimal("0")
 
2397
        >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
 
2398
        Decimal("1")
 
2399
        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
 
2400
        Decimal("1")
 
2401
        >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
 
2402
        Decimal("-1")
 
2403
        """
 
2404
        return a.compare(b, context=self)
 
2405
 
 
2406
    def divide(self, a, b):
 
2407
        """Decimal division in a specified context.
 
2408
 
 
2409
        >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
 
2410
        Decimal("0.333333333")
 
2411
        >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
 
2412
        Decimal("0.666666667")
 
2413
        >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
 
2414
        Decimal("2.5")
 
2415
        >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
 
2416
        Decimal("0.1")
 
2417
        >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
 
2418
        Decimal("1")
 
2419
        >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
 
2420
        Decimal("4.00")
 
2421
        >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
 
2422
        Decimal("1.20")
 
2423
        >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
 
2424
        Decimal("10")
 
2425
        >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
 
2426
        Decimal("1000")
 
2427
        >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
 
2428
        Decimal("1.20E+6")
 
2429
        """
 
2430
        return a.__div__(b, context=self)
 
2431
 
 
2432
    def divide_int(self, a, b):
 
2433
        """Divides two numbers and returns the integer part of the result.
 
2434
 
 
2435
        >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
 
2436
        Decimal("0")
 
2437
        >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
 
2438
        Decimal("3")
 
2439
        >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
 
2440
        Decimal("3")
 
2441
        """
 
2442
        return a.__floordiv__(b, context=self)
 
2443
 
 
2444
    def divmod(self, a, b):
 
2445
        return a.__divmod__(b, context=self)
 
2446
 
 
2447
    def max(self, a,b):
 
2448
        """max compares two values numerically and returns the maximum.
 
2449
 
 
2450
        If either operand is a NaN then the general rules apply.
 
2451
        Otherwise, the operands are compared as as though by the compare
 
2452
        operation. If they are numerically equal then the left-hand operand
 
2453
        is chosen as the result. Otherwise the maximum (closer to positive
 
2454
        infinity) of the two operands is chosen as the result.
 
2455
 
 
2456
        >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
 
2457
        Decimal("3")
 
2458
        >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
 
2459
        Decimal("3")
 
2460
        >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
 
2461
        Decimal("1")
 
2462
        >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
 
2463
        Decimal("7")
 
2464
        """
 
2465
        return a.max(b, context=self)
 
2466
 
 
2467
    def min(self, a,b):
 
2468
        """min compares two values numerically and returns the minimum.
 
2469
 
 
2470
        If either operand is a NaN then the general rules apply.
 
2471
        Otherwise, the operands are compared as as though by the compare
 
2472
        operation. If they are numerically equal then the left-hand operand
 
2473
        is chosen as the result. Otherwise the minimum (closer to negative
 
2474
        infinity) of the two operands is chosen as the result.
 
2475
 
 
2476
        >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
 
2477
        Decimal("2")
 
2478
        >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
 
2479
        Decimal("-10")
 
2480
        >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
 
2481
        Decimal("1.0")
 
2482
        >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
 
2483
        Decimal("7")
 
2484
        """
 
2485
        return a.min(b, context=self)
 
2486
 
 
2487
    def minus(self, a):
 
2488
        """Minus corresponds to unary prefix minus in Python.
 
2489
 
 
2490
        The operation is evaluated using the same rules as subtract; the
 
2491
        operation minus(a) is calculated as subtract('0', a) where the '0'
 
2492
        has the same exponent as the operand.
 
2493
 
 
2494
        >>> ExtendedContext.minus(Decimal('1.3'))
 
2495
        Decimal("-1.3")
 
2496
        >>> ExtendedContext.minus(Decimal('-1.3'))
 
2497
        Decimal("1.3")
 
2498
        """
 
2499
        return a.__neg__(context=self)
 
2500
 
 
2501
    def multiply(self, a, b):
 
2502
        """multiply multiplies two operands.
 
2503
 
 
2504
        If either operand is a special value then the general rules apply.
 
2505
        Otherwise, the operands are multiplied together ('long multiplication'),
 
2506
        resulting in a number which may be as long as the sum of the lengths
 
2507
        of the two operands.
 
2508
 
 
2509
        >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
 
2510
        Decimal("3.60")
 
2511
        >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
 
2512
        Decimal("21")
 
2513
        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
 
2514
        Decimal("0.72")
 
2515
        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
 
2516
        Decimal("-0.0")
 
2517
        >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
 
2518
        Decimal("4.28135971E+11")
 
2519
        """
 
2520
        return a.__mul__(b, context=self)
 
2521
 
 
2522
    def normalize(self, a):
 
2523
        """normalize reduces an operand to its simplest form.
 
2524
 
 
2525
        Essentially a plus operation with all trailing zeros removed from the
 
2526
        result.
 
2527
 
 
2528
        >>> ExtendedContext.normalize(Decimal('2.1'))
 
2529
        Decimal("2.1")
 
2530
        >>> ExtendedContext.normalize(Decimal('-2.0'))
 
2531
        Decimal("-2")
 
2532
        >>> ExtendedContext.normalize(Decimal('1.200'))
 
2533
        Decimal("1.2")
 
2534
        >>> ExtendedContext.normalize(Decimal('-120'))
 
2535
        Decimal("-1.2E+2")
 
2536
        >>> ExtendedContext.normalize(Decimal('120.00'))
 
2537
        Decimal("1.2E+2")
 
2538
        >>> ExtendedContext.normalize(Decimal('0.00'))
 
2539
        Decimal("0")
 
2540
        """
 
2541
        return a.normalize(context=self)
 
2542
 
 
2543
    def plus(self, a):
 
2544
        """Plus corresponds to unary prefix plus in Python.
 
2545
 
 
2546
        The operation is evaluated using the same rules as add; the
 
2547
        operation plus(a) is calculated as add('0', a) where the '0'
 
2548
        has the same exponent as the operand.
 
2549
 
 
2550
        >>> ExtendedContext.plus(Decimal('1.3'))
 
2551
        Decimal("1.3")
 
2552
        >>> ExtendedContext.plus(Decimal('-1.3'))
 
2553
        Decimal("-1.3")
 
2554
        """
 
2555
        return a.__pos__(context=self)
 
2556
 
 
2557
    def power(self, a, b, modulo=None):
 
2558
        """Raises a to the power of b, to modulo if given.
 
2559
 
 
2560
        The right-hand operand must be a whole number whose integer part (after
 
2561
        any exponent has been applied) has no more than 9 digits and whose
 
2562
        fractional part (if any) is all zeros before any rounding. The operand
 
2563
        may be positive, negative, or zero; if negative, the absolute value of
 
2564
        the power is used, and the left-hand operand is inverted (divided into
 
2565
        1) before use.
 
2566
 
 
2567
        If the increased precision needed for the intermediate calculations
 
2568
        exceeds the capabilities of the implementation then an Invalid operation
 
2569
        condition is raised.
 
2570
 
 
2571
        If, when raising to a negative power, an underflow occurs during the
 
2572
        division into 1, the operation is not halted at that point but
 
2573
        continues.
 
2574
 
 
2575
        >>> ExtendedContext.power(Decimal('2'), Decimal('3'))
 
2576
        Decimal("8")
 
2577
        >>> ExtendedContext.power(Decimal('2'), Decimal('-3'))
 
2578
        Decimal("0.125")
 
2579
        >>> ExtendedContext.power(Decimal('1.7'), Decimal('8'))
 
2580
        Decimal("69.7575744")
 
2581
        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-2'))
 
2582
        Decimal("0")
 
2583
        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-1'))
 
2584
        Decimal("0")
 
2585
        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('0'))
 
2586
        Decimal("1")
 
2587
        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('1'))
 
2588
        Decimal("Infinity")
 
2589
        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('2'))
 
2590
        Decimal("Infinity")
 
2591
        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-2'))
 
2592
        Decimal("0")
 
2593
        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-1'))
 
2594
        Decimal("-0")
 
2595
        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('0'))
 
2596
        Decimal("1")
 
2597
        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('1'))
 
2598
        Decimal("-Infinity")
 
2599
        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('2'))
 
2600
        Decimal("Infinity")
 
2601
        >>> ExtendedContext.power(Decimal('0'), Decimal('0'))
 
2602
        Decimal("NaN")
 
2603
        """
 
2604
        return a.__pow__(b, modulo, context=self)
 
2605
 
 
2606
    def quantize(self, a, b):
 
2607
        """Returns a value equal to 'a' (rounded) and having the exponent of 'b'.
 
2608
 
 
2609
        The coefficient of the result is derived from that of the left-hand
 
2610
        operand. It may be rounded using the current rounding setting (if the
 
2611
        exponent is being increased), multiplied by a positive power of ten (if
 
2612
        the exponent is being decreased), or is unchanged (if the exponent is
 
2613
        already equal to that of the right-hand operand).
 
2614
 
 
2615
        Unlike other operations, if the length of the coefficient after the
 
2616
        quantize operation would be greater than precision then an Invalid
 
2617
        operation condition is raised. This guarantees that, unless there is an
 
2618
        error condition, the exponent of the result of a quantize is always
 
2619
        equal to that of the right-hand operand.
 
2620
 
 
2621
        Also unlike other operations, quantize will never raise Underflow, even
 
2622
        if the result is subnormal and inexact.
 
2623
 
 
2624
        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
 
2625
        Decimal("2.170")
 
2626
        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
 
2627
        Decimal("2.17")
 
2628
        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
 
2629
        Decimal("2.2")
 
2630
        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
 
2631
        Decimal("2")
 
2632
        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
 
2633
        Decimal("0E+1")
 
2634
        >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
 
2635
        Decimal("-Infinity")
 
2636
        >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
 
2637
        Decimal("NaN")
 
2638
        >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
 
2639
        Decimal("-0")
 
2640
        >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
 
2641
        Decimal("-0E+5")
 
2642
        >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
 
2643
        Decimal("NaN")
 
2644
        >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
 
2645
        Decimal("NaN")
 
2646
        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
 
2647
        Decimal("217.0")
 
2648
        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
 
2649
        Decimal("217")
 
2650
        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
 
2651
        Decimal("2.2E+2")
 
2652
        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
 
2653
        Decimal("2E+2")
 
2654
        """
 
2655
        return a.quantize(b, context=self)
 
2656
 
 
2657
    def remainder(self, a, b):
 
2658
        """Returns the remainder from integer division.
 
2659
 
 
2660
        The result is the residue of the dividend after the operation of
 
2661
        calculating integer division as described for divide-integer, rounded to
 
2662
        precision digits if necessary. The sign of the result, if non-zero, is
 
2663
        the same as that of the original dividend.
 
2664
 
 
2665
        This operation will fail under the same conditions as integer division
 
2666
        (that is, if integer division on the same two operands would fail, the
 
2667
        remainder cannot be calculated).
 
2668
 
 
2669
        >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
 
2670
        Decimal("2.1")
 
2671
        >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
 
2672
        Decimal("1")
 
2673
        >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
 
2674
        Decimal("-1")
 
2675
        >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
 
2676
        Decimal("0.2")
 
2677
        >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
 
2678
        Decimal("0.1")
 
2679
        >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
 
2680
        Decimal("1.0")
 
2681
        """
 
2682
        return a.__mod__(b, context=self)
 
2683
 
 
2684
    def remainder_near(self, a, b):
 
2685
        """Returns to be "a - b * n", where n is the integer nearest the exact
 
2686
        value of "x / b" (if two integers are equally near then the even one
 
2687
        is chosen). If the result is equal to 0 then its sign will be the
 
2688
        sign of a.
 
2689
 
 
2690
        This operation will fail under the same conditions as integer division
 
2691
        (that is, if integer division on the same two operands would fail, the
 
2692
        remainder cannot be calculated).
 
2693
 
 
2694
        >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
 
2695
        Decimal("-0.9")
 
2696
        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
 
2697
        Decimal("-2")
 
2698
        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
 
2699
        Decimal("1")
 
2700
        >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
 
2701
        Decimal("-1")
 
2702
        >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
 
2703
        Decimal("0.2")
 
2704
        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
 
2705
        Decimal("0.1")
 
2706
        >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
 
2707
        Decimal("-0.3")
 
2708
        """
 
2709
        return a.remainder_near(b, context=self)
 
2710
 
 
2711
    def same_quantum(self, a, b):
 
2712
        """Returns True if the two operands have the same exponent.
 
2713
 
 
2714
        The result is never affected by either the sign or the coefficient of
 
2715
        either operand.
 
2716
 
 
2717
        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
 
2718
        False
 
2719
        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
 
2720
        True
 
2721
        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
 
2722
        False
 
2723
        >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
 
2724
        True
 
2725
        """
 
2726
        return a.same_quantum(b)
 
2727
 
 
2728
    def sqrt(self, a):
 
2729
        """Returns the square root of a non-negative number to context precision.
 
2730
 
 
2731
        If the result must be inexact, it is rounded using the round-half-even
 
2732
        algorithm.
 
2733
 
 
2734
        >>> ExtendedContext.sqrt(Decimal('0'))
 
2735
        Decimal("0")
 
2736
        >>> ExtendedContext.sqrt(Decimal('-0'))
 
2737
        Decimal("-0")
 
2738
        >>> ExtendedContext.sqrt(Decimal('0.39'))
 
2739
        Decimal("0.624499800")
 
2740
        >>> ExtendedContext.sqrt(Decimal('100'))
 
2741
        Decimal("10")
 
2742
        >>> ExtendedContext.sqrt(Decimal('1'))
 
2743
        Decimal("1")
 
2744
        >>> ExtendedContext.sqrt(Decimal('1.0'))
 
2745
        Decimal("1.0")
 
2746
        >>> ExtendedContext.sqrt(Decimal('1.00'))
 
2747
        Decimal("1.0")
 
2748
        >>> ExtendedContext.sqrt(Decimal('7'))
 
2749
        Decimal("2.64575131")
 
2750
        >>> ExtendedContext.sqrt(Decimal('10'))
 
2751
        Decimal("3.16227766")
 
2752
        >>> ExtendedContext.prec
 
2753
        9
 
2754
        """
 
2755
        return a.sqrt(context=self)
 
2756
 
 
2757
    def subtract(self, a, b):
 
2758
        """Return the difference between the two operands.
 
2759
 
 
2760
        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
 
2761
        Decimal("0.23")
 
2762
        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
 
2763
        Decimal("0.00")
 
2764
        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
 
2765
        Decimal("-0.77")
 
2766
        """
 
2767
        return a.__sub__(b, context=self)
 
2768
 
 
2769
    def to_eng_string(self, a):
 
2770
        """Converts a number to a string, using scientific notation.
 
2771
 
 
2772
        The operation is not affected by the context.
 
2773
        """
 
2774
        return a.to_eng_string(context=self)
 
2775
 
 
2776
    def to_sci_string(self, a):
 
2777
        """Converts a number to a string, using scientific notation.
 
2778
 
 
2779
        The operation is not affected by the context.
 
2780
        """
 
2781
        return a.__str__(context=self)
 
2782
 
 
2783
    def to_integral(self, a):
 
2784
        """Rounds to an integer.
 
2785
 
 
2786
        When the operand has a negative exponent, the result is the same
 
2787
        as using the quantize() operation using the given operand as the
 
2788
        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
 
2789
        of the operand as the precision setting, except that no flags will
 
2790
        be set. The rounding mode is taken from the context.
 
2791
 
 
2792
        >>> ExtendedContext.to_integral(Decimal('2.1'))
 
2793
        Decimal("2")
 
2794
        >>> ExtendedContext.to_integral(Decimal('100'))
 
2795
        Decimal("100")
 
2796
        >>> ExtendedContext.to_integral(Decimal('100.0'))
 
2797
        Decimal("100")
 
2798
        >>> ExtendedContext.to_integral(Decimal('101.5'))
 
2799
        Decimal("102")
 
2800
        >>> ExtendedContext.to_integral(Decimal('-101.5'))
 
2801
        Decimal("-102")
 
2802
        >>> ExtendedContext.to_integral(Decimal('10E+5'))
 
2803
        Decimal("1.0E+6")
 
2804
        >>> ExtendedContext.to_integral(Decimal('7.89E+77'))
 
2805
        Decimal("7.89E+77")
 
2806
        >>> ExtendedContext.to_integral(Decimal('-Inf'))
 
2807
        Decimal("-Infinity")
 
2808
        """
 
2809
        return a.to_integral(context=self)
 
2810
 
 
2811
class _WorkRep(object):
 
2812
    __slots__ = ('sign','int','exp')
 
2813
    # sign: 0 or 1
 
2814
    # int:  int or long
 
2815
    # exp:  None, int, or string
 
2816
 
 
2817
    def __init__(self, value=None):
 
2818
        if value is None:
 
2819
            self.sign = None
 
2820
            self.int = 0
 
2821
            self.exp = None
 
2822
        elif isinstance(value, Decimal):
 
2823
            self.sign = value._sign
 
2824
            cum = 0
 
2825
            for digit  in value._int:
 
2826
                cum = cum * 10 + digit
 
2827
            self.int = cum
 
2828
            self.exp = value._exp
 
2829
        else:
 
2830
            # assert isinstance(value, tuple)
 
2831
            self.sign = value[0]
 
2832
            self.int = value[1]
 
2833
            self.exp = value[2]
 
2834
 
 
2835
    def __repr__(self):
 
2836
        return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
 
2837
 
 
2838
    __str__ = __repr__
 
2839
 
 
2840
 
 
2841
 
 
2842
def _normalize(op1, op2, shouldround = 0, prec = 0):
 
2843
    """Normalizes op1, op2 to have the same exp and length of coefficient.
 
2844
 
 
2845
    Done during addition.
 
2846
    """
 
2847
    # Yes, the exponent is a long, but the difference between exponents
 
2848
    # must be an int-- otherwise you'd get a big memory problem.
 
2849
    numdigits = int(op1.exp - op2.exp)
 
2850
    if numdigits < 0:
 
2851
        numdigits = -numdigits
 
2852
        tmp = op2
 
2853
        other = op1
 
2854
    else:
 
2855
        tmp = op1
 
2856
        other = op2
 
2857
 
 
2858
 
 
2859
    if shouldround and numdigits > prec + 1:
 
2860
        # Big difference in exponents - check the adjusted exponents
 
2861
        tmp_len = len(str(tmp.int))
 
2862
        other_len = len(str(other.int))
 
2863
        if numdigits > (other_len + prec + 1 - tmp_len):
 
2864
            # If the difference in adjusted exps is > prec+1, we know
 
2865
            # other is insignificant, so might as well put a 1 after the precision.
 
2866
            # (since this is only for addition.)  Also stops use of massive longs.
 
2867
 
 
2868
            extend = prec + 2 - tmp_len
 
2869
            if extend <= 0:
 
2870
                extend = 1
 
2871
            tmp.int *= 10 ** extend
 
2872
            tmp.exp -= extend
 
2873
            other.int = 1
 
2874
            other.exp = tmp.exp
 
2875
            return op1, op2
 
2876
 
 
2877
    tmp.int *= 10 ** numdigits
 
2878
    tmp.exp -= numdigits
 
2879
    return op1, op2
 
2880
 
 
2881
def _adjust_coefficients(op1, op2):
 
2882
    """Adjust op1, op2 so that op2.int * 10 > op1.int >= op2.int.
 
2883
 
 
2884
    Returns the adjusted op1, op2 as well as the change in op1.exp-op2.exp.
 
2885
 
 
2886
    Used on _WorkRep instances during division.
 
2887
    """
 
2888
    adjust = 0
 
2889
    #If op1 is smaller, make it larger
 
2890
    while op2.int > op1.int:
 
2891
        op1.int *= 10
 
2892
        op1.exp -= 1
 
2893
        adjust += 1
 
2894
 
 
2895
    #If op2 is too small, make it larger
 
2896
    while op1.int >= (10 * op2.int):
 
2897
        op2.int *= 10
 
2898
        op2.exp -= 1
 
2899
        adjust -= 1
 
2900
 
 
2901
    return op1, op2, adjust
 
2902
 
 
2903
##### Helper Functions ########################################
 
2904
 
 
2905
def _convert_other(other):
 
2906
    """Convert other to Decimal.
 
2907
 
 
2908
    Verifies that it's ok to use in an implicit construction.
 
2909
    """
 
2910
    if isinstance(other, Decimal):
 
2911
        return other
 
2912
    if isinstance(other, (int, long)):
 
2913
        return Decimal(other)
 
2914
    return NotImplemented
 
2915
 
 
2916
_infinity_map = {
 
2917
    'inf' : 1,
 
2918
    'infinity' : 1,
 
2919
    '+inf' : 1,
 
2920
    '+infinity' : 1,
 
2921
    '-inf' : -1,
 
2922
    '-infinity' : -1
 
2923
}
 
2924
 
 
2925
def _isinfinity(num):
 
2926
    """Determines whether a string or float is infinity.
 
2927
 
 
2928
    +1 for negative infinity; 0 for finite ; +1 for positive infinity
 
2929
    """
 
2930
    num = str(num).lower()
 
2931
    return _infinity_map.get(num, 0)
 
2932
 
 
2933
def _isnan(num):
 
2934
    """Determines whether a string or float is NaN
 
2935
 
 
2936
    (1, sign, diagnostic info as string) => NaN
 
2937
    (2, sign, diagnostic info as string) => sNaN
 
2938
    0 => not a NaN
 
2939
    """
 
2940
    num = str(num).lower()
 
2941
    if not num:
 
2942
        return 0
 
2943
 
 
2944
    #get the sign, get rid of trailing [+-]
 
2945
    sign = 0
 
2946
    if num[0] == '+':
 
2947
        num = num[1:]
 
2948
    elif num[0] == '-':  #elif avoids '+-nan'
 
2949
        num = num[1:]
 
2950
        sign = 1
 
2951
 
 
2952
    if num.startswith('nan'):
 
2953
        if len(num) > 3 and not num[3:].isdigit(): #diagnostic info
 
2954
            return 0
 
2955
        return (1, sign, num[3:].lstrip('0'))
 
2956
    if num.startswith('snan'):
 
2957
        if len(num) > 4 and not num[4:].isdigit():
 
2958
            return 0
 
2959
        return (2, sign, num[4:].lstrip('0'))
 
2960
    return 0
 
2961
 
 
2962
 
 
2963
##### Setup Specific Contexts ################################
 
2964
 
 
2965
# The default context prototype used by Context()
 
2966
# Is mutable, so that new contexts can have different default values
 
2967
 
 
2968
DefaultContext = Context(
 
2969
        prec=28, rounding=ROUND_HALF_EVEN,
 
2970
        traps=[DivisionByZero, Overflow, InvalidOperation],
 
2971
        flags=[],
 
2972
        _rounding_decision=ALWAYS_ROUND,
 
2973
        Emax=999999999,
 
2974
        Emin=-999999999,
 
2975
        capitals=1
 
2976
)
 
2977
 
 
2978
# Pre-made alternate contexts offered by the specification
 
2979
# Don't change these; the user should be able to select these
 
2980
# contexts and be able to reproduce results from other implementations
 
2981
# of the spec.
 
2982
 
 
2983
BasicContext = Context(
 
2984
        prec=9, rounding=ROUND_HALF_UP,
 
2985
        traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
 
2986
        flags=[],
 
2987
)
 
2988
 
 
2989
ExtendedContext = Context(
 
2990
        prec=9, rounding=ROUND_HALF_EVEN,
 
2991
        traps=[],
 
2992
        flags=[],
 
2993
)
 
2994
 
 
2995
 
 
2996
##### Useful Constants (internal use only) ####################
 
2997
 
 
2998
#Reusable defaults
 
2999
Inf = Decimal('Inf')
 
3000
negInf = Decimal('-Inf')
 
3001
 
 
3002
#Infsign[sign] is infinity w/ that sign
 
3003
Infsign = (Inf, negInf)
 
3004
 
 
3005
NaN = Decimal('NaN')
 
3006
 
 
3007
 
 
3008
##### crud for parsing strings #################################
 
3009
import re
 
3010
 
 
3011
# There's an optional sign at the start, and an optional exponent
 
3012
# at the end.  The exponent has an optional sign and at least one
 
3013
# digit.  In between, must have either at least one digit followed
 
3014
# by an optional fraction, or a decimal point followed by at least
 
3015
# one digit.  Yuck.
 
3016
 
 
3017
_parser = re.compile(r"""
 
3018
#    \s*
 
3019
    (?P<sign>[-+])?
 
3020
    (
 
3021
        (?P<int>\d+) (\. (?P<frac>\d*))?
 
3022
    |
 
3023
        \. (?P<onlyfrac>\d+)
 
3024
    )
 
3025
    ([eE](?P<exp>[-+]? \d+))?
 
3026
#    \s*
 
3027
    $
 
3028
""", re.VERBOSE).match #Uncomment the \s* to allow leading or trailing spaces.
 
3029
 
 
3030
del re
 
3031
 
 
3032
# return sign, n, p s.t. float string value == -1**sign * n * 10**p exactly
 
3033
 
 
3034
def _string2exact(s):
 
3035
    m = _parser(s)
 
3036
    if m is None:
 
3037
        raise ValueError("invalid literal for Decimal: %r" % s)
 
3038
 
 
3039
    if m.group('sign') == "-":
 
3040
        sign = 1
 
3041
    else:
 
3042
        sign = 0
 
3043
 
 
3044
    exp = m.group('exp')
 
3045
    if exp is None:
 
3046
        exp = 0
 
3047
    else:
 
3048
        exp = int(exp)
 
3049
 
 
3050
    intpart = m.group('int')
 
3051
    if intpart is None:
 
3052
        intpart = ""
 
3053
        fracpart = m.group('onlyfrac')
 
3054
    else:
 
3055
        fracpart = m.group('frac')
 
3056
        if fracpart is None:
 
3057
            fracpart = ""
 
3058
 
 
3059
    exp -= len(fracpart)
 
3060
 
 
3061
    mantissa = intpart + fracpart
 
3062
    tmp = map(int, mantissa)
 
3063
    backup = tmp
 
3064
    while tmp and tmp[0] == 0:
 
3065
        del tmp[0]
 
3066
 
 
3067
    # It's a zero
 
3068
    if not tmp:
 
3069
        if backup:
 
3070
            return (sign, tuple(backup), exp)
 
3071
        return (sign, (0,), exp)
 
3072
    mantissa = tuple(tmp)
 
3073
 
 
3074
    return (sign, mantissa, exp)
 
3075
 
 
3076
 
 
3077
if __name__ == '__main__':
 
3078
    import doctest, sys
 
3079
    doctest.testmod(sys.modules[__name__])