# [Python-checkins] r56045 - python/branches/decimal-branch/Lib/decimal.py

facundo.batista python-checkins at python.org
Wed Jun 20 14:20:06 CEST 2007

```Author: facundo.batista
Date: Wed Jun 20 14:20:04 2007
New Revision: 56045

Modified:
python/branches/decimal-branch/Lib/decimal.py
Log:

Coded canonical, maxmag and minmag methods. All tests pass ok.

Modified: python/branches/decimal-branch/Lib/decimal.py
==============================================================================
--- python/branches/decimal-branch/Lib/decimal.py	(original)
+++ python/branches/decimal-branch/Lib/decimal.py	Wed Jun 20 14:20:04 2007
@@ -2315,6 +2315,7 @@
As we do not have different encodings for the same number, the
received object already is in it's canonical form.
"""
+        return self

def compare_signal(self, other, context=None):
"""Compares self to the other operand numerically.
@@ -2530,9 +2531,69 @@

def max_mag(self, other, context=None):
"""Compares the values numerically with their sign ignored."""
+        if context is None:
+            context = getcontext()
+        if self._isnan() == 2:
+            return context._raise_error(InvalidOperation, 'Magnitude max with sNaN', 1, self)
+        if other._isnan() == 2:
+            return context._raise_error(InvalidOperation, 'Magnitude max with sNaN', 1, other)
+        abs_self = abs(self)
+        abs_other = abs(other)
+        if abs_self == abs_other:
+            if self._sign == other._sign:
+                if self._sign == 0:
+                    if self._exp >= other._exp:
+                        return self
+                    else:
+                        return other
+                else:
+                    if self._exp < other._exp:
+                        return self
+                    else:
+                        return other
+            elif self._sign == 0:
+                return self
+            else:
+                return other
+        ans = abs_self.max(abs_other)
+        if abs_self is ans:
+            d = self._fix(context)
+        else:
+            d = other._fix(context)
+        return d

def min_mag(self, other, context=None):
"""Compares the values numerically with their sign ignored."""
+        if context is None:
+            context = getcontext()
+        if self._isnan() == 2:
+            return context._raise_error(InvalidOperation, 'Magnitude max with sNaN', 1, self)
+        if other._isnan() == 2:
+            return context._raise_error(InvalidOperation, 'Magnitude max with sNaN', 1, other)
+        abs_self = abs(self)
+        abs_other = abs(other)
+        if abs_self == abs_other:
+            if self._sign == other._sign:
+                if self._sign == 0:
+                    if self._exp >= other._exp:
+                        return other
+                    else:
+                        return self
+                else:
+                    if self._exp < other._exp:
+                        return other
+                    else:
+                        return self
+            elif self._sign == 0:
+                return other
+            else:
+                return self
+        ans = abs_self.min(abs_other)
+        if abs_self is ans:
+            d = self._fix(context)
+        else:
+            d = other._fix(context)
+        return d

def next_minus(self, context=None):
"""Returns the largest representable number smaller than itself."""
```