[Jython-checkins] jython: math.trunc support.

frank.wierzbicki jython-checkins at python.org
Wed Apr 4 20:37:25 CEST 2012


http://hg.python.org/jython/rev/ba98e28a2dea
changeset:   6529:ba98e28a2dea
user:        Frank Wierzbicki <fwierzbicki at gmail.com>
date:        Wed Apr 04 11:37:09 2012 -0700
summary:
  math.trunc support.

files:
  src/org/python/core/PyFloat.java   |  17 +++++++++++++++++
  src/org/python/core/PyInteger.java |  10 ++++++++++
  src/org/python/core/PyLong.java    |  11 +++++++++++
  src/org/python/core/PyObject.java  |  11 +++++++++++
  src/org/python/modules/math.java   |   4 ++++
  5 files changed, 53 insertions(+), 0 deletions(-)


diff --git a/src/org/python/core/PyFloat.java b/src/org/python/core/PyFloat.java
--- a/src/org/python/core/PyFloat.java
+++ b/src/org/python/core/PyFloat.java
@@ -9,6 +9,7 @@
 import org.python.core.stringlib.InternalFormatSpecParser;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 
 import org.python.expose.ExposedClassMethod;
 import org.python.expose.ExposedGet;
@@ -799,6 +800,22 @@
     }
 
     @Override
+    public PyObject __trunc__() {
+        return float___trunc__();
+    }
+
+    @ExposedMethod(doc = BuiltinDocs.float___trunc___doc)
+    final PyObject float___trunc__() {
+        if (value < Integer.MAX_VALUE) {
+            return new PyInteger((int)value);
+        } else if (value < Long.MAX_VALUE) {
+            return new PyLong((long)value);
+        }
+        BigDecimal d = new BigDecimal(value);
+        return new PyLong(d.toBigInteger());
+    }
+
+    @Override
     public PyComplex __complex__() {
         return new PyComplex(getValue(), 0.);
     }
diff --git a/src/org/python/core/PyInteger.java b/src/org/python/core/PyInteger.java
--- a/src/org/python/core/PyInteger.java
+++ b/src/org/python/core/PyInteger.java
@@ -868,6 +868,16 @@
     }
 
     @Override
+    public PyObject __trunc__() {
+        return int___trunc__();
+    }
+
+    @ExposedMethod(doc = BuiltinDocs.int___trunc___doc)
+    final PyObject int___trunc__() {
+        return this;
+    }
+
+    @Override
     public PyComplex __complex__() {
         return new PyComplex(getValue(), 0.);
     }
diff --git a/src/org/python/core/PyLong.java b/src/org/python/core/PyLong.java
--- a/src/org/python/core/PyLong.java
+++ b/src/org/python/core/PyLong.java
@@ -920,6 +920,17 @@
     }
 
     @Override
+    public PyObject __trunc__() {
+        return long___trunc__();
+    }
+
+    @ExposedMethod(doc = BuiltinDocs.long___trunc___doc)
+    final PyObject long___trunc__() {
+        return this;
+    }
+
+
+    @Override
     public PyString __oct__() {
         return long___oct__();
     }
diff --git a/src/org/python/core/PyObject.java b/src/org/python/core/PyObject.java
--- a/src/org/python/core/PyObject.java
+++ b/src/org/python/core/PyObject.java
@@ -1800,6 +1800,17 @@
     }
 
     /**
+     * Equivalent to the standard Python __trunc__ method.
+     * Should only be overridden by numeric objects that can reasonably
+     * be truncated to an Integral.
+     *
+     * @return the Integral closest to x between 0 and x.
+     **/
+    public PyObject __trunc__() {
+        throw Py.AttributeError("__trunc__");
+    }
+
+    /**
      * Equivalent to the standard Python __pos__ method.
      *
      * @return +this.
diff --git a/src/org/python/modules/math.java b/src/org/python/modules/math.java
--- a/src/org/python/modules/math.java
+++ b/src/org/python/modules/math.java
@@ -357,6 +357,10 @@
         return new PyTuple(new PyFloat(x), new PyInteger(exponent));
     }
 
+    public static PyObject trunc(PyObject number) {
+        return number.__getattr__("__trunc__").__call__();
+    }
+
     public static double ldexp(double v, PyObject wObj) {
         if (ZERO == v) {
             return v; // can be negative zero

-- 
Repository URL: http://hg.python.org/jython


More information about the Jython-checkins mailing list