ShortFloat.st
changeset 21834 1fe471f18a2e
parent 21829 ecd8892d2de5
child 21836 ecb128dd5877
--- a/ShortFloat.st	Mon Jun 19 02:34:42 2017 +0200
+++ b/ShortFloat.st	Mon Jun 19 09:08:14 2017 +0200
@@ -130,6 +130,7 @@
 # ifdef __BORLANDC__
 #  define NO_FMODF
 #  define NO_MODFF
+#  define NO_LOG10F
 # endif
 
 # ifdef __MINGW__
@@ -344,7 +345,7 @@
      (i.e. the value-delta of the least significant bit)"
 
     Epsilon isNil ifTrue:[
-        Epsilon := self computeEpsilon.
+	Epsilon := self computeEpsilon.
     ].
     ^ Epsilon
 
@@ -504,7 +505,7 @@
     "return the natural logarithm of 10 as a shortFloat"
 
     Ln10 isNil ifTrue:[
-        Ln10 := Float ln10 asShortFloat
+	Ln10 := Float ln10 asShortFloat
     ].
     ^ Ln10
 
@@ -548,9 +549,9 @@
     ^ 5
 
     "
-     ShortFloat defaultPrintPrecision 
-     Float defaultPrintPrecision      
-     LongFloat defaultPrintPrecision  
+     ShortFloat defaultPrintPrecision
+     Float defaultPrintPrecision
+     LongFloat defaultPrintPrecision
     "
 
     "Created: / 17-06-2017 / 02:59:31 / cg"
@@ -1081,7 +1082,7 @@
     "
 
     Epsilon isNil ifTrue:[
-        Epsilon := self class computeEpsilon.
+	Epsilon := self class computeEpsilon.
     ].
 
 %{  /* NOCONTEXT */
@@ -1098,29 +1099,29 @@
 
     INT32 ulpDiff;
     union {
-        float f;
-        INT32 i;
+	float f;
+	INT32 i;
     } myself, otherFloat;
     int nEpsilon;
     float scaledEpsilon;
 
     if (!__isSmallInteger(nE)) {
-        goto tryHarder;
+	goto tryHarder;
     }
 
     nEpsilon =  __intVal(nE);
     scaledEpsilon = nEpsilon *__shortFloatVal(@global(Epsilon));
 
     if (__isSmallInteger(aNumber)) {
-        otherFloat.f = (float)(__intVal(aNumber));
+	otherFloat.f = (float)(__intVal(aNumber));
     } else if (aNumber == nil) {
-        RETURN(false)
+	RETURN(false)
     } else if (__qIsFloatLike(aNumber)) {
-        otherFloat.f = (float)(__floatVal(aNumber));
+	otherFloat.f = (float)(__floatVal(aNumber));
     } else if (__qIsShortFloat(aNumber)) {
-        otherFloat.f = (double)(__shortFloatVal(aNumber));
+	otherFloat.f = (double)(__shortFloatVal(aNumber));
     } else {
-        goto tryHarder;
+	goto tryHarder;
     }
 
     myself.f = __shortFloatVal(self);
@@ -1128,12 +1129,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.f - otherFloat.f) <= scaledEpsilon) {
-        RETURN(true);
+	RETURN(true);
     }
 
     // if the signs differ, the numbers are different
     if ((myself.f >= 0) != (otherFloat.f >= 0)) {
-        RETURN(false);
+	RETURN(false);
     }
 
     // compute the difference of the 'units in the last place" ULP
@@ -1141,9 +1142,9 @@
     ulpDiff = myself.i - otherFloat.i;
     if (ulpDiff < 0) ulpDiff = -ulpDiff;
     if (ulpDiff <= nEpsilon) {
-        RETURN(true);
+	RETURN(true);
     } else {
-        RETURN(false)
+	RETURN(false)
     }
 
 tryHarder:;
@@ -1151,10 +1152,10 @@
     ^ aNumber isAlmostEqualToFromShortFloat:self nEpsilon:nE
 
     "
-        67329.234 asShortFloat isAlmostEqualTo:67329.23400000001 nEpsilon:1
-        1.0 asShortFloat isAlmostEqualTo:1.0001 nEpsilon:1
-        1.0 asShortFloat isAlmostEqualTo:-1.0 nEpsilon:1
-        1.0 asShortFloat isAlmostEqualTo:1 nEpsilon:1
+	67329.234 asShortFloat isAlmostEqualTo:67329.23400000001 nEpsilon:1
+	1.0 asShortFloat isAlmostEqualTo:1.0001 nEpsilon:1
+	1.0 asShortFloat isAlmostEqualTo:-1.0 nEpsilon:1
+	1.0 asShortFloat isAlmostEqualTo:1 nEpsilon:1
     "
 !
 
@@ -1255,15 +1256,22 @@
     if (val > 0.0)
 # endif
     {
-        __threadErrno = 0;
-        rslt = log10f(val);
-        if (! isnanf(rslt))  /* Currently all our systems support isnan() */
-        {
-            if (__threadErrno == 0) {
-                __qMKSFLOAT(newFloat, rslt);
-                RETURN ( newFloat );
-            }
-        }
+	__threadErrno = 0;
+# ifdef NO_LOG10F
+	{
+	    double dRslt = log10((double)val);
+	    rslt = (float)dResult;
+	}
+# else
+	rslt = log10f(val);
+# endif
+	if (! isnanf(rslt))  /* Currently all our systems support isnan() */
+	{
+	    if (__threadErrno == 0) {
+		__qMKSFLOAT(newFloat, rslt);
+		RETURN ( newFloat );
+	    }
+	}
     }
 #endif
 %}.
@@ -1271,11 +1279,11 @@
      an invalid value for logarithm
     "
     ^ self class
-        raise:#domainErrorSignal
-        receiver:self
-        selector:#log10
-        arguments:#()
-        errorString:'bad receiver in log10'
+	raise:#domainErrorSignal
+	receiver:self
+	selector:#log10
+	arguments:#()
+	errorString:'bad receiver in log10'
 
     "
      10 asFloat log10       1.0