Float.st
changeset 21148 2b7df33ee311
parent 20799 5dfe67b1daf1
child 21244 0642433cb406
child 21824 a0ef855253f9
--- a/Float.st	Sat Dec 17 04:50:34 2016 +0000
+++ b/Float.st	Sun Dec 18 16:25:09 2016 +0100
@@ -777,6 +777,7 @@
     "
 ! !
 
+
 !Float class methodsFor:'queries'!
 
 exponentCharacter
@@ -831,6 +832,7 @@
     ^ 2 "must be careful here, whenever ST/X is used on VAX or a 370"
 ! !
 
+
 !Float methodsFor:'arithmetic'!
 
 * aNumber
@@ -1545,6 +1547,10 @@
      read: http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
     "
 
+    Epsilon isNil ifTrue:[
+        Epsilon := self class computeEpsilon.
+    ].
+
 %{  /* NOCONTEXT */
 
     /*
@@ -1559,29 +1565,29 @@
 
     INT64 ulpDiff;
     union {
-	double d;
-	INT64 i;
+        double d;
+        INT64 i;
     } myself, otherFloat;
     int nEpsilon;
     double scaledEpsilon;
 
     if (!__isSmallInteger(nE)) {
-	goto tryHarder;
+        goto tryHarder;
     }
 
     nEpsilon =  __intVal(nE);
     scaledEpsilon = nEpsilon *__floatVal(@global(Epsilon));
 
     if (__isSmallInteger(aNumber)) {
-	otherFloat.d = (double)(__intVal(aNumber));
+        otherFloat.d = (double)(__intVal(aNumber));
     } else if (aNumber == nil) {
-	RETURN(false)
+        RETURN(false)
     } else if (__qIsFloatLike(aNumber)) {
-	otherFloat.d = (double)(__floatVal(aNumber));
+        otherFloat.d = (double)(__floatVal(aNumber));
     } else if (__qIsShortFloat(aNumber)) {
-	otherFloat.d = (double)(__shortFloatVal(aNumber));
+        otherFloat.d = (double)(__shortFloatVal(aNumber));
     } else {
-	goto tryHarder;
+        goto tryHarder;
     }
 
     myself.d = __floatVal(self);
@@ -1589,12 +1595,12 @@
     // Check if the numbers are really close -- needed
     // when comparing numbers near zero (ULP method below fails for numbers near 0!).
     if (fabs(myself.d - otherFloat.d) <= scaledEpsilon) {
-	RETURN(true);
+        RETURN(true);
     }
 
     // if the signs differ, the numbers are different
     if ((myself.d >= 0) != (otherFloat.d >= 0)) {
-	RETURN(false);
+        RETURN(false);
     }
 
     // compute the difference of the 'units in the last place" ULP
@@ -1602,9 +1608,9 @@
     ulpDiff = myself.i - otherFloat.i;
     if (ulpDiff < 0) ulpDiff = -ulpDiff;
     if (ulpDiff <= nEpsilon) {
-	RETURN(true);
+        RETURN(true);
     } else {
-	RETURN(false)
+        RETURN(false)
     }
 
 tryHarder:;
@@ -1612,13 +1618,13 @@
     ^ aNumber isAlmostEqualToFromFloat:self nEpsilon:nE
 
     "
-	67329.234 isAlmostEqualTo:67329.23400000001 nEpsilon:1
-	1.0 isAlmostEqualTo:1.0001 nEpsilon:1
-	1.0 isAlmostEqualTo:-1.0 nEpsilon:1
-	1 isAlmostEqualTo:1.000000000000001 nEpsilon:1
-	1 isAlmostEqualTo:1.000000000000001 nEpsilon:10
-	1.0 isAlmostEqualTo:1 nEpsilon:1
-	1.0 isAlmostEqualTo:1 asFraction nEpsilon:1
+        67329.234 isAlmostEqualTo:67329.23400000001 nEpsilon:1
+        1.0 isAlmostEqualTo:1.0001 nEpsilon:1
+        1.0 isAlmostEqualTo:-1.0 nEpsilon:1
+        1 isAlmostEqualTo:1.000000000000001 nEpsilon:1
+        1 isAlmostEqualTo:1.000000000000001 nEpsilon:10
+        1.0 isAlmostEqualTo:1 nEpsilon:1
+        1.0 isAlmostEqualTo:1 asFraction nEpsilon:1
     "
 !
 
@@ -2344,6 +2350,7 @@
     "
 ! !
 
+
 !Float methodsFor:'testing'!
 
 isFinite