[pypy-svn] r75724 - in pypy/branch/fast-forward/pypy: objspace/std rlib/rstruct rpython/lltypesystem/module
benjamin at codespeak.net
benjamin at codespeak.net
Thu Jul 1 18:42:03 CEST 2010
Author: benjamin
Date: Thu Jul 1 18:42:02 2010
New Revision: 75724
Modified:
pypy/branch/fast-forward/pypy/objspace/std/marshal_impl.py
pypy/branch/fast-forward/pypy/rlib/rstruct/ieee.py
pypy/branch/fast-forward/pypy/rpython/lltypesystem/module/ll_math.py
Log:
revert revert
Modified: pypy/branch/fast-forward/pypy/objspace/std/marshal_impl.py
==============================================================================
--- pypy/branch/fast-forward/pypy/objspace/std/marshal_impl.py (original)
+++ pypy/branch/fast-forward/pypy/objspace/std/marshal_impl.py Thu Jul 1 18:42:02 2010
@@ -169,11 +169,11 @@
def pack_float(f):
result = []
- ieee.pack_float8(result, f)
+ ieee.pack_float(result, f, 8, False)
return ''.join(result)
def unpack_float(s):
- return ieee.unpack_float8(s)
+ return ieee.unpack_float(s, False)
def marshal_w__Float(space, w_float, m):
if m.version > 1:
Modified: pypy/branch/fast-forward/pypy/rlib/rstruct/ieee.py
==============================================================================
--- pypy/branch/fast-forward/pypy/rlib/rstruct/ieee.py (original)
+++ pypy/branch/fast-forward/pypy/rlib/rstruct/ieee.py Thu Jul 1 18:42:02 2010
@@ -3,124 +3,7 @@
"""
import math
-from pypy.rlib.rarithmetic import r_longlong, r_ulonglong, isinf, isnan, INFINITY, NAN
-
-
-def py3round(x):
- """Python 3 round function semantics, in Python 2 code.
-
- We want to round x to the nearest int, but:
- - return an int, not a float
- - do round-half-to-even, not round-half-away-from-zero.
-
- We assume that x is finite and nonnegative.
-
- """
- int_part = r_ulonglong(x)
- frac_part = x - int_part
- if frac_part > 0.5 or frac_part == 0.5 and (int_part & 1):
- int_part += 1
- return int_part
-
-
-def float_pack(x, size):
- """Convert a Python float x into a 64-bit unsigned integer
- with the same byte representation."""
-
- if size == 8:
- MIN_EXP = -1021 # = sys.float_info.min_exp
- MAX_EXP = 1024 # = sys.float_info.max_exp
- MANT_DIG = 53 # = sys.float_info.mant_dig
- elif size == 4:
- MIN_EXP = -125 # C's FLT_MIN_EXP
- MAX_EXP = 128 # FLT_MAX_EXP
- MANT_DIG = 24 # FLT_MANT_DIG
- else:
- raise ValueError("invalid size value")
-
- sign = math.copysign(1.0, x) < 0.0
- if isinf(x):
- mant = 0
- exp = MAX_EXP - MIN_EXP + 2
- elif isnan(x):
- mant = 1 << (MANT_DIG-2)
- exp = MAX_EXP - MIN_EXP + 2
- elif x == 0.0:
- mant = 0
- exp = 0
- else:
- m, e = math.frexp(abs(x))
- if e < MIN_EXP:
- # Subnormal result (or possibly smallest normal, after rounding).
- if e < MIN_EXP - MANT_DIG:
- # Underflow to zero; not possible when size == 8.
- mant = r_ulonglong(0)
- else:
- # For size == 8, can substitute 'int' for 'py3round', both
- # here and below: the argument will always be integral.
- mant = py3round(m * (1 << e - (MIN_EXP - MANT_DIG)))
- exp = 0
- elif e > MAX_EXP:
- # Overflow to infinity: not possible when size == 8.
- raise OverflowError("float too large to pack with f format")
- else:
- mant = py3round(m * (1 << MANT_DIG))
- exp = e - MIN_EXP
- # N.B. It's important that the + mant really is an addition, not just a
- # bitwise 'or'. In extreme cases, mant may have MANT_DIG+1 significant
- # bits, as a result of rounding.
- return ((sign << 8*size - 1) | (exp << MANT_DIG - 1)) + mant
-
-
-def float_unpack(Q, size):
- """Convert a 32-bit or 64-bit integer created
- by float_pack into a Python float."""
-
- if size == 8:
- MIN_EXP = -1021 # = sys.float_info.min_exp
- MAX_EXP = 1024 # = sys.float_info.max_exp
- MANT_DIG = 53 # = sys.float_info.mant_dig
- elif size == 4:
- MIN_EXP = -125 # C's FLT_MIN_EXP
- MAX_EXP = 128 # FLT_MAX_EXP
- MANT_DIG = 24 # FLT_MANT_DIG
- else:
- raise ValueError("invalid size value")
-
- # extract pieces
- sign = Q >> 8*size - 1
- Q -= sign << 8*size - 1
- exp = Q >> MANT_DIG - 1
- Q -= exp << MANT_DIG - 1
- mant = Q
-
- if exp == MAX_EXP - MIN_EXP + 2:
- # nan or infinity
- result = float('nan') if mant else float('inf')
- elif exp == 0:
- # subnormal or zero
- result = math.ldexp(float(mant), MIN_EXP - MANT_DIG)
- else:
- # normal
- exp -= 1
- mant += 1 << MANT_DIG - 1
- result = math.ldexp(float(mant), exp + MIN_EXP - MANT_DIG)
- return -result if sign else result
-
-
-def pack_float8(result, x):
- unsigned = float_pack(x, 8)
- for i in range(8):
- result.append(chr((unsigned >> (i * 8)) & 0xFF))
-
-
-def unpack_float8(s):
- unsigned = r_ulonglong(0)
- for i in range(8):
- unsigned |= ord(s[7 - i]) << (i * 8)
- print unsigned
- return float_unpack(unsigned, 8)
-
+from pypy.rlib.rarithmetic import r_longlong, isinf, isnan, INFINITY, NAN
def pack_float(result, number, size, bigendian):
"""Append to 'result' the 'size' characters of the 32-bit or 64-bit
Modified: pypy/branch/fast-forward/pypy/rpython/lltypesystem/module/ll_math.py
==============================================================================
--- pypy/branch/fast-forward/pypy/rpython/lltypesystem/module/ll_math.py (original)
+++ pypy/branch/fast-forward/pypy/rpython/lltypesystem/module/ll_math.py Thu Jul 1 18:42:02 2010
@@ -36,8 +36,6 @@
math_fmod = llexternal('fmod', [rffi.DOUBLE, rffi.DOUBLE], rffi.DOUBLE)
math_hypot = llexternal(underscore + 'hypot',
[rffi.DOUBLE, rffi.DOUBLE], rffi.DOUBLE)
-math_isnan = llexternal('isnan', [rffi.DOUBLE], rffi.INT)
-math_isinf = llexternal('isinf', [rffi.DOUBLE], rffi.INT)
# ____________________________________________________________
#
More information about the Pypy-commit
mailing list