POSIX math: AIX fixes.
authorJarkko Hietaniemi <jhi@iki.fi>
Mon, 8 Sep 2014 20:02:53 +0000 (16:02 -0400)
committerJarkko Hietaniemi <jhi@iki.fi>
Mon, 8 Sep 2014 20:37:00 +0000 (16:37 -0400)
AIX doesn't seemingly really have the long double math interfaces.

ext/POSIX/Makefile.PL
ext/POSIX/POSIX.xs
ext/POSIX/t/math.t

index 02a3332..5a24a34 100644 (file)
@@ -17,6 +17,9 @@ if ($^O ne 'MSWin32' && $^O ne 'freemint') {
 if ($^O eq 'solaris') {
     push @libs, qw(sunmath);
 }
+if ($^O eq 'aix' && $Config{uselongdouble}) {
+    push @libs, qw(c128);
+}
 WriteMakefile(
     NAME       => 'POSIX',
     @libs ? ( 'LIBS' => [ join(" ", map { "-l$_" } @libs) ] ) : (),
index 2509c67..d315d0b 100644 (file)
  * of missing functions doesn't seem to follow any patterns. */
 
 #ifdef HAS_ACOSH
-#  if defined(USE_LONG_DOUBLE) && defined(HAS_ILOGBL)
+
+/* Certain AIX releases have the C99 math, but not in long double.
+ * The <math.h> has them, e.g. __expl128, but no library has them!
+ * AIX 5 releases before 5.3 unknown, AIX releases 7 unknown */
+#  if defined(_AIX53) || defined(_AIX61)
+#    define NO_C99_LONG_DOUBLE_MATH
+#  endif
+
 /* There's already a symbol for ilogbl, we will use its truthiness
  * as the canary for all the *l variants being defined. */
+#  if defined(USE_LONG_DOUBLE) && defined(HAS_ILOGBL) && \
+     !defined(NO_C99_LONG_DOUBLE_MATH)
 #    define c99_acosh  acoshl
 #    define c99_asinh  asinhl
 #    define c99_atanh  atanhl
 
 #ifndef __GNUC__
 
+#  if defined(_AIX53) || defined(_AIX61) /* AIX 7 ? */
+#    undef c99_nexttoward
+#  endif
+
 /* HP-UX on PA-RISC is missing certain C99 math functions,
  * but on IA64 (Integrity) these do exist, and even on
  * recent enough HP-UX (cc) releases. */
index 043a578..f21a1cf 100644 (file)
@@ -69,7 +69,7 @@ SKIP: {
     cmp_ok(abs(atanh(0.5) - 0.549306144334055), '<', 1e-9, "atanh");
     cmp_ok(abs(cbrt(8) - 2), '<', 1e-9, "cbrt");
     cmp_ok(abs(cbrt(-27) - -3), '<', 1e-9, "cbrt");
-    is(copysign(3.14, -2), -3.14, "copysign");
+    cmp_ok(abs(copysign(3.14, -2) - -3.14), '<', 1e-9, "copysign");
     cmp_ok(abs(expm1(2) - 6.38905609893065), '<', 1e-9, "expm1");
     cmp_ok(abs(expm1(1e-6) - 1.00000050000017e-06), '<', 1e-9, "expm1");
     is(fdim(12, 34), 0, "fdim 12 34");
@@ -86,7 +86,7 @@ SKIP: {
       is(fpclassify(NAN), FP_NAN, "fpclassify NAN");
     }
     is(hypot(3, 4), 5, "hypot 3 4");
-    is(hypot(-2, 1), sqrt(5), "hypot -1 2");
+    cmp_ok(abs(hypot(-2, 1) - sqrt(5)), '<', 1e-9, "hypot -1 2");
     is(ilogb(255), 7, "ilogb 255");
     is(ilogb(256), 8, "ilogb 256");
   SKIP: {