@@ -322,16 +322,49 @@ complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
322322{
323323 char format [32 ];
324324 if (v -> cval .real == 0. ) {
325- PyOS_snprintf (format , sizeof (format ), "%%.%ig" , precision );
326- PyOS_ascii_formatd (buf , bufsz - 1 , format , v -> cval .imag );
327- strncat (buf , "j" , 1 );
325+ if (!Py_IS_FINITE (v -> cval .imag )) {
326+ if (Py_IS_NAN (v -> cval .imag ))
327+ strncpy (buf , "nan*j" , 6 );
328+ /* else if (copysign(1, v->cval.imag) == 1) */
329+ else if (v -> cval .imag > 0 )
330+ strncpy (buf , "inf*j" , 6 );
331+ else
332+ strncpy (buf , "-inf*j" , 7 );
333+ }
334+ else {
335+ PyOS_snprintf (format , sizeof (format ), "%%.%ig" , precision );
336+ PyOS_ascii_formatd (buf , bufsz - 1 , format , v -> cval .imag );
337+ strncat (buf , "j" , 1 );
338+ }
328339 } else {
329340 char re [64 ], im [64 ];
330341 /* Format imaginary part with sign, real part without */
331- PyOS_snprintf (format , sizeof (format ), "%%.%ig" , precision );
332- PyOS_ascii_formatd (re , sizeof (re ), format , v -> cval .real );
333- PyOS_snprintf (format , sizeof (format ), "%%+.%ig" , precision );
334- PyOS_ascii_formatd (im , sizeof (im ), format , v -> cval .imag );
342+ if (!Py_IS_FINITE (v -> cval .real )) {
343+ if (Py_IS_NAN (v -> cval .real ))
344+ strncpy (re , "nan" , 4 );
345+ /* else if (copysign(1, v->cval.real) == 1) */
346+ else if (v -> cval .real > 0 )
347+ strncpy (re , "inf" , 4 );
348+ else
349+ strncpy (re , "-inf" , 5 );
350+ }
351+ else {
352+ PyOS_snprintf (format , sizeof (format ), "%%.%ig" , precision );
353+ PyOS_ascii_formatd (re , sizeof (re ), format , v -> cval .real );
354+ }
355+ if (!Py_IS_FINITE (v -> cval .imag )) {
356+ if (Py_IS_NAN (v -> cval .imag ))
357+ strncpy (im , "+nan*" , 6 );
358+ /* else if (copysign(1, v->cval.imag) == 1) */
359+ else if (v -> cval .imag > 0 )
360+ strncpy (im , "+inf*" , 6 );
361+ else
362+ strncpy (im , "-inf*" , 6 );
363+ }
364+ else {
365+ PyOS_snprintf (format , sizeof (format ), "%%+.%ig" , precision );
366+ PyOS_ascii_formatd (im , sizeof (im ), format , v -> cval .imag );
367+ }
335368 PyOS_snprintf (buf , bufsz , "(%s%sj)" , re , im );
336369 }
337370}
0 commit comments