fixes isNAN (on linux); added #isInfinite
authorClaus Gittinger <cg@exept.de>
Mon, 15 Dec 1997 11:35:05 +0100
changeset 3127 590c7d2bb4b9
parent 3126 e37ccb66f1b0
child 3128 a4b5ef1e1bd5
fixes isNAN (on linux); added #isInfinite
Float.st
--- a/Float.st	Mon Dec 15 11:34:19 1997 +0100
+++ b/Float.st	Mon Dec 15 11:35:05 1997 +0100
@@ -21,6 +21,11 @@
 %{
 #include <errno.h>
 
+#ifndef __OPTIMIZE__
+# define __OPTIMIZE__
+#endif
+#include <math.h>
+
 /*
  * on some systems errno is a macro ... check for it here
  */
@@ -83,20 +88,20 @@
     (It does the float-check by probing a bit in the classes flag instVar).
 
     Mixed mode arithmetic:
-        float op float       -> float
-        float op fix         -> float
-        float op integer     -> float
-        float op float       -> float
+	float op float       -> float
+	float op fix         -> float
+	float op integer     -> float
+	float op float       -> float
 
     [Class Variables:]
 
     [see also:]
-        Number
-        ShortFloat Fraction FixedPoint Integer
-        FloatArray DoubleArray
+	Number
+	ShortFloat Fraction FixedPoint Integer
+	FloatArray DoubleArray
 
     [author:]
-        Claus Gittinger
+	Claus Gittinger
 "
 !
 
@@ -112,21 +117,21 @@
     easily, if there is sufficient customer interest, though.
 
     Try:
-        |f1 f2|
+	|f1 f2|
 
-        f1 := 1.0.
-        f2 := 0.0.
-        f1 / f2
+	f1 := 1.0.
+	f2 := 0.0.
+	f1 / f2
 
     or:
-        2 arcSin
+	2 arcSin
 "
 ! !
 
 !Float class methodsFor:'initialization'!
 
 initialize
-    DefaultPrintFormat := '.6'	"/ 6 valid digits
+    DefaultPrintFormat := '.6'  "/ 6 valid digits
 
     "
      DefaultPrintFormat := '.9' 
@@ -466,7 +471,7 @@
 
     dVal = __floatVal(self);
     if ((dVal >= (double)_MIN_INT) && (dVal <= (double)_MAX_INT)) {
-        RETURN ( __MKSMALLINT( (INT)dVal) );
+	RETURN ( __MKSMALLINT( (INT)dVal) );
     }
 %}.
     ^ super asInteger
