expressions: Add support for 2- and 3-operand RND function.
[pspp] / src / language / expressions / helpers.c
index ac17c1cece19ce842bde63ae9495daac3d6e0109..5aad13eb160b5f3f160481fcdaefa30a92b05354 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2008, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2008, 2010, 2011, 2015 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
 
 #include <config.h>
-#include "helpers.h"
+
+#include "language/expressions/helpers.h"
+
 #include <gsl/gsl_roots.h>
 #include <gsl/gsl_sf.h>
-#include <libpspp/assertion.h>
-#include <libpspp/pool.h>
-#include "private.h"
+
+#include "language/expressions/private.h"
+#include "libpspp/assertion.h"
+#include "libpspp/pool.h"
 
 const struct substring empty_string = {NULL, 0};
 
@@ -172,12 +175,13 @@ recognize_unit (struct substring name, enum date_unit *unit)
         return true;
       }
 
-  /* TRANSLATORS: Don't translate the the actual unit names `weeks', `days' etc
-       They must remain in their original English. */
   msg (SE, _("Unrecognized date unit `%.*s'.  "
-             "Valid date units are `years', `quarters', `months', "
-             "`weeks', `days', `hours', `minutes', and `seconds'."),
-       (int) ss_length (name), ss_data (name));
+             "Valid date units are `%s', `%s', `%s', "
+             "`%s', `%s', `%s', `%s', and `%s'."),
+       (int) ss_length (name), ss_data (name),
+       "years", "quarters", "months",
+       "weeks", "days", "hours", "minutes", "seconds");
+
   return false;
 }
 
@@ -325,7 +329,7 @@ recognize_method (struct substring method_name, enum date_sum_method *method)
   else
     {
       msg (SE, _("Invalid DATESUM method.  "
-                 "Valid choices are `closest' and `rollover'."));
+                 "Valid choices are `%s' and `%s'."), "closest", "rollover");
       return false;
     }
 }
@@ -657,3 +661,17 @@ npdf_beta (double x, double a, double b, double lambda)
       return sum;
     }
 }
+
+double
+round_nearest (double x, double mult, double fuzzbits)
+{
+  double adjustment;
+
+  if (fuzzbits <= 0)
+    fuzzbits = settings_get_fuzzbits ();
+  adjustment = .5 + exp2 (fuzzbits - DBL_MANT_DIG);
+
+  x /= mult;
+  x = x >= 0. ? floor (x + adjustment) : -floor (-x + adjustment);
+  return x * mult;
+}