[squeak-dev] 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
  	"Answer the square root of the receiver."
  
  	| selfAsFloat floatResult guess |
  	selfAsFloat := self asFloat.
  	floatResult := selfAsFloat sqrt.
  
  	floatResult isInfinite ifFalse: [
  		guess := floatResult truncated.
  
  		"If got an exact answer, answer it. Otherwise answer float approximate answer."
  		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"!

Item was added:
+ ----- Method: ScaledDecimal>>nthRoot: (in category 'mathematical functions') -----
+ nthRoot: anInteger
+ 	"Answer the nth root of the receiver.
+ 	Preserve receiver class and scale if answer is exact.
+ 	Otherwise, answer a Float to denote inexactness."
+ 	| nthRoot |
+ 	nthRoot := self asFraction nthRoot: anInteger.
+ 	^nthRoot isFloat
+ 		ifTrue: [nthRoot]
+ 		ifFalse: [nthRoot asScaledDecimal: scale]!




More information about the Squeak-dev mailing list