@@ -509,10 +514,10 @@
 %{  /* NOCONTEXT */
 
     if (aNumber != nil) {
-        if (__isSmallInteger(aNumber)) {
+	if (__isSmallInteger(aNumber)) {
 	    RETURN ( (__floatVal(self) < (double)(__intVal(aNumber))) ? true : false );
-        }
-        if (__qIsFloatLike(aNumber)) {
+	}
+	if (__qIsFloatLike(aNumber)) {
 	    RETURN ( (__floatVal(self) < __floatVal(aNumber)) ? true : false );
 	}
     }
@@ -526,10 +531,10 @@
 %{  /* NOCONTEXT */
 
     if (aNumber != nil) {
-        if (__isSmallInteger(aNumber)) {
+	if (__isSmallInteger(aNumber)) {
 	    RETURN ( (__floatVal(self) <= (double)(__intVal(aNumber))) ? true : false );
-        }
-        if (__qIsFloatLike(aNumber)) {
+	}
+	if (__qIsFloatLike(aNumber)) {
 	    RETURN ( (__floatVal(self) <= __floatVal(aNumber)) ? true : false );
 	}
     }
@@ -543,10 +548,10 @@
 %{  /* NOCONTEXT */
 
     if (aNumber != nil) {
-        if (__isSmallInteger(aNumber)) {
+	if (__isSmallInteger(aNumber)) {
 	    RETURN ( (__floatVal(self) == (double)(__intVal(aNumber))) ? true : false );
-        }
-        if (__qIsFloatLike(aNumber)) {
+	}
+	if (__qIsFloatLike(aNumber)) {
 	    RETURN ( (__floatVal(self) == __floatVal(aNumber)) ? true : false );
 	}
     } else {
@@ -562,10 +567,10 @@
 %{  /* NOCONTEXT */
 
     if (aNumber != nil) {
-        if (__isSmallInteger(aNumber)) {
+	if (__isSmallInteger(aNumber)) {
 	    RETURN ( (__floatVal(self) > (double)(__intVal(aNumber))) ? true : false );
-        }
-        if (__qIsFloatLike(aNumber)) {
+	}
+	if (__qIsFloatLike(aNumber)) {
 	    RETURN ( (__floatVal(self) > __floatVal(aNumber)) ? true : false );
 	}
     }
@@ -579,10 +584,10 @@
 %{  /* NOCONTEXT */
 
     if (aNumber != nil) {
-        if (__isSmallInteger(aNumber)) {
+	if (__isSmallInteger(aNumber)) {
 	    RETURN ( (__floatVal(self) >= (double)(__intVal(aNumber))) ? true : false );
-        }
-        if (__qIsFloatLike(aNumber)) {
+	}
+	if (__qIsFloatLike(aNumber)) {
 	    RETURN ( (__floatVal(self) >= __floatVal(aNumber)) ? true : false );
 	}
     }
@@ -631,12 +636,12 @@
 %{  /* NOCONTEXT */
 
     if (aNumber != nil) {
-        if (__isSmallInteger(aNumber)) {
+	if (__isSmallInteger(aNumber)) {
 	    RETURN ( (__floatVal(self) != (double)(__intVal(aNumber))) ? true : false );
-        }
-        if (__qIsFloatLike(aNumber)) {
+	}
+	if (__qIsFloatLike(aNumber)) {
 	    RETURN ( (__floatVal(self) != __floatVal(aNumber)) ? true : false );
-        }
+	}
     } else {
 	RETURN (true);
     }
@@ -658,7 +663,7 @@
     errno = 0;
     rslt = acos(__floatVal(self));
     if (errno == 0) {
-        __qMKFLOAT(newFloat, rslt);
+	__qMKFLOAT(newFloat, rslt);
 	RETURN ( newFloat );
     }
 %}.
@@ -765,6 +770,7 @@
 
 raisedTo:aNumber
     "return self raised to the power of aNumber"
+
     |n|
 
     n := aNumber asFloat.
@@ -776,11 +782,13 @@
     if (__isFloatLike(n)) {
 	errno = 0;
 	rslt = pow(__floatVal(self), __floatVal(n));
+#if 0
 	errno = 0;  /* XXXX */
-        if (errno == 0) {
+#endif
+	if (errno == 0) {
 	    __qMKFLOAT(newFloat, rslt);
 	    RETURN ( newFloat );
-        }
+	}
     }
 %}.
     "
@@ -1045,6 +1053,25 @@
 
 !Float methodsFor:'testing'!
 
+isInfinite
+    "return true, if the receiver is an infinite float (Inf).
+     These are not created by ST/X float operations (they raise an exception);
+     however, inline C-code could produce them ..."
+
+%{  /* NOCONTEXT */
+
+    double dV = __floatVal(self);
+
+#ifdef isinf
+    if (isinf(dV)) { RETURN (true); }
+#endif
+#ifdef IS_INF
+    if (IS_INF(dV)) { RETURN (true); }
+#endif
+%}.
+    ^false
+!
+
 isNaN
     "return true, if the receiver is an invalid float (NaN - not a number).
      These are not created by ST/X float operations (they raise an exception);
@@ -1052,49 +1079,51 @@
 
 %{  /* NOCONTEXT */
 
+    double dV = __floatVal(self);
+
     /*
      * sigh - every vendor is playing its own game here ...
      * Q: what are standards worth, anyway ?
      */
+#ifdef isnan
+    if (isnan(dV)) { RETURN (true); }
+#endif
 #ifdef IS_NAN
-    if (IS_NAN(__floatVal(self))) { RETURN (true); }
+    if (IS_NAN(dV)) { RETURN (true); }
 #endif
 #ifdef IS_QNAN
-    if (IS_QNAN(__floatVal(self))) { RETURN (true); }
+    if (IS_QNAN(dV)) { RETURN (true); }
 #endif
 
 #ifdef FLT_SNAN
-    if (__floatVal(self) == FLT_SNAN) { RETURN (true); }
+    if (dV == FLT_SNAN) { RETURN (true); }
 #endif
 #ifdef FLT_QNAN
-    if (__floatVal(self) == FLT_QNAN) { RETURN (true); }
+    if (dV == FLT_QNAN) { RETURN (true); }
 #endif
 
 #ifdef _SNANF
-    if (__floatVal(self) == _SNAN) { RETURN (true); }
+    if (dV == _SNAN) { RETURN (true); }
 #endif
 #ifdef _QNANF
-    if (__floatVal(self) == _QNAN) { RETURN (true); }
+    if (dV == _QNAN) { RETURN (true); }
 #endif
 
 #ifdef IsPosNAN
-    if IsPosNAN(__floatVal(self)) { RETURN (true); }
+    if IsPosNAN(dV) { RETURN (true); }
 #endif
 #ifdef IsNegNAN
-    if IsNegNAN(__floatVal(self)) { RETURN (true); }
+    if IsNegNAN(dV) { RETURN (true); }
 #endif
 
 #ifdef NAN
-    if (__floatVal(self) == NAN) { RETURN (true); }
+    if (dV == NAN) { RETURN (true); }
 #endif
 #ifdef NaN
-    if (NaN(__shortFloatVal(self))) { RETURN (true); }
+    if (NaN(dV)) { RETURN (true); }
 #endif
-
 %}.
     ^ false
-
-
 !
 
 negative
@@ -1140,7 +1169,7 @@
      */
     dVal = ceil(__floatVal(self));
     if ((dVal >= (double)_MIN_INT) && (dVal <= (double)_MAX_INT)) {
-        RETURN ( __MKSMALLINT( (INT) dVal ) );
+	RETURN ( __MKSMALLINT( (INT) dVal ) );
     }
     val = __MKFLOAT(dVal);
 %}.
@@ -1180,7 +1209,7 @@
      */
     dVal = floor(__floatVal(self));
     if ((dVal >= (double)_MIN_INT) && (dVal <= (double)_MAX_INT)) {
-        RETURN ( __MKSMALLINT( (INT) dVal ) );
+	RETURN ( __MKSMALLINT( (INT) dVal ) );
     }
     val = __MKFLOAT(dVal);
 %}.
@@ -1231,15 +1260,15 @@
 
     dVal = __floatVal(self);
     if (dVal < 0.0) {
-        dVal = ceil(dVal - 0.5);
+	dVal = ceil(dVal - 0.5);
     } else {
-        dVal = floor(dVal + 0.5);
+	dVal = floor(dVal + 0.5);
     }
     /*
      * ST-80 (and X3J20) returns integer.
      */
     if ((dVal >= (double)_MIN_INT) && (dVal <= (double)_MAX_INT)) {
-        RETURN ( __MKSMALLINT( (INT) dVal ) );
+	RETURN ( __MKSMALLINT( (INT) dVal ) );
     }
     val = __MKFLOAT(dVal);
 %}.
@@ -1270,9 +1299,9 @@
 
     dVal = __floatVal(self);
     if (dVal < 0.0) {
-        dVal = ceil(dVal - 0.5);
+	dVal = ceil(dVal - 0.5);
     } else {
-        dVal = floor(dVal + 0.5);
+	dVal = floor(dVal + 0.5);
     }
     RETURN ( __MKFLOAT(dVal) );
 %}
@@ -1296,16 +1325,16 @@
 
     dVal = __floatVal(self);
     if (dVal < 0.0) {
-        dVal = ceil(dVal);
+	dVal = ceil(dVal);
     } else {
-        dVal = floor(dVal);
+	dVal = floor(dVal);
     }
 
     /*
      * ST-80 (and X3J20) returns integer.
      */
     if ((dVal >= (double)_MIN_INT) && (dVal <= (double)_MAX_INT)) {
-        RETURN ( __MKSMALLINT( (INT) dVal ) );
+	RETURN ( __MKSMALLINT( (INT) dVal ) );
     }
     val = __MKFLOAT(dVal);
 %}.
@@ -1333,9 +1362,9 @@
 
     dVal = __floatVal(self);
     if (dVal < 0.0) {
-        dVal = ceil(dVal);
+	dVal = ceil(dVal);
     } else {
-        dVal = floor(dVal);
+	dVal = floor(dVal);
     }
 
     RETURN ( __MKFLOAT(dVal) );
@@ -1353,6 +1382,6 @@
 !Float class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Float.st,v 1.64 1997-11-26 19:23:50 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Float.st,v 1.65 1997-12-15 10:35:05 cg Exp $'
 ! !
 Float initialize!