# [pypy-svn] r75736 - in pypy/branch/fast-forward/pypy/rlib: . test

benjamin at codespeak.net benjamin at codespeak.net
Thu Jul 1 20:51:21 CEST 2010

```Author: benjamin
Date: Thu Jul  1 20:51:19 2010
New Revision: 75736

Modified:
pypy/branch/fast-forward/pypy/rlib/rarithmetic.py
pypy/branch/fast-forward/pypy/rlib/test/test_rarithmetic.py
Log:
import useful things from the math module when possible; add copysign

Modified: pypy/branch/fast-forward/pypy/rlib/rarithmetic.py
==============================================================================
--- pypy/branch/fast-forward/pypy/rlib/rarithmetic.py	(original)
+++ pypy/branch/fast-forward/pypy/rlib/rarithmetic.py	Thu Jul  1 20:51:19 2010
@@ -53,14 +53,25 @@
INFINITY = 1e200 * 1e200
NAN = INFINITY / INFINITY

-def isinf(x):
-    return x != 0.0 and x / 2 == x
+try:
+    from math import isinf, isnan, copysign
+except ImportError:
+    def isinf(x):
+        return x != 0.0 and x / 2 == x
+
+    # To get isnan, working x-platform and both on 2.3 and 2.4, is a
+    # horror.  I think this works (for reasons I don't really want to talk
+    # about), and probably when implemented on top of pypy, too.
+    def isnan(v):
+        return v != v*1.0 or (v == 1.0 and v == 2.0)
+
+    def copysign(x, y):
+        """Return x with the sign of y"""
+        if y > 0. or (y == 0. and math.atan2(y, -1.) > 0.):
+            return math.fabs(x)
+        else:
+            return -math.fabs(x)

-# To get isnan, working x-platform and both on 2.3 and 2.4, is a
-# horror.  I think this works (for reasons I don't really want to talk
-# about), and probably when implemented on top of pypy, too.
-def isnan(v):
-    return v != v*1.0 or (v == 1.0 and v == 2.0)

def intmask(n):
if isinstance(n, int):

Modified: pypy/branch/fast-forward/pypy/rlib/test/test_rarithmetic.py
==============================================================================
--- pypy/branch/fast-forward/pypy/rlib/test/test_rarithmetic.py	(original)
+++ pypy/branch/fast-forward/pypy/rlib/test/test_rarithmetic.py	Thu Jul  1 20:51:19 2010
@@ -372,3 +372,10 @@
def test_int_real_union():
from pypy.rpython.lltypesystem.rffi import r_int_real
assert compute_restype(r_int_real, r_int_real) is r_int_real
+
+def test_copysign():
+    assert copysign(1, 1) == 1
+    assert copysign(-1, 1) == 1
+    assert copysign(-1, -1) == -1
+    assert copysign(1, -1) == -1
+    assert copysign(1, -0.) == -1

```

More information about the Pypy-commit mailing list