# [Pkg] The Trunk: Kernel-nice.637.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Oct 14 20:29:54 UTC 2011

Nicolas Cellier uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-nice.637.mcz

==================== Summary ====================

Name: Kernel-nice.637
Author: nice
Time: 14 October 2011, 10:28:53.269 pm
UUID: 90981f89-5348-4bf9-8981-4cc51da6bc29
Ancestors: Kernel-nice.636

Implement ScaledDecimal>>nthRoot:
#mightBeASquare now verifies whether the receiver is an even power of two.

=============== Diff against Kernel-nice.636 ===============

Item was changed:
----- Method: Integer>>sqrt (in category 'mathematical functions') -----
sqrt

| selfAsFloat floatResult guess |
selfAsFloat := self asFloat.
floatResult := selfAsFloat sqrt.

floatResult isInfinite ifFalse: [
guess := floatResult truncated.

guess squared = self
ifTrue: [ ^ guess ]].

"In this case, maybe it failed because we are such a big integer that the Float method becomes
inexact, even if we are a whole square number. So, try the slower but more general method"
selfAsFloat >= Float maxExactInteger asFloat squared
ifTrue: [
guess := self sqrtFloor.
+ 			guess squared = self ifTrue: [
- 			guess * guess = self ifTrue: [
^guess ]].

"We need an approximate result"
^floatResult!

Item was changed:
----- Method: LargePositiveInteger>>mightBeASquare (in category 'mathematical functions') -----
mightBeASquare
"In base 16, a square number can end only with 0,1,4 or 9 and
- in case 0, only 0,1,4,9 can precede it,
- in case 4, only even numbers can precede it.
See http://en.wikipedia.org/wiki/Square_number
So, in hex, the last byte must be one of:
00
10
40
90
x1
e4
x9
where x is any hex digit and e is any even digit
+ 	Also, the receiver must be an aven power of two."
+ 	| lsb |
+ 	lsb := self digitAt: 1.
+ 	^((lsb bitAnd: 7) = 1				"any|1 or any|9"
+ 		or: [(lsb bitAnd: 31) = 4			"even|4"
+ 		or: [(lsb bitAnd: 127) = 16		"10 or 90"
+ 		or: [(lsb bitAnd: 191) = 0]]])		"00 or 40"
+ 			and: [self lowBit odd]		"even power of 2"!
- 	"
-     | lsb |
-     lsb := self digitAt: 1.
-     ^((lsb bitAnd: 7) = 1					"any|1 or any|9"
-         or: [(lsb bitAnd: 31) = 4			"even|4"
-         or: [(lsb bitAnd: 127) = 16			"10 or 90"
-         or: [(lsb bitAnd: 191) = 0]]])		"00 or 40"!

+ ----- Method: ScaledDecimal>>nthRoot: (in category 'mathematical functions') -----
+ nthRoot: anInteger