[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