[pypy-commit] pypy default: replace rfloat.isnan and rfloat.isinf with the functions in the math module
gutworth
pypy.commits at gmail.com
Fri Jan 19 03:14:03 EST 2018
Author: Benjamin Peterson <benjamin at python.org>
Branch:
Changeset: r93681:3d1f618efa2e
Date: 2018-01-19 00:13 -0800
http://bitbucket.org/pypy/pypy/changeset/3d1f618efa2e/
Log: replace rfloat.isnan and rfloat.isinf with the functions in the math
module
diff --git a/pypy/module/__builtin__/operation.py b/pypy/module/__builtin__/operation.py
--- a/pypy/module/__builtin__/operation.py
+++ b/pypy/module/__builtin__/operation.py
@@ -2,11 +2,13 @@
Interp-level implementation of the basic space operations.
"""
+import math
+
from pypy.interpreter import gateway
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.gateway import unwrap_spec, WrappedDefault
from rpython.rlib.runicode import UNICHR
-from rpython.rlib.rfloat import isfinite, isinf, round_double, round_away
+from rpython.rlib.rfloat import isfinite, round_double, round_away
from rpython.rlib import rfloat
import __builtin__
@@ -151,7 +153,7 @@
else:
# finite x, and ndigits is not unreasonably large
z = round_double(number, ndigits)
- if isinf(z):
+ if math.isinf(z):
raise oefmt(space.w_OverflowError,
"rounded value too large to represent")
return space.newfloat(z)
diff --git a/pypy/module/cmath/test/test_cmath.py b/pypy/module/cmath/test/test_cmath.py
--- a/pypy/module/cmath/test/test_cmath.py
+++ b/pypy/module/cmath/test/test_cmath.py
@@ -1,5 +1,4 @@
from __future__ import with_statement
-from rpython.rlib.rfloat import isnan, isinf
from pypy.module.cmath import interp_cmath
import os, sys, math
@@ -142,12 +141,12 @@
"""
# special values testing
- if isnan(a):
- if isnan(b):
+ if math.isnan(a):
+ if math.isnan(b):
return
raise AssertionError(msg + '%r should be nan' % (b,))
- if isinf(a):
+ if math.isinf(a):
if a == b:
return
raise AssertionError(msg + 'finite result where infinity expected: '
diff --git a/pypy/module/math/interp_math.py b/pypy/module/math/interp_math.py
--- a/pypy/module/math/interp_math.py
+++ b/pypy/module/math/interp_math.py
@@ -65,11 +65,11 @@
def isinf(space, w_x):
"""Return True if x is infinity."""
- return space.newbool(rfloat.isinf(_get_double(space, w_x)))
+ return space.newbool(math.isinf(_get_double(space, w_x)))
def isnan(space, w_x):
"""Return True if x is not a number."""
- return space.newbool(rfloat.isnan(_get_double(space, w_x)))
+ return space.newbool(math.isnan(_get_double(space, w_x)))
def pow(space, w_x, w_y):
"""pow(x,y)
@@ -327,14 +327,14 @@
if not rfloat.isfinite(v):
if rfloat.isfinite(original):
raise oefmt(space.w_OverflowError, "intermediate overflow")
- if rfloat.isinf(original):
+ if math.isinf(original):
inf_sum += original
special_sum += original
del partials[:]
else:
partials.append(v)
if special_sum != 0.0:
- if rfloat.isnan(inf_sum):
+ if math.isnan(inf_sum):
raise oefmt(space.w_ValueError, "-inf + inf")
return space.newfloat(special_sum)
hi = 0.0
diff --git a/pypy/module/micronumpy/test/test_complex.py b/pypy/module/micronumpy/test/test_complex.py
--- a/pypy/module/micronumpy/test/test_complex.py
+++ b/pypy/module/micronumpy/test/test_complex.py
@@ -7,7 +7,6 @@
from pypy.interpreter.error import OperationError
from pypy.interpreter.gateway import interp2app
from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest
-from rpython.rlib.rfloat import isnan, isinf
from rpython.rlib.rcomplex import c_pow
@@ -22,12 +21,12 @@
"""
# special values testing
- if isnan(a):
- if isnan(b):
+ if math.isnan(a):
+ if math.isnan(b):
return True,''
raise AssertionError(msg + '%r should be nan' % (b,))
- if isinf(a):
+ if math.isinf(a):
if a == b:
return True,''
raise AssertionError(msg + 'finite result where infinity expected: '+ \
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -816,7 +816,7 @@
def sign(self, v):
if v == 0.0:
return 0.0
- if rfloat.isnan(v):
+ if math.isnan(v):
return rfloat.NAN
return math.copysign(1.0, v)
@@ -830,27 +830,27 @@
@simple_binary_op
def max(self, v1, v2):
- return v1 if v1 >= v2 or rfloat.isnan(v1) else v2
+ return v1 if v1 >= v2 or math.isnan(v1) else v2
@simple_binary_op
def min(self, v1, v2):
- return v1 if v1 <= v2 or rfloat.isnan(v1) else v2
+ return v1 if v1 <= v2 or math.isnan(v1) else v2
@raw_binary_op
def argmax(self, v1, v2):
- return v1 >= v2 or rfloat.isnan(v1)
+ return v1 >= v2 or math.isnan(v1)
@raw_binary_op
def argmin(self, v1, v2):
- return v1 <= v2 or rfloat.isnan(v1)
+ return v1 <= v2 or math.isnan(v1)
@simple_binary_op
def fmax(self, v1, v2):
- return v1 if v1 >= v2 or rfloat.isnan(v2) else v2
+ return v1 if v1 >= v2 or math.isnan(v2) else v2
@simple_binary_op
def fmin(self, v1, v2):
- return v1 if v1 <= v2 or rfloat.isnan(v2) else v2
+ return v1 if v1 <= v2 or math.isnan(v2) else v2
@simple_binary_op
def fmod(self, v1, v2):
@@ -876,9 +876,9 @@
@specialize.argtype(1)
def round(self, v, decimals=0):
raw = self.for_computation(self.unbox(v))
- if rfloat.isinf(raw):
+ if math.isinf(raw):
return v
- elif rfloat.isnan(raw):
+ elif math.isnan(raw):
return v
ans = rfloat.round_double(raw, decimals, half_even=True)
return self.box(ans)
@@ -986,11 +986,11 @@
@raw_unary_op
def isnan(self, v):
- return rfloat.isnan(v)
+ return math.isnan(v)
@raw_unary_op
def isinf(self, v):
- return rfloat.isinf(v)
+ return math.isinf(v)
@raw_unary_op
def isfinite(self, v):
@@ -1189,7 +1189,7 @@
return imag_str
real_str = str_format(real)
- op = '+' if imag >= 0 or rfloat.isnan(imag) else ''
+ op = '+' if imag >= 0 or math.isnan(imag) else ''
return ''.join(['(', real_str, op, imag_str, ')'])
def runpack_str(self, space, s, native):
@@ -1318,7 +1318,7 @@
return rcomplex.c_div(v1, v2)
except ZeroDivisionError:
if rcomplex.c_abs(*v1) == 0 or \
- (rfloat.isnan(v1[0]) and rfloat.isnan(v1[1])):
+ (math.isnan(v1[0]) and math.isnan(v1[1])):
return rfloat.NAN, rfloat.NAN
return rfloat.INFINITY, rfloat.INFINITY
@@ -1353,12 +1353,12 @@
@raw_unary_op
def isnan(self, v):
'''a complex number is nan if one of the parts is nan'''
- return rfloat.isnan(v[0]) or rfloat.isnan(v[1])
+ return math.isnan(v[0]) or math.isnan(v[1])
@raw_unary_op
def isinf(self, v):
'''a complex number is inf if one of the parts is inf'''
- return rfloat.isinf(v[0]) or rfloat.isinf(v[1])
+ return math.isinf(v[0]) or math.isinf(v[1])
def _eq(self, v1, v2):
return v1[0] == v2[0] and v1[1] == v2[1]
@@ -1374,7 +1374,7 @@
def _lt(self, v1, v2):
(r1, i1), (r2, i2) = v1, v2
- if r1 < r2 and not rfloat.isnan(i1) and not rfloat.isnan(i2):
+ if r1 < r2 and not math.isnan(i1) and not math.isnan(i2):
return True
if r1 == r2 and i1 < i2:
return True
@@ -1459,7 +1459,7 @@
ratio = i2 / r2
denom = r2 + i2 * ratio
rr = (r1 + i1 * ratio) / denom
- elif rfloat.isnan(r2):
+ elif math.isnan(r2):
rr = rfloat.NAN
else:
ratio = r2 / i2
@@ -1503,7 +1503,7 @@
sign of complex number could be either the point closest to the unit circle
or {-1,0,1}, for compatability with numpy we choose the latter
'''
- if rfloat.isnan(v[0]) or rfloat.isnan(v[1]):
+ if math.isnan(v[0]) or math.isnan(v[1]):
return rfloat.NAN, 0
if v[0] == 0.0:
if v[1] == 0:
@@ -1534,9 +1534,9 @@
@complex_unary_op
def reciprocal(self, v):
- if rfloat.isinf(v[1]) and rfloat.isinf(v[0]):
+ if math.isinf(v[1]) and math.isinf(v[0]):
return rfloat.NAN, rfloat.NAN
- if rfloat.isinf(v[0]):
+ if math.isinf(v[0]):
return (math.copysign(0., v[0]),
math.copysign(0., -v[1]))
a2 = v[0]*v[0] + v[1]*v[1]
@@ -1575,13 +1575,13 @@
@complex_unary_op
def exp(self, v):
- if rfloat.isinf(v[1]):
- if rfloat.isinf(v[0]):
+ if math.isinf(v[1]):
+ if math.isinf(v[0]):
if v[0] < 0:
return 0., 0.
return rfloat.INFINITY, rfloat.NAN
elif (rfloat.isfinite(v[0]) or \
- (rfloat.isinf(v[0]) and v[0] > 0)):
+ (math.isinf(v[0]) and v[0] > 0)):
return rfloat.NAN, rfloat.NAN
try:
return rcomplex.c_exp(*v)
@@ -1603,13 +1603,13 @@
def expm1(self, v):
# duplicate exp() so in the future it will be easier
# to implement seterr
- if rfloat.isinf(v[1]):
- if rfloat.isinf(v[0]):
+ if math.isinf(v[1]):
+ if math.isinf(v[0]):
if v[0] < 0:
return -1., 0.
return rfloat.NAN, rfloat.NAN
elif (rfloat.isfinite(v[0]) or \
- (rfloat.isinf(v[0]) and v[0] > 0)):
+ (math.isinf(v[0]) and v[0] > 0)):
return rfloat.NAN, rfloat.NAN
try:
res = rcomplex.c_exp(*v)
@@ -1622,29 +1622,29 @@
@complex_unary_op
def sin(self, v):
- if rfloat.isinf(v[0]):
+ if math.isinf(v[0]):
if v[1] == 0.:
return rfloat.NAN, 0.
if rfloat.isfinite(v[1]):
return rfloat.NAN, rfloat.NAN
- elif not rfloat.isnan(v[1]):
+ elif not math.isnan(v[1]):
return rfloat.NAN, rfloat.INFINITY
return rcomplex.c_sin(*v)
@complex_unary_op
def cos(self, v):
- if rfloat.isinf(v[0]):
+ if math.isinf(v[0]):
if v[1] == 0.:
return rfloat.NAN, 0.0
if rfloat.isfinite(v[1]):
return rfloat.NAN, rfloat.NAN
- elif not rfloat.isnan(v[1]):
+ elif not math.isnan(v[1]):
return rfloat.INFINITY, rfloat.NAN
return rcomplex.c_cos(*v)
@complex_unary_op
def tan(self, v):
- if rfloat.isinf(v[0]) and rfloat.isfinite(v[1]):
+ if math.isinf(v[0]) and rfloat.isfinite(v[1]):
return rfloat.NAN, rfloat.NAN
return rcomplex.c_tan(*v)
@@ -1669,29 +1669,29 @@
@complex_unary_op
def sinh(self, v):
- if rfloat.isinf(v[1]):
+ if math.isinf(v[1]):
if rfloat.isfinite(v[0]):
if v[0] == 0.0:
return 0.0, rfloat.NAN
return rfloat.NAN, rfloat.NAN
- elif not rfloat.isnan(v[0]):
+ elif not math.isnan(v[0]):
return rfloat.INFINITY, rfloat.NAN
return rcomplex.c_sinh(*v)
@complex_unary_op
def cosh(self, v):
- if rfloat.isinf(v[1]):
+ if math.isinf(v[1]):
if rfloat.isfinite(v[0]):
if v[0] == 0.0:
return rfloat.NAN, 0.0
return rfloat.NAN, rfloat.NAN
- elif not rfloat.isnan(v[0]):
+ elif not math.isnan(v[0]):
return rfloat.INFINITY, rfloat.NAN
return rcomplex.c_cosh(*v)
@complex_unary_op
def tanh(self, v):
- if rfloat.isinf(v[1]) and rfloat.isfinite(v[0]):
+ if math.isinf(v[1]) and rfloat.isfinite(v[0]):
return rfloat.NAN, rfloat.NAN
return rcomplex.c_tanh(*v)
diff --git a/pypy/module/time/interp_time.py b/pypy/module/time/interp_time.py
--- a/pypy/module/time/interp_time.py
+++ b/pypy/module/time/interp_time.py
@@ -6,6 +6,7 @@
from rpython.rlib.rarithmetic import intmask
from rpython.rlib import rposix, rtime
from rpython.translator.tool.cbuild import ExternalCompilationInfo
+import math
import os
import sys
import time as pytime
@@ -311,11 +312,10 @@
return os.strerror(errno)
def _check_sleep_arg(space, secs):
- from rpython.rlib.rfloat import isinf, isnan
if secs < 0:
raise oefmt(space.w_IOError,
"Invalid argument: negative time in sleep")
- if isinf(secs) or isnan(secs):
+ if math.isinf(secs) or math.isnan(secs):
raise oefmt(space.w_IOError,
"Invalid argument: inf or nan")
diff --git a/pypy/objspace/std/complexobject.py b/pypy/objspace/std/complexobject.py
--- a/pypy/objspace/std/complexobject.py
+++ b/pypy/objspace/std/complexobject.py
@@ -4,7 +4,7 @@
from rpython.rlib.rarithmetic import intmask, r_ulonglong
from rpython.rlib.rbigint import rbigint
from rpython.rlib.rfloat import (
- DTSF_STR_PRECISION, formatd, isinf, isnan, string_to_float)
+ DTSF_STR_PRECISION, formatd, string_to_float)
from rpython.rlib.rstring import ParseStringError
from pypy.interpreter.baseobjspace import W_Root
@@ -111,12 +111,12 @@
def format_float(x, code, precision):
# like float2string, except that the ".0" is not necessary
- if isinf(x):
+ if math.isinf(x):
if x > 0.0:
return "inf"
else:
return "-inf"
- elif isnan(x):
+ elif math.isnan(x):
return "nan"
else:
return formatd(x, code, precision)
@@ -349,7 +349,7 @@
if self.realval == 0 and math.copysign(1., self.realval) == 1.:
return space.newtext(repr_format(self.imagval) + 'j')
sign = (math.copysign(1., self.imagval) == 1. or
- isnan(self.imagval)) and '+' or ''
+ math.isnan(self.imagval)) and '+' or ''
return space.newtext('(' + repr_format(self.realval)
+ sign + repr_format(self.imagval) + 'j)')
@@ -357,7 +357,7 @@
if self.realval == 0 and math.copysign(1., self.realval) == 1.:
return space.newtext(str_format(self.imagval) + 'j')
sign = (math.copysign(1., self.imagval) == 1. or
- isnan(self.imagval)) and '+' or ''
+ math.isnan(self.imagval)) and '+' or ''
return space.newtext('(' + str_format(self.realval)
+ sign + str_format(self.imagval) + 'j)')
diff --git a/pypy/objspace/std/floatobject.py b/pypy/objspace/std/floatobject.py
--- a/pypy/objspace/std/floatobject.py
+++ b/pypy/objspace/std/floatobject.py
@@ -8,7 +8,7 @@
from rpython.rlib.rbigint import rbigint
from rpython.rlib.rfloat import (
DTSF_ADD_DOT_0, DTSF_STR_PRECISION, INFINITY, NAN,
- float_as_rbigint_ratio, formatd, isfinite, isinf, isnan)
+ float_as_rbigint_ratio, formatd, isfinite)
from rpython.rlib.rstring import ParseStringError
from rpython.rlib.unroll import unrolling_iterable
from rpython.rtyper.lltypesystem.module.ll_math import math_fmod
@@ -27,7 +27,7 @@
# we special-case explicitly inf and nan here
if isfinite(x):
s = formatd(x, code, precision, DTSF_ADD_DOT_0)
- elif isinf(x):
+ elif math.isinf(x):
if x > 0.0:
s = "inf"
else:
@@ -704,7 +704,7 @@
def _hash_float(space, v):
- if isnan(v):
+ if math.isnan(v):
return 0
# This is designed so that Python numbers of different types
@@ -798,16 +798,16 @@
if y == 0.0:
# x**0 is 1, even 0**0
return 1.0
- if isnan(x):
+ if math.isnan(x):
# nan**y = nan, unless y == 0
return x
- if isnan(y):
+ if math.isnan(y):
# x**nan = nan, unless x == 1; x**nan = x
if x == 1.0:
return 1.0
else:
return y
- if isinf(y):
+ if math.isinf(y):
# x**inf is: 0.0 if abs(x) < 1; 1.0 if abs(x) == 1; inf if
# abs(x) > 1 (including case where x infinite)
#
@@ -820,7 +820,7 @@
return INFINITY
else:
return 0.0
- if isinf(x):
+ if math.isinf(x):
# (+-inf)**w is: inf for w positive, 0 for w negative; in oth
# cases, we need to add the appropriate sign if w is an odd
# integer.
@@ -846,7 +846,7 @@
# unlike "math.pow(-1.0, bignum)". See http://mail.python.org/
# - pipermail/python-bugs-list/2003-March/016795.html
if x < 0.0:
- if isnan(y):
+ if math.isnan(y):
return NAN
if math.floor(y) != y:
raise PowDomainError
diff --git a/pypy/objspace/std/formatting.py b/pypy/objspace/std/formatting.py
--- a/pypy/objspace/std/formatting.py
+++ b/pypy/objspace/std/formatting.py
@@ -1,10 +1,11 @@
"""String formatting routines"""
+import math
import sys
from rpython.rlib import jit
from rpython.rlib.objectmodel import specialize
from rpython.rlib.rarithmetic import INT_MAX
-from rpython.rlib.rfloat import DTSF_ALT, formatd, isnan, isinf
+from rpython.rlib.rfloat import DTSF_ALT, formatd
from rpython.rlib.rstring import StringBuilder, UnicodeBuilder
from rpython.rlib.unroll import unrolling_iterable
from rpython.tool.sourcetools import func_with_new_name
@@ -118,12 +119,12 @@
def format_float(self, w_value, char):
space = self.space
x = space.float_w(maybe_float(space, w_value))
- if isnan(x):
+ if math.isnan(x):
if char in 'EFG':
r = 'NAN'
else:
r = 'nan'
- elif isinf(x):
+ elif math.isinf(x):
if x < 0:
if char in 'EFG':
r = '-INF'
diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py
--- a/pypy/objspace/std/listobject.py
+++ b/pypy/objspace/std/listobject.py
@@ -7,6 +7,7 @@
"""
+import math
import operator
import sys
@@ -1797,11 +1798,9 @@
def _safe_find(self, w_list, obj, start, stop):
- from rpython.rlib.rfloat import isnan
- #
l = self.unerase(w_list.lstorage)
stop = min(stop, len(l))
- if not isnan(obj):
+ if not math.isnan(obj):
for i in range(start, stop):
val = l[i]
if val == obj:
diff --git a/rpython/annotator/model.py b/rpython/annotator/model.py
--- a/rpython/annotator/model.py
+++ b/rpython/annotator/model.py
@@ -170,9 +170,8 @@
def __eq__(self, other):
if (type(self) is SomeFloat and type(other) is SomeFloat and
self.is_constant() and other.is_constant()):
- from rpython.rlib.rfloat import isnan
# NaN unpleasantness.
- if isnan(self.const) and isnan(other.const):
+ if math.isnan(self.const) and math.isnan(other.const):
return True
# 0.0 vs -0.0 unpleasantness.
if not self.const and not other.const:
diff --git a/rpython/jit/backend/test/runner_test.py b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -1,4 +1,4 @@
-import py, sys, random, os, struct, operator
+import py, sys, random, os, struct, operator, math
from rpython.jit.metainterp.history import (AbstractFailDescr,
AbstractDescr,
BasicFailDescr,
@@ -1696,7 +1696,7 @@
if not self.cpu.supports_floats:
py.test.skip("requires floats")
- from rpython.rlib.rfloat import INFINITY, NAN, isinf, isnan
+ from rpython.rlib.rfloat import INFINITY, NAN
from rpython.jit.metainterp.resoperation import opname
fzer = 0.0
@@ -1724,10 +1724,10 @@
expectedtype)
if not isinstance(expected, bool):
got = longlong.getrealfloat(got)
- if isnan(expected):
- ok = isnan(got)
- elif isinf(expected):
- ok = isinf(got)
+ if math.isnan(expected):
+ ok = math.isnan(got)
+ elif math.isinf(expected):
+ ok = math.isinf(got)
else:
ok = got == expected
if not ok:
diff --git a/rpython/jit/metainterp/test/support.py b/rpython/jit/metainterp/test/support.py
--- a/rpython/jit/metainterp/test/support.py
+++ b/rpython/jit/metainterp/test/support.py
@@ -1,5 +1,4 @@
-
-import py, sys
+import py, sys, math
from rpython.rtyper.lltypesystem import lltype, llmemory
from rpython.jit.backend.llgraph import runner
from rpython.jit.metainterp.warmspot import ll_meta_interp, get_stats
@@ -10,7 +9,6 @@
from rpython.jit.codewriter.policy import JitPolicy
from rpython.jit.codewriter import codewriter, longlong
from rpython.jit.backend.llsupport.vector_ext import VectorExt
-from rpython.rlib.rfloat import isnan
from rpython.rlib.jit import ENABLE_ALL_OPTS
from rpython.translator.backendopt.all import backend_optimizations
@@ -274,11 +272,11 @@
result1 = _run_with_blackhole(self, args)
# try to run it with pyjitpl.py
result2 = _run_with_pyjitpl(self, args, stats)
- assert result1 == result2 or isnan(result1) and isnan(result2)
+ assert result1 == result2 or math.isnan(result1) and math.isnan(result2)
# try to run it by running the code compiled just before
df, result3 = _run_with_machine_code(self, args)
self._lastframe = df
- assert result1 == result3 or result3 == NotImplemented or isnan(result1) and isnan(result3)
+ assert result1 == result3 or result3 == NotImplemented or math.isnan(result1) and math.isnan(result3)
#
if (longlong.supports_longlong and
isinstance(result1, longlong.r_float_storage)):
diff --git a/rpython/jit/metainterp/test/test_ajit.py b/rpython/jit/metainterp/test/test_ajit.py
--- a/rpython/jit/metainterp/test/test_ajit.py
+++ b/rpython/jit/metainterp/test/test_ajit.py
@@ -1,3 +1,4 @@
+import math
import sys
import py
@@ -3973,7 +3974,6 @@
assert res == 3
def test_float_bytes(self):
- from rpython.rlib.rfloat import isnan
def f(n):
ll = float2longlong(n)
return longlong2float(ll)
@@ -3981,7 +3981,7 @@
for x in [2.5, float("nan"), -2.5, float("inf")]:
# There are tests elsewhere to verify the correctness of this.
res = self.interp_operations(f, [x])
- assert res == x or isnan(x) and isnan(res)
+ assert res == x or math.isnan(x) and math.isnan(res)
class TestLLtype(BaseLLtypeTests, LLJitMixin):
diff --git a/rpython/jit/metainterp/test/test_math.py b/rpython/jit/metainterp/test/test_math.py
--- a/rpython/jit/metainterp/test/test_math.py
+++ b/rpython/jit/metainterp/test/test_math.py
@@ -1,6 +1,6 @@
import math
from rpython.jit.metainterp.test.support import LLJitMixin
-from rpython.rlib.rfloat import isinf, isnan, INFINITY, NAN
+from rpython.rlib.rfloat import INFINITY, NAN
class MathTests:
@@ -32,11 +32,11 @@
self.check_operations_history(call_pure_f=0)
#
res = self.interp_operations(f, [INFINITY])
- assert isinf(res) and not isnan(res) and res > 0.0
+ assert math.isinf(res) and not math.isnan(res) and res > 0.0
self.check_operations_history(call_pure_f=0)
#
res = self.interp_operations(f, [NAN])
- assert isnan(res) and not isinf(res)
+ assert math.isnan(res) and not math.isinf(res)
self.check_operations_history(call_pure_f=0)
diff --git a/rpython/jit/metainterp/test/test_zvector.py b/rpython/jit/metainterp/test/test_zvector.py
--- a/rpython/jit/metainterp/test/test_zvector.py
+++ b/rpython/jit/metainterp/test/test_zvector.py
@@ -11,7 +11,6 @@
from rpython.jit.metainterp import history
from rpython.rlib.jit import JitDriver, hint, set_param
from rpython.rlib.objectmodel import compute_hash
-from rpython.rlib import rfloat
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rlib.rarithmetic import r_uint, intmask, r_int
from rpython.rlib.rawstorage import (alloc_raw_storage, raw_storage_setitem,
@@ -309,7 +308,7 @@
reds = 'auto',
vectorize=True)
def fmax(v1, v2):
- return v1 if v1 >= v2 or rfloat.isnan(v2) else v2
+ return v1 if v1 >= v2 or math.isnan(v2) else v2
T = lltype.Array(rffi.DOUBLE, hints={'nolength': True})
def f(d):
i = 0
diff --git a/rpython/rlib/constant.py b/rpython/rlib/constant.py
--- a/rpython/rlib/constant.py
+++ b/rpython/rlib/constant.py
@@ -1,5 +1,4 @@
import math
-from rpython.rlib.rfloat import isinf
from rpython.rtyper.tool import rffi_platform
from rpython.translator.tool.cbuild import ExternalCompilationInfo
@@ -18,7 +17,7 @@
assert 0.0 < DBL_MAX < (1e200*1e200)
-assert isinf(DBL_MAX * 1.0001)
+assert math.isinf(DBL_MAX * 1.0001)
assert DBL_MIN > 0.0
assert DBL_MIN * (2**-53) == 0.0
diff --git a/rpython/rlib/objectmodel.py b/rpython/rlib/objectmodel.py
--- a/rpython/rlib/objectmodel.py
+++ b/rpython/rlib/objectmodel.py
@@ -549,9 +549,9 @@
In RPython, floats cannot be used with ints in dicts, anyway.
"""
from rpython.rlib.rarithmetic import intmask
- from rpython.rlib.rfloat import isfinite, isinf
+ from rpython.rlib.rfloat import isfinite
if not isfinite(f):
- if isinf(f):
+ if math.isinf(f):
if f < 0.0:
return -271828
else:
diff --git a/rpython/rlib/rarithmetic.py b/rpython/rlib/rarithmetic.py
--- a/rpython/rlib/rarithmetic.py
+++ b/rpython/rlib/rarithmetic.py
@@ -36,7 +36,7 @@
"""
-import sys, struct
+import sys, struct, math
from rpython.rtyper import extregistry
from rpython.rlib import objectmodel
from rpython.flowspace.model import Constant, const
@@ -191,8 +191,7 @@
# Note the "<= x <" here, as opposed to "< x <" above.
# This is justified by test_typed in translator/c/test.
def ovfcheck_float_to_longlong(x):
- from rpython.rlib.rfloat import isnan
- if isnan(x):
+ if math.isnan(x):
raise OverflowError
if -9223372036854776832.0 <= x < 9223372036854775296.0:
return r_longlong(x)
@@ -200,8 +199,7 @@
if sys.maxint == 2147483647:
def ovfcheck_float_to_int(x):
- from rpython.rlib.rfloat import isnan
- if isnan(x):
+ if math.isnan(x):
raise OverflowError
if -2147483649.0 < x < 2147483648.0:
return int(x)
diff --git a/rpython/rlib/rbigint.py b/rpython/rlib/rbigint.py
--- a/rpython/rlib/rbigint.py
+++ b/rpython/rlib/rbigint.py
@@ -1,7 +1,6 @@
from rpython.rlib.rarithmetic import LONG_BIT, intmask, longlongmask, r_uint, r_ulonglong
from rpython.rlib.rarithmetic import ovfcheck, r_longlong, widen
from rpython.rlib.rarithmetic import most_neg_value_of_same_type
-from rpython.rlib.rfloat import isinf, isnan
from rpython.rlib.rstring import StringBuilder
from rpython.rlib.debug import make_sure_not_resized, check_regular_int
from rpython.rlib.objectmodel import we_are_translated, specialize, not_rpython
@@ -227,9 +226,9 @@
def fromfloat(dval):
""" Create a new bigint object from a float """
# This function is not marked as pure because it can raise
- if isinf(dval):
+ if math.isinf(dval):
raise OverflowError("cannot convert float infinity to integer")
- if isnan(dval):
+ if math.isnan(dval):
raise ValueError("cannot convert float NaN to integer")
return rbigint._fromfloat_finite(dval)
diff --git a/rpython/rlib/rcomplex.py b/rpython/rlib/rcomplex.py
--- a/rpython/rlib/rcomplex.py
+++ b/rpython/rlib/rcomplex.py
@@ -1,6 +1,6 @@
import math
from math import fabs
-from rpython.rlib.rfloat import asinh, log1p, isfinite, isinf, isnan
+from rpython.rlib.rfloat import asinh, log1p, isfinite
from rpython.rlib.constant import DBL_MIN, CM_SCALE_UP, CM_SCALE_DOWN
from rpython.rlib.constant import CM_LARGE_DOUBLE, DBL_MANT_DIG
from rpython.rlib.constant import M_LN2, M_LN10
@@ -57,7 +57,7 @@
denom = r2 + i2 * ratio
rr = (r1 + i1 * ratio) / denom
ir = (i1 - r1 * ratio) / denom
- elif isnan(r2):
+ elif math.isnan(r2):
rr = NAN
ir = NAN
else:
@@ -330,7 +330,7 @@
def c_exp(x, y):
if not isfinite(x) or not isfinite(y):
- if isinf(x) and isfinite(y) and y != 0.:
+ if math.isinf(x) and isfinite(y) and y != 0.:
if x > 0:
real = math.copysign(INF, math.cos(y))
imag = math.copysign(INF, math.sin(y))
@@ -343,7 +343,7 @@
# need to raise ValueError if y is +/- infinity and x is not
# a NaN and not -infinity
- if isinf(y) and (isfinite(x) or (isinf(x) and x > 0)):
+ if math.isinf(y) and (isfinite(x) or (math.isinf(x) and x > 0)):
raise ValueError("math domain error")
return r
@@ -355,14 +355,14 @@
l = math.exp(x)
real = l * math.cos(y)
imag = l * math.sin(y)
- if isinf(real) or isinf(imag):
+ if math.isinf(real) or math.isinf(imag):
raise OverflowError("math range error")
return real, imag
def c_cosh(x, y):
if not isfinite(x) or not isfinite(y):
- if isinf(x) and isfinite(y) and y != 0.:
+ if math.isinf(x) and isfinite(y) and y != 0.:
if x > 0:
real = math.copysign(INF, math.cos(y))
imag = math.copysign(INF, math.sin(y))
@@ -375,7 +375,7 @@
# need to raise ValueError if y is +/- infinity and x is not
# a NaN
- if isinf(y) and not isnan(x):
+ if math.isinf(y) and not math.isnan(x):
raise ValueError("math domain error")
return r
@@ -388,7 +388,7 @@
else:
real = math.cos(y) * math.cosh(x)
imag = math.sin(y) * math.sinh(x)
- if isinf(real) or isinf(imag):
+ if math.isinf(real) or math.isinf(imag):
raise OverflowError("math range error")
return real, imag
@@ -396,7 +396,7 @@
def c_sinh(x, y):
# special treatment for sinh(+/-inf + iy) if y is finite and nonzero
if not isfinite(x) or not isfinite(y):
- if isinf(x) and isfinite(y) and y != 0.:
+ if math.isinf(x) and isfinite(y) and y != 0.:
if x > 0:
real = math.copysign(INF, math.cos(y))
imag = math.copysign(INF, math.sin(y))
@@ -409,7 +409,7 @@
# need to raise ValueError if y is +/- infinity and x is not
# a NaN
- if isinf(y) and not isnan(x):
+ if math.isinf(y) and not math.isnan(x):
raise ValueError("math domain error")
return r
@@ -420,7 +420,7 @@
else:
real = math.cos(y) * math.sinh(x)
imag = math.sin(y) * math.cosh(x)
- if isinf(real) or isinf(imag):
+ if math.isinf(real) or math.isinf(imag):
raise OverflowError("math range error")
return real, imag
@@ -437,7 +437,7 @@
# computation of cosh(x).
if not isfinite(x) or not isfinite(y):
- if isinf(x) and isfinite(y) and y != 0.:
+ if math.isinf(x) and isfinite(y) and y != 0.:
if x > 0:
real = 1.0 # vv XXX why is the 2. there?
imag = math.copysign(0., 2. * math.sin(y) * math.cos(y))
@@ -449,7 +449,7 @@
r = tanh_special_values[special_type(x)][special_type(y)]
# need to raise ValueError if y is +/-infinity and x is finite
- if isinf(y) and isfinite(x):
+ if math.isinf(y) and isfinite(x):
raise ValueError("math domain error")
return r
@@ -487,7 +487,7 @@
# if r is +/-infinity and phi is finite but nonzero then
# result is (+-INF +-INF i), but we need to compute cos(phi)
# and sin(phi) to figure out the signs.
- if isinf(r) and isfinite(phi) and phi != 0.:
+ if math.isinf(r) and isfinite(phi) and phi != 0.:
if r > 0:
real = math.copysign(INF, math.cos(phi))
imag = math.copysign(INF, math.sin(phi))
@@ -500,7 +500,7 @@
# need to raise ValueError if r is a nonzero number and phi
# is infinite
- if r != 0. and not isnan(r) and isinf(phi):
+ if r != 0. and not math.isnan(r) and math.isinf(phi):
raise ValueError("math domain error")
return z
@@ -512,10 +512,10 @@
def c_phase(x, y):
# Windows screws up atan2 for inf and nan, and alpha Tru64 5.1 doesn't
# follow C99 for atan2(0., 0.).
- if isnan(x) or isnan(y):
+ if math.isnan(x) or math.isnan(y):
return NAN
- if isinf(y):
- if isinf(x):
+ if math.isinf(y):
+ if math.isinf(x):
if math.copysign(1., x) == 1.:
# atan2(+-inf, +inf) == +-pi/4
return math.copysign(0.25 * math.pi, y)
@@ -524,7 +524,7 @@
return math.copysign(0.75 * math.pi, y)
# atan2(+-inf, x) == +-pi/2 for finite x
return math.copysign(0.5 * math.pi, y)
- if isinf(x) or y == 0.:
+ if math.isinf(x) or y == 0.:
if math.copysign(1., x) == 1.:
# atan2(+-y, +inf) = atan2(+-0, +x) = +-0.
return math.copysign(0., y)
@@ -538,9 +538,9 @@
if not isfinite(r) or not isfinite(i):
# C99 rules: if either the real or the imaginary part is an
# infinity, return infinity, even if the other part is a NaN.
- if isinf(r):
+ if math.isinf(r):
return INF
- if isinf(i):
+ if math.isinf(i):
return INF
# either the real or imaginary part is a NaN,
@@ -560,11 +560,11 @@
def c_isinf(r, i):
- return isinf(r) or isinf(i)
+ return math.isinf(r) or math.isinf(i)
def c_isnan(r, i):
- return isnan(r) or isnan(i)
+ return math.isnan(r) or math.isnan(i)
def c_isfinite(r, i):
diff --git a/rpython/rlib/rfloat.py b/rpython/rlib/rfloat.py
--- a/rpython/rlib/rfloat.py
+++ b/rpython/rlib/rfloat.py
@@ -1,7 +1,7 @@
"""Float constants"""
import math, struct
-from math import isinf, isnan, acosh, asinh, atanh, log1p, expm1
+from math import acosh, asinh, atanh, log1p, expm1
from rpython.annotator.model import SomeString, SomeChar
from rpython.rlib import objectmodel, unroll
@@ -85,7 +85,7 @@
def double_to_string(value, tp, precision, flags):
if isfinite(value):
special = DIST_FINITE
- elif isinf(value):
+ elif math.isinf(value):
special = DIST_INFINITY
else: #isnan(value):
special = DIST_NAN
@@ -204,7 +204,7 @@
# (a) produce exact results for powers of 2, and
# (b) be monotonic, assuming that the system log is monotonic.
if not isfinite(x):
- if isnan(x):
+ if math.isnan(x):
return x # log2(nan) = nan
elif x > 0.0:
return x # log2(+inf) = +inf
@@ -262,14 +262,14 @@
@not_rpython
def isfinite(x):
- return not isinf(x) and not isnan(x)
+ return not math.isinf(x) and not math.isnan(x)
def float_as_rbigint_ratio(value):
from rpython.rlib.rbigint import rbigint
- if isinf(value):
+ if math.isinf(value):
raise OverflowError("cannot pass infinity to as_integer_ratio()")
- elif isnan(value):
+ elif math.isnan(value):
raise ValueError("cannot pass nan to as_integer_ratio()")
float_part, exp_int = math.frexp(value)
for i in range(300):
@@ -327,7 +327,7 @@
def erf(x):
"""The error function at x."""
- if isnan(x):
+ if math.isnan(x):
return x
absx = abs(x)
if absx < ERF_SERIES_CUTOFF:
@@ -338,7 +338,7 @@
def erfc(x):
"""The complementary error function at x."""
- if isnan(x):
+ if math.isnan(x):
return x
absx = abs(x)
if absx < ERF_SERIES_CUTOFF:
@@ -410,9 +410,9 @@
def gamma(x):
"""Compute the gamma function for x."""
- if isnan(x) or (isinf(x) and x > 0.):
+ if math.isnan(x) or (math.isinf(x) and x > 0.):
return x
- if isinf(x):
+ if math.isinf(x):
raise ValueError("math domain error")
if x == 0.:
raise ValueError("math domain error")
@@ -424,7 +424,7 @@
absx = abs(x)
if absx < 1e-20:
r = 1. / x
- if isinf(r):
+ if math.isinf(r):
raise OverflowError("math range error")
return r
if absx > 200.:
@@ -458,15 +458,15 @@
sqrtpow = math.pow(y, absx / 2. - .25)
r *= sqrtpow
r *= sqrtpow
- if isinf(r):
+ if math.isinf(r):
raise OverflowError("math range error")
return r
def lgamma(x):
"""Compute the natural logarithm of the gamma function for x."""
- if isnan(x):
+ if math.isnan(x):
return x
- if isinf(x):
+ if math.isinf(x):
return INFINITY
if x == math.floor(x) and x <= 2.:
if x <= 0.:
@@ -482,7 +482,7 @@
r = (math.log(math.pi) - math.log(abs(_sinpi(absx))) - math.log(absx) -
(math.log(_lanczos_sum(absx)) - _lanczos_g +
(absx - .5) * (math.log(absx + _lanczos_g - .5) - 1)))
- if isinf(r):
+ if math.isinf(r):
raise OverflowError("math domain error")
return r
diff --git a/rpython/rlib/rstruct/ieee.py b/rpython/rlib/rstruct/ieee.py
--- a/rpython/rlib/rstruct/ieee.py
+++ b/rpython/rlib/rstruct/ieee.py
@@ -152,10 +152,10 @@
raise ValueError("invalid size value")
sign = math.copysign(1.0, x) < 0.0
- if rfloat.isinf(x):
+ if math.isinf(x):
mant = r_ulonglong(0)
exp = MAX_EXP - MIN_EXP + 2
- elif rfloat.isnan(x):
+ elif math.isnan(x):
asint = cast(ULONGLONG, float2longlong(x))
sign = asint >> 63
# shift off lower bits, perhaps losing data
@@ -217,10 +217,10 @@
raise ValueError("invalid size value")
sign = math.copysign(1.0, x) < 0.0
- if rfloat.isinf(x):
+ if math.isinf(x):
mant = r_ulonglong(0)
exp = MAX_EXP - MIN_EXP + 2
- elif rfloat.isnan(x): # rfloat.isnan(x):
+ elif math.isnan(x):
asint = cast(ULONGLONG, float2longlong(x))
mant = asint & ((r_ulonglong(1) << 51) - 1)
if mant == 0:
diff --git a/rpython/rlib/rstruct/test/test_ieee.py b/rpython/rlib/rstruct/test/test_ieee.py
--- a/rpython/rlib/rstruct/test/test_ieee.py
+++ b/rpython/rlib/rstruct/test/test_ieee.py
@@ -1,3 +1,4 @@
+import math
import py
import sys
import random
@@ -5,7 +6,7 @@
from rpython.rlib.mutbuffer import MutableStringBuffer
from rpython.rlib.rstruct import ieee
-from rpython.rlib.rfloat import isnan, NAN, INFINITY
+from rpython.rlib.rfloat import NAN, INFINITY
from rpython.translator.c.test.test_genc import compile
@@ -30,7 +31,6 @@
assert f == ieee.float_unpack(h, 2)
def test_halffloat_overunderflow(self):
- import math
cases = [[670000, float('inf')], [-67000, -float('inf')],
[1e-08, 0], [-1e-8, -0.]]
for f1, f2 in cases:
@@ -176,7 +176,7 @@
# nans are tricky: we can't hope to reproduce the bit
# pattern exactly, so check_float will fail for a nan
# whose mantissa does not fit into float16's mantissa.
- if isnan(x) and (Q & mantissa_mask) >= 1 << 11:
+ if math.isnan(x) and (Q & mantissa_mask) >= 1 << 11:
continue
self.check_float(x)
@@ -189,7 +189,7 @@
for i in range(20):
val_to_preserve = exp | ((maxmant16 - i) << 42)
a = ieee.float_unpack(val_to_preserve, 8)
- assert isnan(a), 'i %d, maxmant %s' % (i, hex(val_to_preserve))
+ assert math.isnan(a), 'i %d, maxmant %s' % (i, hex(val_to_preserve))
b = ieee.float_pack(a, 8)
assert b == val_to_preserve, 'i %d, val %s b %s' % (i, hex(val_to_preserve), hex(b))
b = ieee.float_pack(a, 2)
@@ -214,14 +214,14 @@
def check_roundtrip(x, size):
s = c_pack(x, size)
- if not isnan(x):
+ if not math.isnan(x):
# pack uses copysign which is ambiguous for NAN
assert s == pack(x, size)
assert unpack(s) == x
assert c_unpack(s) == x
else:
- assert isnan(unpack(s))
- assert isnan(c_unpack(s))
+ assert math.isnan(unpack(s))
+ assert math.isnan(c_unpack(s))
for size in [2, 4, 8]:
check_roundtrip(123.4375, size)
diff --git a/rpython/rlib/special_value.py b/rpython/rlib/special_value.py
--- a/rpython/rlib/special_value.py
+++ b/rpython/rlib/special_value.py
@@ -1,5 +1,4 @@
import math
-from rpython.rlib.rfloat import isnan, isinf
# code to deal with special values (infinities, NaNs, ...)
#
@@ -13,9 +12,9 @@
ST_NAN = 6 # Not a Number
def special_type(d):
- if isnan(d):
+ if math.isnan(d):
return ST_NAN
- elif isinf(d):
+ elif math.isinf(d):
if d > 0.0:
return ST_PINF
else:
diff --git a/rpython/rlib/test/test_longlong2float.py b/rpython/rlib/test/test_longlong2float.py
--- a/rpython/rlib/test/test_longlong2float.py
+++ b/rpython/rlib/test/test_longlong2float.py
@@ -1,3 +1,4 @@
+import math
from rpython.translator.c.test.test_genc import compile
from rpython.rlib.longlong2float import longlong2float, float2longlong
from rpython.rlib.longlong2float import uint2singlefloat, singlefloat2uint
@@ -74,7 +75,6 @@
from rpython.rlib.longlong2float import encode_int32_into_longlong_nan
from rpython.rlib.longlong2float import decode_int32_from_longlong_nan
from rpython.rlib.longlong2float import is_int32_from_longlong_nan
- from rpython.rlib.rfloat import isnan
assert can_encode_float(f1)
assert can_encode_int32(i2)
l1 = float2longlong(f1)
@@ -82,7 +82,7 @@
assert not is_int32_from_longlong_nan(l1)
assert is_int32_from_longlong_nan(l2)
f1b = longlong2float(l1)
- assert f1b == f1 or (isnan(f1b) and isnan(f1))
+ assert f1b == f1 or (math.isnan(f1b) and math.isnan(f1))
assert decode_int32_from_longlong_nan(l2) == i2
return 42
diff --git a/rpython/rlib/test/test_rcomplex.py b/rpython/rlib/test/test_rcomplex.py
--- a/rpython/rlib/test/test_rcomplex.py
+++ b/rpython/rlib/test/test_rcomplex.py
@@ -1,7 +1,6 @@
from __future__ import with_statement
import rpython.rlib.rcomplex as c
-from rpython.rlib.rfloat import copysign, isnan, isinf
import os, sys, math, struct
@@ -120,12 +119,12 @@
"""
# special values testing
- if isnan(a):
- if isnan(b):
+ if math.isnan(a):
+ if math.isnan(b):
return
raise AssertionError(msg + '%r should be nan' % (b,))
- if isinf(a):
+ if math.isinf(a):
if a == b:
return
raise AssertionError(msg + 'finite result where infinity expected: '
@@ -136,8 +135,7 @@
# and b to have opposite signs; in practice these hardly ever
# occur).
if not a and not b:
- # only check it if we are running on top of CPython >= 2.6
- if sys.version_info >= (2, 6) and copysign(1., a) != copysign(1., b):
+ if math.copysign(1., a) != math.copysign(1., b):
raise AssertionError(msg + 'zero has wrong sign: expected %r, '
'got %r' % (a, b))
diff --git a/rpython/rlib/test/test_rfloat.py b/rpython/rlib/test/test_rfloat.py
--- a/rpython/rlib/test/test_rfloat.py
+++ b/rpython/rlib/test/test_rfloat.py
@@ -1,9 +1,9 @@
-import sys, py
+import sys, py, math
from rpython.rlib.rfloat import float_as_rbigint_ratio
from rpython.rlib.rfloat import round_away
from rpython.rlib.rfloat import round_double
-from rpython.rlib.rfloat import erf, erfc, gamma, lgamma, isnan
+from rpython.rlib.rfloat import erf, erfc, gamma, lgamma
from rpython.rlib.rfloat import ulps_check, acc_check
from rpython.rlib.rfloat import string_to_float
from rpython.rlib.rbigint import rbigint
@@ -171,9 +171,9 @@
accuracy_failure = None
if isinstance(got, float) and isinstance(expected, float):
- if isnan(expected) and isnan(got):
+ if math.isnan(expected) and math.isnan(got):
continue
- if not isnan(expected) and not isnan(got):
+ if not math.isnan(expected) and not math.isnan(got):
if fn == 'lgamma':
# we use a weaker accuracy test for lgamma;
# lgamma only achieves an absolute error of
diff --git a/rpython/rtyper/extfuncregistry.py b/rpython/rtyper/extfuncregistry.py
--- a/rpython/rtyper/extfuncregistry.py
+++ b/rpython/rtyper/extfuncregistry.py
@@ -27,12 +27,12 @@
_register = [ # (module, [(method name, arg types, return type), ...], ...)
(rfloat, [
- ('isinf', [float], bool),
- ('isnan', [float], bool),
('isfinite', [float], bool),
]),
(math, [
('copysign', [float, float], float),
+ ('isinf', [float], bool),
+ ('isnan', [float], bool),
('floor', [float], float),
('sqrt', [float], float),
('log', [float], float),
diff --git a/rpython/rtyper/lltypesystem/module/ll_math.py b/rpython/rtyper/lltypesystem/module/ll_math.py
--- a/rpython/rtyper/lltypesystem/module/ll_math.py
+++ b/rpython/rtyper/lltypesystem/module/ll_math.py
@@ -5,7 +5,7 @@
from rpython.translator import cdir
from rpython.rlib import jit, rposix
-from rpython.rlib.rfloat import INFINITY, NAN, isfinite, isinf, isnan
+from rpython.rlib.rfloat import INFINITY, NAN, isfinite
from rpython.rlib.rposix import UNDERSCORE_ON_WIN32
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.tool.sourcetools import func_with_new_name
@@ -147,13 +147,13 @@
Windows, FreeBSD and alpha Tru64 are amongst platforms that don't
always follow C99.
"""
- if isnan(x):
+ if math.isnan(x):
return NAN
if not isfinite(y):
- if isnan(y):
+ if math.isnan(y):
return NAN
- if isinf(x):
+ if math.isinf(x):
if math_copysign(1.0, x) == 1.0:
# atan2(+-inf, +inf) == +-pi/4
return math_copysign(0.25 * math.pi, y)
@@ -163,7 +163,7 @@
# atan2(+-inf, x) == +-pi/2 for finite x
return math_copysign(0.5 * math.pi, y)
- if isinf(x) or y == 0.0:
+ if math.isinf(x) or y == 0.0:
if math_copysign(1.0, x) == 1.0:
# atan2(+-y, +inf) = atan2(+-0, +x) = +-0.
return math_copysign(0.0, y)
@@ -211,7 +211,7 @@
else:
r = math_ldexp(x, exp)
errno = rposix.get_saved_errno()
- if isinf(r):
+ if math.isinf(r):
errno = ERANGE
if errno:
_likely_raise(errno, r)
@@ -222,7 +222,7 @@
# some platforms don't do the right thing for NaNs and
# infinities, so we take care of special cases directly.
if not isfinite(x):
- if isnan(x):
+ if math.isnan(x):
return (x, x)
else: # isinf(x)
return (math_copysign(0.0, x), x)
@@ -237,13 +237,13 @@
def ll_math_fmod(x, y):
# fmod(x, +/-Inf) returns x for finite x.
- if isinf(y) and isfinite(x):
+ if math.isinf(y) and isfinite(x):
return x
r = math_fmod(x, y)
errno = rposix.get_saved_errno()
- if isnan(r):
- if isnan(x) or isnan(y):
+ if math.isnan(r):
+ if math.isnan(x) or math.isnan(y):
errno = 0
else:
errno = EDOM
@@ -254,16 +254,16 @@
def ll_math_hypot(x, y):
# hypot(x, +/-Inf) returns Inf, even if x is a NaN.
- if isinf(x):
+ if math.isinf(x):
return math_fabs(x)
- if isinf(y):
+ if math.isinf(y):
return math_fabs(y)
r = math_hypot(x, y)
errno = rposix.get_saved_errno()
if not isfinite(r):
- if isnan(r):
- if isnan(x) or isnan(y):
+ if math.isnan(r):
+ if math.isnan(x) or math.isnan(y):
errno = 0
else:
errno = EDOM
@@ -281,18 +281,18 @@
# deal directly with IEEE specials, to cope with problems on various
# platforms whose semantics don't exactly match C99
- if isnan(y):
+ if math.isnan(y):
if x == 1.0:
return 1.0 # 1**Nan = 1
return y
if not isfinite(x):
- if isnan(x):
+ if math.isnan(x):
if y == 0.0:
return 1.0 # NaN**0 = 1
return x
else: # isinf(x)
- odd_y = not isinf(y) and math_fmod(math_fabs(y), 2.0) == 1.0
+ odd_y = not math.isinf(y) and math_fmod(math_fabs(y), 2.0) == 1.0
if y > 0.0:
if odd_y:
return x
@@ -304,7 +304,7 @@
return math_copysign(0.0, x)
return 0.0
- if isinf(y):
+ if math.isinf(y):
if math_fabs(x) == 1.0:
return 1.0
elif y > 0.0 and math_fabs(x) > 1.0:
@@ -319,7 +319,7 @@
r = math_pow(x, y)
errno = rposix.get_saved_errno()
if not isfinite(r):
- if isnan(r):
+ if math.isnan(r):
# a NaN result should arise only from (-ve)**(finite non-integer)
errno = EDOM
else: # isinf(r)
@@ -363,12 +363,12 @@
return math_log1p(x)
def ll_math_sin(x):
- if isinf(x):
+ if math.isinf(x):
raise ValueError("math domain error")
return math_sin(x)
def ll_math_cos(x):
- if isinf(x):
+ if math.isinf(x):
raise ValueError("math domain error")
return math_cos(x)
@@ -389,8 +389,8 @@
# Error checking fun. Copied from CPython 2.6
errno = rposix.get_saved_errno()
if not isfinite(r):
- if isnan(r):
- if isnan(x):
+ if math.isnan(r):
+ if math.isnan(x):
errno = 0
else:
errno = EDOM
diff --git a/rpython/rtyper/test/test_rfloat.py b/rpython/rtyper/test/test_rfloat.py
--- a/rpython/rtyper/test/test_rfloat.py
+++ b/rpython/rtyper/test/test_rfloat.py
@@ -162,11 +162,10 @@
assert self.interpret(fn, [0]) == 42.3
def test_isnan(self):
- from rpython.rlib import rfloat
def fn(x, y):
n1 = x * x
n2 = y * y * y
- return rfloat.isnan(n1 / n2)
+ return math.isnan(n1 / n2)
assert self.interpret(fn, [1e200, 1e200]) # nan
assert not self.interpret(fn, [1e200, 1.0]) # +inf
assert not self.interpret(fn, [1e200, -1.0]) # -inf
@@ -174,11 +173,10 @@
assert not self.interpret(fn, [42.5, -2.3]) # -finite
def test_isinf(self):
- from rpython.rlib import rfloat
def fn(x, y):
n1 = x * x
n2 = y * y * y
- return rfloat.isinf(n1 / n2)
+ return math.isinf(n1 / n2)
assert self.interpret(fn, [1e200, 1.0]) # +inf
assert self.interpret(fn, [1e200, -1.0]) # -inf
assert not self.interpret(fn, [1e200, 1e200]) # nan
diff --git a/rpython/rtyper/tool/test/test_rffi_platform.py b/rpython/rtyper/tool/test/test_rffi_platform.py
--- a/rpython/rtyper/tool/test/test_rffi_platform.py
+++ b/rpython/rtyper/tool/test/test_rffi_platform.py
@@ -1,4 +1,4 @@
-import py, sys, struct
+import py, sys, struct, math
from rpython.rtyper.tool import rffi_platform
from rpython.rtyper.lltypesystem import lltype
from rpython.rtyper.lltypesystem import rffi
@@ -7,7 +7,6 @@
from rpython.translator.platform import platform
from rpython.translator import cdir
from rpython.rlib.rarithmetic import r_uint, r_longlong, r_ulonglong
-from rpython.rlib.rfloat import isnan
def import_ctypes():
try:
@@ -126,7 +125,7 @@
value = rffi_platform.getdefineddouble('BLAH', '#define BLAH 1.0e50000')
assert value == float("inf")
value = rffi_platform.getdefineddouble('BLAH', '#define BLAH (double)0/0')
- assert isnan(value)
+ assert math.isnan(value)
def test_defined_constant_string():
value = rffi_platform.getdefinedstring('MCDONC', '')
diff --git a/rpython/translator/c/node.py b/rpython/translator/c/node.py
--- a/rpython/translator/c/node.py
+++ b/rpython/translator/c/node.py
@@ -1,3 +1,4 @@
+import math
from rpython.rtyper.lltypesystem.lltype import (Struct, Array, FixedSizeArray,
FuncType, typeOf, GcStruct, GcArray, RttiStruct, ContainerType, parentlink,
Void, OpaqueType, Float, RuntimeTypeInfo, getRuntimeTypeInfo, Char,
@@ -9,7 +10,7 @@
from rpython.translator.c.support import c_char_array_constant, barebonearray
from rpython.translator.c.primitive import PrimitiveType, name_signed
from rpython.rlib import exports, objectmodel
-from rpython.rlib.rfloat import isfinite, isinf
+from rpython.rlib.rfloat import isfinite
def needs_gcheader(gctransformer, T):
@@ -756,7 +757,7 @@
comma = ','
if typeOf(value) == Float and not isfinite(value):
db.late_initializations.append(('%s' % access_expr, db.get(value)))
- if isinf(value):
+ if math.isinf(value):
name = '-+'[value > 0] + 'inf'
else:
name = 'NaN'
diff --git a/rpython/translator/c/primitive.py b/rpython/translator/c/primitive.py
--- a/rpython/translator/c/primitive.py
+++ b/rpython/translator/c/primitive.py
@@ -3,7 +3,6 @@
from rpython.rlib.objectmodel import Symbolic, ComputedIntSymbolic, CDefinedIntSymbolic
from rpython.rlib.rarithmetic import r_longlong, is_emulated_long
-from rpython.rlib.rfloat import isinf, isnan
from rpython.rtyper.lltypesystem import rffi, llgroup
from rpython.rtyper.lltypesystem.llmemory import (Address, AddressOffset,
ItemOffset, ArrayItemsOffset, FieldOffset, CompositeOffset,
@@ -117,12 +116,12 @@
return math.copysign(1, value) > 0
def name_float(value, db):
- if isinf(value):
+ if math.isinf(value):
if value > 0:
return '(Py_HUGE_VAL)'
else:
return '(-Py_HUGE_VAL)'
- elif isnan(value):
+ elif math.isnan(value):
if is_positive_nan(value):
return '(Py_HUGE_VAL/Py_HUGE_VAL)'
else:
@@ -135,12 +134,12 @@
def name_singlefloat(value, db):
value = float(value)
- if isinf(value):
+ if math.isinf(value):
if value > 0:
return '((float)Py_HUGE_VAL)'
else:
return '((float)-Py_HUGE_VAL)'
- elif isnan(value):
+ elif math.isnan(value):
# XXX are these expressions ok?
if is_positive_nan(value):
return '((float)(Py_HUGE_VAL/Py_HUGE_VAL))'
diff --git a/rpython/translator/c/test/test_genc.py b/rpython/translator/c/test/test_genc.py
--- a/rpython/translator/c/test/test_genc.py
+++ b/rpython/translator/c/test/test_genc.py
@@ -390,7 +390,7 @@
assert res == 1.5
def test_infinite_float_in_array():
- from rpython.rlib.rfloat import INFINITY, NAN, isnan
+ from rpython.rlib.rfloat import INFINITY, NAN
lst = [INFINITY, -INFINITY, NAN]
def fn(i):
return lst[i]
@@ -400,19 +400,19 @@
res = f1(1)
assert res == -INFINITY
res = f1(2)
- assert isnan(res)
+ assert math.isnan(res)
def test_nan_and_special_values():
- from rpython.rlib.rfloat import isnan, isinf, isfinite
+ from rpython.rlib.rfloat import isfinite
inf = 1e300 * 1e300
- assert isinf(inf)
+ assert math.isinf(inf)
nan = inf/inf
- assert isnan(nan)
+ assert math.isnan(nan)
for value, checker in [
- (inf, lambda x: isinf(x) and x > 0.0),
- (-inf, lambda x: isinf(x) and x < 0.0),
- (nan, isnan),
+ (inf, lambda x: math.isinf(x) and x > 0.0),
+ (-inf, lambda x: math.isinf(x) and x < 0.0),
+ (nan, math.isnan),
(42.0, isfinite),
(0.0, lambda x: not x and math.copysign(1., x) == 1.),
(-0.0, lambda x: not x and math.copysign(1., x) == -1.),
More information about the pypy-commit
mailing list