diff --git a/src/port/rint.c b/src/port/rint.c
index 9c4d775..7e1a317 100644
--- a/src/port/rint.c
+++ b/src/port/rint.c
@@ -12,8 +12,25 @@
 
 #include <math.h>
 
+static double
+copysign(double x, double y)
+{
+	return y == 0.0 ? fabs(x) : fabs(x) * y / fabs(y);
+}
+
 double
 rint(double x)
 {
-	return (x >= 0.0) ? floor(x + 0.5) : ceil(x - 0.5);
+	double r;
+	if (copysign(1.0, x) < 0.0)
+	{
+		r = floor(x += 0.5);
+		if (r != x || x == 0.0)
+			return x >= 0.0 ? -0.0 : r;
+		return floor(x * 0.5) * 2.0;
+	}
+	r = ceil(x -= 0.5);
+	if (r != x)
+		return x <= 0.0 ? 0.0 : r;
+	return ceil(x * 0.5) * 2.0;
 }
