new seq from plan 9 (Anthony Martin)
diff --git a/src/cmd/seq.c b/src/cmd/seq.c
index 062bb8a..9fde9ef 100644
--- a/src/cmd/seq.c
+++ b/src/cmd/seq.c
@@ -18,19 +18,19 @@
 void
 buildfmt(void)
 {
-	int i;
 	char *dp;
 	int w, p, maxw, maxp;
 	static char fmt[16];
 	char buf[32];
+	double val;
 
 	format = "%g\n";
 	if(!constant)
 		return;
 	maxw = 0;
 	maxp = 0;
-	for(i=0; i<=nsteps; i++){
-		sprint(buf, "%g", min+i*incr);
+	for(val = min; val <= max; val += incr){
+		sprint(buf, "%g", val);
 		if(strchr(buf, 'e')!=0)
 			return;
 		dp = strchr(buf,'.');
@@ -49,8 +49,9 @@
 
 void
 main(int argc, char *argv[]){
-	int i, j, n;
+	int j, n;
 	char buf[256], ffmt[4096];
+	double val;
 
 	ARGBEGIN{
 	case 'w':
@@ -78,15 +79,24 @@
 		fprint(2, "seq: zero increment\n");
 		exits("zero increment");
 	}
-	nsteps = (max-min)/incr+.5;
 	if(!format)
 		buildfmt();
-	for(i=0; i<=nsteps; i++){
-		n = sprint(buf, format, min+i*incr);
-		if(constant)
-			for(j=0; buf[j]==' '; j++)
-				buf[j] ='0';
-		write(1, buf, n);
+	if(incr > 0){
+		for(val = min; val <= max; val += incr){
+			n = sprint(buf, format, val);
+			if(constant)
+				for(j=0; buf[j]==' '; j++)
+					buf[j] ='0';
+			write(1, buf, n);
+		}
+	}else{
+		for(val = min; val >= max; val += incr){
+			n = sprint(buf, format, val);
+			if(constant)
+				for(j=0; buf[j]==' '; j++)
+					buf[j] ='0';
+			write(1, buf, n);
+		}
 	}
 	exits(0);
 }