--- a/Float.st Sun Jul 02 00:45:22 2017 +0200
+++ b/Float.st Sun Jul 02 00:45:41 2017 +0200
@@ -1927,44 +1927,38 @@
raisedTo:aNumber
"return self raised to the power of aNumber"
- |n|
-
- n := aNumber asFloat.
%{
- double rslt;
+ double _n, rslt;
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 );
- }
+ if (__isFloatLike(aNumber)) {
+ _n = __floatVal(aNumber);
+ } else if (__isSmallInteger(aNumber)) {
+ _n = (double)__intVal(aNumber);
+ } else {
+ goto notEasy;
+ }
+ __threadErrno = 0;
+ rslt = pow(__floatVal(self), _n);
+ if (! isnan(rslt)) { /* Currently all our systems support isnan() */
+ if (__threadErrno == 0) {
+ __qMKFLOAT(newFloat, rslt);
+ RETURN ( newFloat );
}
}
+notEasy: ;
%}.
"/ the c-library pow function, 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
+ ^ (self negated raisedTo:aNumber) 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:'
-
- "Modified: / 22-06-2017 / 15:55:09 / cg"
+ ^ aNumber raisedFromFloat:self
+
+ "Modified: / 01-07-2017 / 21:58:26 / cg"
!
sqrt