2011/10/29 commits@source.squeak.org:
Nicolas Cellier uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-nice.646.mcz
==================== Summary ====================
Name: Kernel-nice.646 Author: nice Time: 29 October 2011, 3:25:43.994 pm UUID: cd46101c-40a4-49fd-b358-a8d0c555810f Ancestors: Kernel-nice.645
There might be a best inexact square root approximation than Float infinity to some LargePositiveInteger in the range (1<<54-1<<970 to: 1<<54-1<<1994)
I mean a better approximation... But it should effectively be the best.
=============== Diff against Kernel-nice.645 ===============
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 ].
- "Nothing else can be done. No exact answer means answer must be a Float.
- Answer the best we have which is the rounded sqrt."
- guess := (self * 4) sqrtFloor.
- ^(guess // 2 + (guess \ 2)) asFloat].
- ^guess ]].
"We need an approximate result" ^floatResult!
Item was changed: ----- Method: LargePositiveInteger>>sqrt (in category 'mathematical functions') ----- sqrt "If we know for sure no exact solution exists, then just answer the cheap float approximation without wasting time."
- | selfAsFloat |
- self mightBeASquare
- ifFalse:
- [selfAsFloat := self asFloat.
- selfAsFloat isFinite ifTrue: [^self asFloat sqrt ]].
- self mightBeASquare ifFalse: [
- ^self asFloat sqrt ].
- "If some exact solution might exist, or self asFloat isInfinite, call potentially expensive super"
- "If some exact solution might exist, call potentially expensive super"
^super sqrt!
On Sat, Oct 29, 2011 at 03:29:57PM +0200, Nicolas Cellier wrote:
2011/10/29 commits@source.squeak.org:
Nicolas Cellier uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-nice.646.mcz
==================== Summary ====================
Name: Kernel-nice.646 Author: nice Time: 29 October 2011, 3:25:43.994 pm UUID: cd46101c-40a4-49fd-b358-a8d0c555810f Ancestors: Kernel-nice.645
There might be a best inexact square root approximation than Float infinity to some LargePositiveInteger in the range (1<<54-1<<970 to: 1<<54-1<<1994)
I mean a better approximation... But it should effectively be the best.
indeed ;-)
It's good to see all these improvements to numeric methods!
Dave
squeak-dev@lists.squeakfoundation.org