aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew J. Schorr <aschorr@telemetry-investments.com>2018-02-11 15:28:09 -0500
committerAndrew J. Schorr <aschorr@telemetry-investments.com>2018-02-11 15:28:09 -0500
commit77f8c28bf85699553947ab12f54ea742c300dd00 (patch)
tree9f91bf8cc06177fe38ad88fc3366c68005577389
parentc456bfb67cdfd71b869d059ce50335ef80c2c271 (diff)
downloadegawk-77f8c28bf85699553947ab12f54ea742c300dd00.tar.gz
egawk-77f8c28bf85699553947ab12f54ea742c300dd00.tar.bz2
egawk-77f8c28bf85699553947ab12f54ea742c300dd00.zip
Add warning to intdiv extension when loss of precision may occur.
-rw-r--r--extension/ChangeLog5
-rw-r--r--extension/intdiv.c15
2 files changed, 18 insertions, 2 deletions
diff --git a/extension/ChangeLog b/extension/ChangeLog
index 83d43729..51bd7b71 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,8 @@
+2018-02-11 Andrew J. Schorr <aschorr@telemetry-investments.com>
+
+ * intdiv.c (do_intdiv): Print a warning about loss of precision if
+ MPFR arguments are received when not compiled with MPFR support.
+
2018-02-08 Andrew J. Schorr <aschorr@telemetry-investments.com>
* configure.ac (pkgextensiondir): This must be set to
diff --git a/extension/intdiv.c b/extension/intdiv.c
index 529ea361..bd0919cc 100644
--- a/extension/intdiv.c
+++ b/extension/intdiv.c
@@ -126,11 +126,21 @@ do_intdiv(int nargs, awk_value_t *result, struct awk_ext_func *unused)
clear_array(array);
#ifdef HAVE_MPFR
- if (nv.num_type == AWK_NUMBER_TYPE_DOUBLE && dv.num_type == AWK_NUMBER_TYPE_DOUBLE) {
+ if (nv.num_type == AWK_NUMBER_TYPE_DOUBLE && dv.num_type == AWK_NUMBER_TYPE_DOUBLE)
#endif
+ {
/* regular precision */
double num, denom, quotient, remainder;
+#ifndef HAVE_MPFR
+ if (nv.num_type != AWK_NUMBER_TYPE_DOUBLE || dv.num_type != AWK_NUMBER_TYPE_DOUBLE) {
+ static int warned = 0;
+ if (!warned) {
+ warning(ext_id, _("intdiv: MPFR arguments converted to IEEE because this extension was not compiled with MPFR support; loss of precision may occur"));
+ warned = 1;
+ }
+ }
+#endif
num = double_to_int(nv.num_value);
denom = double_to_int(dv.num_value);
@@ -150,8 +160,9 @@ do_intdiv(int nargs, awk_value_t *result, struct awk_ext_func *unused)
array_set_number(array, "quotient", 8, quotient);
array_set_number(array, "remainder", 9, remainder);
+ }
#ifdef HAVE_MPFR
- } else {
+ else {
/* extended precision */
mpz_ptr numer, denom;
mpz_t numer_tmp, denom_tmp;