Long story short: for creating a series that contains the minimum between x and y the shortest way we have is to use

<hansl>
series m = x < y ? x : y
</hansl>

which is nice, but I just realised that maybe some people would find it more intuitive to use the xmin() function, as in "series m = xmin(x, y)". The function, however, is at present scalar-only.

So I wrote a patch to extend xmin() and xmax() to series, matrices and scalars, pretty much in the same way atan2() works. The patch is attached.

Comments are obviously welcome. If nobody stops me, I'll push the change to git master tomorrow.

-------------------------------------------------------
  Riccardo (Jack) Lucchetti
  Dipartimento di Scienze Economiche e Sociali (DiSES)

  Università Politecnica delle Marche
  (formerly known as Università di Ancona)

  r.lucche...@univpm.it
  http://www2.econ.univpm.it/servizi/hpp/lucchetti
-------------------------------------------------------
diff --git a/doc/commands/gretl_functions_en.xml b/doc/commands/gretl_functions_en.xml
index 93f3f75bc..effdd17d6 100644
--- a/doc/commands/gretl_functions_en.xml
+++ b/doc/commands/gretl_functions_en.xml
@@ -14817,8 +14817,8 @@ d =  8.0000000
 
     <function name="xmax" section="math" output="scalar">
       <fnargs>
-	<fnarg type="scalar">x</fnarg>
-	<fnarg type="scalar">y</fnarg>
+	<fnarg type="anyfloat">x</fnarg>
+	<fnarg type="anyfloat">y</fnarg>
       </fnargs>
       <description>
 	<para>
@@ -14838,8 +14838,8 @@ d =  8.0000000
 
     <function name="xmin" section="math" output="scalar">
       <fnargs>
-	<fnarg type="scalar">x</fnarg>
-	<fnarg type="scalar">y</fnarg>
+	<fnarg type="anyfloat">x</fnarg>
+	<fnarg type="anyfloat">y</fnarg>
       </fnargs>
       <description>
 	<para>
diff --git a/doc/commands/gretl_functions_it.xml b/doc/commands/gretl_functions_it.xml
index d674682d9..5ed45be7e 100644
--- a/doc/commands/gretl_functions_it.xml
+++ b/doc/commands/gretl_functions_it.xml
@@ -14888,8 +14888,8 @@ d =  8.0000000
 
     <function name="xmax" section="math" output="scalar">
       <fnargs>
-	<fnarg type="scalar">x</fnarg>
-	<fnarg type="scalar">y</fnarg>
+	<fnarg type="anyfloat">x</fnarg>
+	<fnarg type="anyfloat">y</fnarg>
       </fnargs>
       <description>
 	<para>
@@ -14909,8 +14909,8 @@ d =  8.0000000
 
     <function name="xmin" section="math" output="scalar">
       <fnargs>
-	<fnarg type="scalar">x</fnarg>
-	<fnarg type="scalar">y</fnarg>
+	<fnarg type="anyfloat">x</fnarg>
+	<fnarg type="anyfloat">y</fnarg>
       </fnargs>
       <description>
 	<para>
diff --git a/lib/src/geneval.c b/lib/src/geneval.c
index 12432cd4a..5e3be9b60 100644
--- a/lib/src/geneval.c
+++ b/lib/src/geneval.c
@@ -6197,6 +6197,18 @@ static NODE *flexible_2arg_node (NODE *l, NODE *r, int f, parser *p)
                 if (p->err) {
                     break;
                 }
+            } else if (f == F_XMIN) {
+		if (na(x1) || na(x2)) {
+		    y = NADBL;
+		} else {
+		    y = (x1 < x2) ? x1 : x2;
+		}
+            } else if (f == F_XMAX) {
+		if (na(x1) || na(x2)) {
+		    y = NADBL;
+		} else {
+		    y = (x1 > x2) ? x1 : x2;
+		}
             }
             node_set_double(ret, i, y, p);
         }
@@ -17398,11 +17410,7 @@ static NODE *two_scalars_func (NODE *l, NODE *r, int t, parser *p)
         double xr = node_get_scalar(r, p);
 
         if (!na(xl) && !na(xr)) {
-            if (t == F_XMIN) {
-                ret->v.xval = (xl < xr)? xl : xr;
-            } else if (t == F_XMAX) {
-                ret->v.xval = (xl > xr)? xl : xr;
-            } else if (t == F_RANDINT) {
+            if (t == F_RANDINT) {
                 int k;
 
                 p->err = gretl_rand_int_minmax(&k, 1, xl, xr);
@@ -18276,6 +18284,8 @@ static NODE *eval (NODE *t, parser *p)
             p->err = E_TYPES;
         }
         break;
+    case F_XMIN:
+    case F_XMAX:
     case F_ATAN2:
     case F_BINCOEFF:
         if ((l->t == NUM || l->t == MAT || l->t == SERIES) &&
@@ -19003,8 +19013,6 @@ static NODE *eval (NODE *t, parser *p)
             p->err = E_TYPES;
         }
         break;
-    case F_XMIN:
-    case F_XMAX:
     case F_RANDINT:
     case F_KPSSCRIT:
         /* two scalars */
_______________________________________________
Gretl-devel mailing list -- gretl-devel@gretlml.univpm.it
To unsubscribe send an email to gretl-devel-le...@gretlml.univpm.it
Website: 
https://gretlml.univpm.it/postorius/lists/gretl-devel.gretlml.univpm.it/

Reply via email to