[pypy-svn] pypy shorter-float-repr: repr(inf), repr(nan)
amauryfa
commits-noreply at bitbucket.org
Fri Jan 21 01:12:51 CET 2011
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: shorter-float-repr
Changeset: r41105:431218e0b43b
Date: 2011-01-21 00:31 +0100
http://bitbucket.org/pypy/pypy/changeset/431218e0b43b/
Log: repr(inf), repr(nan)
diff --git a/pypy/rpython/module/ll_dtoa.py b/pypy/rpython/module/ll_dtoa.py
--- a/pypy/rpython/module/ll_dtoa.py
+++ b/pypy/rpython/module/ll_dtoa.py
@@ -52,32 +52,50 @@
with lltype.scoped_alloc(rffi.INTP.TO, 1) as decpt_ptr:
with lltype.scoped_alloc(rffi.INTP.TO, 1) as sign_ptr:
with lltype.scoped_alloc(rffi.CCHARPP.TO, 1) as end_ptr:
- output_ptr = dg_dtoa(value, mode, precision,
+ digits = dg_dtoa(value, mode, precision,
decpt_ptr, sign_ptr, end_ptr)
try:
- if sign_ptr[0] == 1:
+ buflen = (rffi.cast(rffi.LONG, end_ptr[0]) -
+ rffi.cast(rffi.LONG, digits))
+ sign = rffi.cast(lltype.Signed, sign_ptr[0])
+
+ # Handle nan and inf
+ if buflen and not digits[0].isdigit():
+ if digits[0] == 'i' or digits[0] == 'I':
+ if sign == 1:
+ builder.append('-')
+ elif flags & rarithmetic.DTSF_SIGN:
+ builder.append('+')
+ builder.append('inf')
+ elif digits[0] == 'n' or digits[0] == 'N':
+ builder.append('nan')
+ else:
+ # shouldn't get here
+ raise ValueError
+ return builder.build()
+
+ if sign == 1:
builder.append('-')
elif flags & rarithmetic.DTSF_SIGN:
builder.append('+')
- buflen = (rffi.cast(rffi.LONG, end_ptr[0]) -
- rffi.cast(rffi.LONG, output_ptr))
+
intpart = rffi.cast(lltype.Signed, decpt_ptr[0])
if intpart <= buflen:
- builder.append(rffi.charpsize2str(output_ptr, intpart))
+ builder.append(rffi.charpsize2str(digits, intpart))
else:
- builder.append(rffi.charpsize2str(output_ptr, buflen))
+ builder.append(rffi.charpsize2str(digits, buflen))
while buflen < intpart:
builder.append('0')
intpart -= 1
fracpart = buflen - intpart
if fracpart > 0:
builder.append('.')
- ptr = rffi.ptradd(output_ptr, intpart)
+ ptr = rffi.ptradd(digits, intpart)
builder.append(rffi.charpsize2str(ptr, fracpart))
elif flags & rarithmetic.DTSF_ADD_DOT_0:
builder.append('.0')
finally:
- dg_freedtoa(output_ptr)
+ dg_freedtoa(digits)
return builder.build()
def llimpl_strtod(value, code, precision, flags):
diff --git a/pypy/rpython/module/test/test_ll_dtoa.py b/pypy/rpython/module/test/test_ll_dtoa.py
--- a/pypy/rpython/module/test/test_ll_dtoa.py
+++ b/pypy/rpython/module/test/test_ll_dtoa.py
@@ -14,3 +14,7 @@
assert dtoa(12.3577) == "12.3577"
assert dtoa(10.0) == "10"
assert dtoa(1.0e100) == "1" + "0" * 100
+
+ assert dtoa(rarithmetic.INFINITY) == 'inf'
+ assert dtoa(-rarithmetic.INFINITY) == '-inf'
+ assert dtoa(rarithmetic.NAN) == 'nan'
More information about the Pypy-commit
mailing list