--- 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!