diff liboctave/lo-mappers.cc @ 4025:cfb762dc9259

[project @ 2002-08-09 06:32:15 by jwe]
author jwe
date Fri, 09 Aug 2002 06:32:16 +0000
parents da64ef591f18
children b4fa31442a78
line wrap: on
line diff
--- a/liboctave/lo-mappers.cc	Wed Aug 07 07:11:44 2002 +0000
+++ b/liboctave/lo-mappers.cc	Fri Aug 09 06:32:16 2002 +0000
@@ -143,7 +143,7 @@
 xisnan (double x)
 {
 #if defined (HAVE_ISNAN)
-  return isnan (x) != 0;
+  return isnan (x) ? ! lo_ieee_is_NA (x) : false;
 #else
   return false;
 #endif
@@ -153,11 +153,11 @@
 xfinite (double x)
 {
 #if defined (HAVE_FINITE)
-  return finite (x) != 0;
-#elif defined (HAVE_ISINF) && defined (HAVE_ISNAN)
-  return (! isinf (x) && ! isnan (x));
+  return finite (x) != 0 && ! octave_is_NaN_or_NA (x);
+#elif defined (HAVE_ISINF)
+  return (! isinf (x) && ! octave_is_NaN_or_NA (x));
 #else
-  return true;
+  return ! octave_is_NaN_or_NA (x);
 #endif
 }
 
@@ -166,15 +166,29 @@
 {
 #if defined (HAVE_ISINF)
   return isinf (x);
-#elif defined (HAVE_FINITE) && defined (HAVE_ISNAN)
-  return (! (finite (x) || isnan (x)));
+#elif defined (HAVE_FINITE)
+  return (! (finite (x) || octave_is_NaN_or_NA (x)));
 #else
   return false;
 #endif
 }
 
+bool
+octave_is_NA (double x)
+{
+  return lo_ieee_is_NA (x);
+}
+
+bool
+octave_is_NaN_or_NA (double x)
+{
+  return lo_ieee_is_NaN_or_NA (x);
+}
+
 // (double, double) -> double mappers.
 
+// XXX FIXME XXX -- need to handle NA too?
+
 double
 xmin (double x, double y)
 {
@@ -288,17 +302,17 @@
 bool
 xisnan (const Complex& x)
 {
-#if defined (HAVE_ISNAN)
-  return (isnan (real (x)) || isnan (imag (x)));
-#else
-  return false;
-#endif
+  return (xisnan (real (x)) || xisnan (imag (x)));
 }
 
 bool
 xfinite (const Complex& x)
 {
-  return (xfinite (real (x)) && xfinite (imag (x)));
+  double rx = real (x);
+  double ix = imag (x);
+
+  return (xfinite (rx) && ! octave_is_NaN_or_NA (rx)
+	  && xfinite (ix) && ! octave_is_NaN_or_NA (ix));
 }
 
 bool
@@ -307,8 +321,22 @@
   return (xisinf (real (x)) || xisinf (imag (x)));
 }
 
+bool
+octave_is_NA (const Complex& x)
+{
+  return (octave_is_NA (real (x)) || octave_is_NA (imag (x)));
+}
+
+bool
+octave_is_NaN_or_NA (const Complex& x)
+{
+  return (octave_is_NaN_or_NA (real (x)) || octave_is_NaN_or_NA (imag (x)));
+}
+
 // (complex, complex) -> complex mappers.
 
+// XXX FIXME XXX -- need to handle NA too?
+
 Complex
 xmin (const Complex& x, const Complex& y)
 {