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