SF bug #477221: abs and divmod act oddly with -0.0.
Partial fix.
float_abs():  ensure abs(-0.0) returns +0.0.
Bugfix candidate.
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index b8c3772..82aa963 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -114,7 +114,7 @@
 		}
 		if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
 					    PyUnicode_GET_SIZE(v),
-					    s_buffer, 
+					    s_buffer,
 					    NULL))
 			return NULL;
 		s = s_buffer;
@@ -196,16 +196,16 @@
 	PyNumberMethods *nb;
 	PyFloatObject *fo;
 	double val;
-	
+
 	if (op && PyFloat_Check(op))
 		return PyFloat_AS_DOUBLE((PyFloatObject*) op);
-	
+
 	if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
 	    nb->nb_float == NULL) {
 		PyErr_BadArgument();
 		return -1;
 	}
-	
+
 	fo = (PyFloatObject*) (*nb->nb_float) (op);
 	if (fo == NULL)
 		return -1;
@@ -214,10 +214,10 @@
 				"nb_float should return float object");
 		return -1;
 	}
-	
+
 	val = PyFloat_AS_DOUBLE(fo);
 	Py_DECREF(fo);
-	
+
 	return val;
 }
 
@@ -505,7 +505,7 @@
 		else
 			ix = 1.0;
 		PyFPE_END_PROTECT(ix)
-		return PyFloat_FromDouble(ix); 
+		return PyFloat_FromDouble(ix);
 	}
 	if (iv == 0.0) {  /* 0**w is error if w<0, else 1 */
 		if (iw < 0.0) {
@@ -537,7 +537,7 @@
 float_int_div(PyObject *v, PyObject *w)
 {
 	PyObject *t, *r;
-	
+
 	t = float_divmod(v, w);
 	if (t != NULL) {
 		r = PyTuple_GET_ITEM(t, 0);
@@ -570,8 +570,10 @@
 {
 	if (v->ob_fval < 0)
 		return float_neg(v);
-	else
+	else if (v->ob_fval > 0)
 		return float_pos(v);
+	else /* ensure abs(-0) is +0 */
+		return PyFloat_FromDouble(+0.0);
 }
 
 static int