]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
tests: sort-float: avoid spurious test failure on ppc/ppc64
authorJim Meyering <meyering@redhat.com>
Sat, 16 Oct 2010 18:18:19 +0000 (20:18 +0200)
committerJim Meyering <meyering@redhat.com>
Sun, 17 Oct 2010 07:18:57 +0000 (09:18 +0200)
* tests/misc/sort-float: On systems with DBL_MIN < LDBL_MIN,
this test would fail because the expected output was not sorted.
Detect that case, and if needed, reverse those two values.

tests/misc/sort-float

index 639cd7eae3d235f447f83cdc6568d82d2371a313..04071598ff43bd5ac20c04d882ea77672269262f 100755 (executable)
@@ -23,6 +23,40 @@ fi
 
 . $srcdir/test-lib.sh
 
+# Return 0 if LDBL_MIN is smaller than DBL_MIN, else 1.
+# Dissect numbers like these, comparing first exponent, then
+# whole part of mantissa, then fraction, until finding enough
+# of a difference to determine the relative order of the numbers.
+# These are "reversed":
+#   $ ./getlimits |grep DBL_MIN
+#   DBL_MIN=2.225074e-308
+#   LDBL_MIN=2.004168e-292
+#
+# These are in the expected order:
+#   $ ./getlimits|grep DBL_MIN
+#   DBL_MIN=2.225074e-308
+#   LDBL_MIN=3.362103e-4932
+
+dbl_minima_order()
+{
+  LC_ALL=C getlimits_
+  set -- $(echo $LDBL_MIN | tr .e- '   ')
+  local ldbl_whole=$1 ldbl_frac=$2 ldbl_exp=$3
+
+  set -- $(echo $DBL_MIN |tr .e- '   ')
+  local dbl_whole=$1 dbl_frac=$2 dbl_exp=$3
+
+  test "$dbl_exp"    -lt "$ldbl_exp"   && return 0
+  test "$ldbl_exp"   -lt "$dbl_exp"    && return 1
+  test "$ldbl_whole" -lt "$dbl_whole"  && return 0
+  test "$dbl_whole"  -lt "$ldbl_whole" && return 1
+  test "$ldbl_frac"  -le "$dbl_frac"   && return 0
+  return 1
+}
+
+# On some systems, DBL_MIN < LDBL_MIN.  Detect that.
+dbl_minima_order; reversed=$?
+
 for LOC in C $LOCALE_FR; do
 
   LC_ALL=$LOC getlimits_
@@ -31,6 +65,14 @@ for LOC in C $LOCALE_FR; do
   grep '^#define HAVE_C99_STRTOLD 1' $CONFIG_HEADER > /dev/null ||
     { LDBL_MAX="$DBL_MAX"; LDBL_MIN="$DBL_MIN"; }
 
+  # If DBL_MIN happens to be smaller than LDBL_MIN, swap them,
+  # so that out expected output is sorted.
+  if test $reversed = 1; then
+    t=$LDBL_MIN
+    LDBL_MIN=$DBL_MIN
+    DBL_MIN=$t
+  fi
+
   printf -- "\
 -$LDBL_MAX
 -$DBL_MAX