[BUGLET] in Float>raisedTo:
Jarvis, Robert P.
Jarvisb at timken.com
Mon Feb 22 21:16:33 UTC 1999
The following code seems to fix the problems in Float>>raisedTo:, and should
be portable across platforms.
Number>>raisedTo: aNumber
"Answer the receiver raised to aNumber."
(aNumber isInteger)
ifTrue: ["Do the special case of integer power"
^self raisedToInteger: aNumber].
self < 0 ifTrue: [ self error: self printString, ' raised to a
non-integer power' ].
aNumber = 0 ifTrue: [^1]. "Special case of exponent=0"
((self = 0) | (aNumber = 1)) ifTrue: [^self]. "Special
case of exponent=1"
^(aNumber * self ln) exp "Otherwise raise it to the
power using logarithms"
Number>>raisedToInteger: anInteger
"Answer the receiver raised to the power anInteger where the
argument
must be a kind of Integer. This is a special case of raisedTo:."
(anInteger isInteger)
ifFalse: [^self error: 'raisedToInteger: only works for
integral arguments'].
anInteger = 0 ifTrue: [^1].
((self = 0) | (anInteger = 1)) ifTrue: [^self].
anInteger > 1
ifTrue: [^(self * self raisedToInteger: anInteger // 2)
* (self raisedToInteger: anInteger
\\ 2)].
^(self raisedToInteger: anInteger negated) reciprocal
Float>>raisedTo: aNumber
"Answer the receiver raised to aNumber."
(aNumber isInteger)
ifTrue: ["Do the special case of integer power"
^self raisedToInteger: aNumber].
self < 0.0 ifTrue: [ self error: self printString, ' raised to a
non-integer power' ].
0.0 = aNumber ifTrue: [^ 1.0]. "special case for exponent = 0.0"
((self= 0.0) | (aNumber = 1.0)) ifTrue: [^self].
^ (self ln * aNumber asFloat) exp
Problems this code attempts to solve:
1. Answer reasonable value for x raisedTo: 0.
2. Produce an error if a negative number is raised to a non-integer
power.
3. Answer correct values for all other arguments.
Bob Jarvis
The Timken Company
More information about the Squeak-dev
mailing list
|