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