class: Float
authorStefan Vogel <sv@exept.de>
Tue, 03 Feb 2015 15:20:18 +0100
changeset 17384 36f55cb89897
parent 17383 b0e93027f2cc
child 17385 0d98fa1e74ff
class: Float refactored: #isNegative, #isPositive, #isNegativeZero
Float.st
--- a/Float.st	Tue Feb 03 15:18:38 2015 +0100
+++ b/Float.st	Tue Feb 03 15:20:18 2015 +0100
@@ -11,6 +11,8 @@
 "
 "{ Package: 'stx:libbasic' }"
 
+"{ NameSpace: Smalltalk }"
+
 LimitedPrecisionReal variableByteSubclass:#Float
 	instanceVariableNames:''
 	classVariableNames:'DefaultPrintFormat Pi E Halfpi HalfpiNegative Twopi
@@ -443,7 +445,6 @@
     ^ Epsilon
 ! !
 
-
 !Float class methodsFor:'binary storage'!
 
 readBinaryIEEEDoubleFrom:aStream
@@ -762,7 +763,6 @@
 ! !
 
 
-
 !Float methodsFor:'arithmetic'!
 
 * aNumber
@@ -1747,7 +1747,6 @@
     "Modified: / 16.11.2001 / 14:14:43 / cg"
 ! !
 
-
 !Float methodsFor:'printing & storing'!
 
 printString
@@ -2183,25 +2182,20 @@
 
 %{  /* NOCONTEXT */
 
-    double dV = __floatVal(self);
-
     /*
      * notice: on machines which do not provide
      * a finite() macro or function (WIN32),
      * this may always ret true here ...
      */
-    if (isfinite(dV)) {
-	RETURN (true);
-    }
+    RETURN (isfinite(__floatVal(self)) ? true : false)
 %}.
-    ^ false
 
     "
-	1.0 isFinite
-	Float NaN isFinite
-	Float infinity isFinite
-	(0.0 uncheckedDivide: 0.0) isFinite
-	(1.0 uncheckedDivide: 0.0) isFinite
+        1.0 isFinite
+        self NaN isFinite
+        self infinity isFinite
+        (0.0 uncheckedDivide: 0.0) isFinite
+        (1.0 uncheckedDivide: 0.0) isFinite
     "
 !
 
@@ -2252,34 +2246,24 @@
 
 %{  /* NOCONTEXT */
 
-    double dV = (__floatVal(self));
-
-    if (isnan(dV)) {
-	RETURN (true);
-    }
+    RETURN (isnan(__floatVal(self)) ? true : false)
 %}.
-    ^ false
 
     "
-	1.0 isNaN
-	(0.0 uncheckedDivide: 0.0) isNaN
-	(1.0 uncheckedDivide: 0.0) isNaN
-	(-1.0 uncheckedDivide: 0.0) isNaN
+        self NaN isNaN
+        1.0 isNaN
+        (0.0 uncheckedDivide: 0.0) isNaN
+        (1.0 uncheckedDivide: 0.0) isNaN
+        (-1.0 uncheckedDivide: 0.0) isNaN
     "
 !
 
 isNegativeZero
     "many systems have two float.Pnt zeros"
 
-%{
-#if defined(__i386__) && defined(LINUX)
-    unsigned int biasedExponent;
-
-    biasedExponent = ((short *)(__ByteArrayInstPtr(self)->ba_element))[3] & 0xFF70;
-    RETURN ((biasedExponent == 0x8000) ? true : false );
-#endif
+%{  /* NOCONTEXT */   
+    RETURN ( (__floatVal(self) == 0.0 && signbit(__floatVal(self)) != 0) ? true : false );
 %}.
-    ^ super isNegativeZero
 
     "
      0.0 isNegativeZero
@@ -2290,12 +2274,23 @@
 !
 
 negative
-    "return true if the receiver is less than zero"
+    "return true if the receiver is less than zero.
+     -0.0 is positive for now."
 
 %{  /* NOCONTEXT */
 
-    RETURN ( (__floatVal(self) < 0.0) ? true : false );
+    RETURN ( __floatVal(self) < 0.0  ? true : false );
+    // RETURN ( signbit(__floatVal(self)) != 0  ? true : false );
 %}.
+
+    "
+        0.0 negative
+        -0.0 negative
+        1.0 negative
+        -1.0 negative
+        (1.0 uncheckedDivide: 0.0) negative
+        (-1.0 uncheckedDivide: 0.0) negative
+    "
 !
 
 numberOfBits
@@ -2315,12 +2310,23 @@
 !
 
 positive
-    "return true if the receiver is greater or equal to zero"
+    "return true if the receiver is greater or equal to zero.
+     0.0 and -0.0 are positive for now."
 
 %{  /* NOCONTEXT */
 
-    RETURN ( (__floatVal(self) >= 0.0) ? true : false );
-%}
+    RETURN ( __floatVal(self) >= 0.0 ? true : false );
+    // RETURN ( signbit(__floatVal(self)) == 0 ? true : false  );
+%}.
+
+    "
+        0.0 positive
+        -0.0 positive
+        1.0 positive
+        -1.0 positive
+        (1.0 uncheckedDivide: 0.0) positive
+        (-1.0 uncheckedDivide: 0.0) positive
+    "
 !
 
 strictlyPositive
@@ -3074,11 +3080,11 @@
 !Float class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Float.st,v 1.206 2014-12-18 12:41:51 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Float.st,v 1.207 2015-02-03 14:20:18 stefan Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/Float.st,v 1.206 2014-12-18 12:41:51 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Float.st,v 1.207 2015-02-03 14:20:18 stefan Exp $'
 ! !