Float.st
changeset 19091 12b1f7ebf405
parent 18857 7165f748d240
child 19103 71257a47eba2
child 19326 aa152894e736
--- a/Float.st	Sat Jan 23 01:10:11 2016 +0100
+++ b/Float.st	Sat Jan 23 01:10:24 2016 +0100
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 1988 by Claus Gittinger
 	      All Rights Reserved
@@ -1790,26 +1788,34 @@
     OBJ newFloat;
 
     if (__isFloatLike(n)) {
-	__threadErrno = 0;
-	rslt = pow(__floatVal(self), __floatVal(n));
-	if (! isnan(rslt))  /* Currently all our systems support isnan() */
-	{
-	    if (__threadErrno == 0) {
-		__qMKFLOAT(newFloat, rslt);
-		RETURN ( newFloat );
-	    }
-	}
+        __threadErrno = 0;
+        rslt = pow(__floatVal(self), __floatVal(n));
+        if (! isnan(rslt))  /* Currently all our systems support isnan() */
+        {
+            if (__threadErrno == 0) {
+                __qMKFLOAT(newFloat, rslt);
+                RETURN ( newFloat );
+            }
+        }
     }
 %}.
+    "/ the c-library pow functin, has a bug:
+    "/ it does not deal correctly with negative numbers. 
+    "/ I.e. it raises an error on -8^(1/3) instead of returning a negative -2
+    "/ work around with a kludge:
+    self < 0 ifTrue:[
+        ^ (self negated raisedTo:n) negated
+    ].
+
     "
      an invalid argument (not convertable to float ?)
     "
     ^ self class
-	raise:#domainErrorSignal
-	receiver:self
-	selector:#raisedTo:
-	arguments:(Array with:aNumber)
-	errorString:'bad receiver/arg in raisedTo:'
+        raise:#domainErrorSignal
+        receiver:self
+        selector:#raisedTo:
+        arguments:(Array with:aNumber)
+        errorString:'bad receiver/arg in raisedTo:'
 
     "Modified: / 16.11.2001 / 14:16:51 / cg"
 !