2011/9/17 Masahiro TANAKA <masa16.tanaka / gmail.com>:
> --- numeric.c =A0 (revision 33288)
> +++ numeric.c =A0 (working copy)
> @@ -1690,8 +1690,16 @@
> =A0 =A0 =A0 =A0}
> =A0 =A0 =A0 =A0else {
> =A0 =A0 =A0 =A0 =A0 =A0if (err>0.5) err=3D0.5;
> - =A0 =A0 =A0 =A0 =A0 n =3D floor(n + err);
> - =A0 =A0 =A0 =A0 =A0 if (!excl || ((long)n)*unit+beg < end) n++;
> + =A0 =A0 =A0 =A0 =A0 if (excl) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (n>0) {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (n<err)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 n =3D 1;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 n =3D floor(n - err) + 1;
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> + =A0 =A0 =A0 =A0 =A0 } else {
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 n =3D floor(n + err) + 1;
> + =A0 =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 =A0 =A0for (i=3D0; i<n; i++) {
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0rb_yield(DBL2NUM(i*unit+beg));
> =A0 =A0 =A0 =A0 =A0 =A0}

This patch involves a problem:
 a=3D(1.0..1-2e-16).step(1.0).to_a; p a #=3D> [1.0] ; should be []

The following patch would be better.

--- numeric.c	(revision 33377)
+++ numeric.c	(working copy)
@@ -1690,9 +1690,18 @@
 	}
 	else {
 	    if (err>0.5) err=3D0.5;
-	    n =3D floor(n + err);
-	    if (!excl || ((long)n)*unit+beg < end) n++;
-	    for (i=3D0; i<n; i++) {
+	    if (excl) {
+		if (n<=3D0) return TRUE;
+		if (n<1)
+		    n =3D 0;
+		else
+		    n =3D floor(n - err);
+	    }
+	    else {
+		if (n<0) return TRUE;
+		n =3D floor(n + err);
+	    }
+	    for (i=3D0; i<=3Dn; i++) {
 		rb_yield(DBL2NUM(i*unit+beg));
 	    }
 	}

Masahiro Tanaka