[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