[squeak-dev] The Trunk: Kernel-nice.646.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Sat Oct 29 13:29:57 UTC 2011
2011/10/29 <commits at 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!
>
>
>
More information about the Squeak-dev
mailing list
|