summaryrefslogtreecommitdiffstats
path: root/Objects/complexobject.c
diff options
context:
space:
mode:
authorChristian Heimes <christian@cheimes.de>2008-02-15 06:57:08 (GMT)
committerChristian Heimes <christian@cheimes.de>2008-02-15 06:57:08 (GMT)
commit2f0da53d28b316197a94919c96195a514acc668f (patch)
tree356767fd79a5b8ec669d9c88cffc86a534858f63 /Objects/complexobject.c
parente247f0037f87d9e0a2582d0beb941fba6357454d (diff)
downloadcpython-2f0da53d28b316197a94919c96195a514acc668f.zip
cpython-2f0da53d28b316197a94919c96195a514acc668f.tar.gz
cpython-2f0da53d28b316197a94919c96195a514acc668f.tar.bz2
Fixed repr() and str() of complex numbers. Complex suffered from the same problem as floats but I forgot to test and fix them.
Diffstat (limited to 'Objects/complexobject.c')
-rw-r--r--Objects/complexobject.c47
1 files changed, 40 insertions, 7 deletions
diff --git a/Objects/complexobject.c b/Objects/complexobject.c
index 4777ed1..c87b9e8 100644
--- a/Objects/complexobject.c
+++ b/Objects/complexobject.c
@@ -322,16 +322,49 @@ complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
{
char format[32];
if (v->cval.real == 0.) {
- PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
- PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
- strncat(buf, "j", 1);
+ if (!Py_IS_FINITE(v->cval.imag)) {
+ if (Py_IS_NAN(v->cval.imag))
+ strncpy(buf, "nan*j", 6);
+ /* else if (copysign(1, v->cval.imag) == 1) */
+ else if (v->cval.imag > 0)
+ strncpy(buf, "inf*j", 6);
+ else
+ strncpy(buf, "-inf*j", 7);
+ }
+ else {
+ PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
+ PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
+ strncat(buf, "j", 1);
+ }
} else {
char re[64], im[64];
/* Format imaginary part with sign, real part without */
- PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
- PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
- PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
- PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
+ if (!Py_IS_FINITE(v->cval.real)) {
+ if (Py_IS_NAN(v->cval.real))
+ strncpy(re, "nan", 4);
+ /* else if (copysign(1, v->cval.real) == 1) */
+ else if (v->cval.real > 0)
+ strncpy(re, "inf", 4);
+ else
+ strncpy(re, "-inf", 5);
+ }
+ else {
+ PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
+ PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
+ }
+ if (!Py_IS_FINITE(v->cval.imag)) {
+ if (Py_IS_NAN(v->cval.imag))
+ strncpy(im, "+nan*", 6);
+ /* else if (copysign(1, v->cval.imag) == 1) */
+ else if (v->cval.imag > 0)
+ strncpy(im, "+inf*", 6);
+ else
+ strncpy(im, "-inf*", 6);
+ }
+ else {
+ PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
+ PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
+ }
PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
}
}