[Vm-dev] vm crash when using rairedTo: with fractions
Juan Vuletich
JuanVuletich at zoho.com
Sun Aug 13 19:34:54 UTC 2017
Is this enough?
Fraction >> nthRoot: aPositiveInteger
"Answer the nth root of the receiver."
| d n |
n _ numerator nthRootTruncated: aPositiveInteger.
(n raisedTo: aPositiveInteger) = numerator ifFalse: [
^self asFloat nthRoot: aPositiveInteger ].
d _ denominator nthRootTruncated: aPositiveInteger.
(d raisedTo: aPositiveInteger) = denominator ifFalse: [
^self asFloat nthRoot: aPositiveInteger ].
^n / d
Seems to work ok in Cuis.
Thanks,
On 8/13/2017 9:47 AM, Nicolas Cellier wrote:
>
>
>
>
>
> 2017-08-13 12:13 GMT+02:00 Andrei Chis <chisvasileandrei at gmail.com
> <mailto:chisvasileandrei at gmail.com>>:
>
>
>
>
> On Thu, Aug 10, 2017 at 10:42 PM, Nicolas Cellier
> <nicolas.cellier.aka.nice at gmail.com
> <mailto:nicolas.cellier.aka.nice at gmail.com>> wrote:
>
>
>
>
> 2017-08-10 22:19 GMT+02:00 Andrei Chis
> <chisvasileandrei at gmail.com <mailto:chisvasileandrei at gmail.com>>:
>
>
> Hi Nicolas,
>
> Thanks for the info. Indeed sending #asFloat to the
> operand leads to a correct behaviour.
>
> Just then is there a need for this special use case for
> handling Fractions if it can lead to such problematic
> behaviour? Would the logarithmic way ((aNumber * self ln)
> exp) not be enough? On this example the computation takes
> a few minutes before crashing the image.
>
>
> Having (1/1000 raisedTo: 2/3) = (1/100) is a nice thing and
> we want to keep it.
>
>
> Indeed, it's a nice to have feature.
>
> But once we detect that we can't have an exact result, we
> should adopt a more efficient strategy.
>
>
> Do you know if the vm plugin fix from Eliot addresses also this or
> there should some more actions taken on the image side?
>
>
> There are corner cases where we want to avoid
> overflow/underflow in intermediate values, such as (1<<2000 +
> 1) raisedTo: 1/200 or ((1<<2000 + 1) reciprocal raisedTo:
> 1/200, so we must not convert asFloat too soon.
> But since ln already handles those edge cases (at least in
> Squeak, I have to check Pharo), ((aNumber * self ln) exp)is a
> good approximation (a few ulp off, depending on the quality of
> underlying libm).
>
>
> For now I switched to using ((aNumber * self ln) exp) and it's
> working well.
>
> Cheers,
> Andrei
>
>
> Hi Andrei,
> an image side modification is necessary if we want to gain more
> efficiency.
> The question is whether we want to have correctly rounded results or
> not for Integer>>nthRoot:.
> If not, ((aNumber * self ln) exp) is OK (it can be a few ulp off as I
> told before).
> For Fraction, there's no point in rounding some term correctly then
> spoiling by an inexact raisedTo: and an inexact /.
> I started to look at it in Squeak (same code), then it will be time to
> port in Pharo.
>
> Nicolas
>
>
> Nicolas
>
>
> Cheers,
> Andrei
>
> On Thu, Aug 10, 2017 at 9:27 PM, Nicolas Cellier
> <nicolas.cellier.aka.nice at gmail.com
> <mailto:nicolas.cellier.aka.nice at gmail.com>> wrote:
>
>
> Hi Andrei,
> indeed, the method does not scale well...
>
> If the result is an exact Fraction, then it will
> answer the Fraction.
> Else if not exact, it will be converted to a Float.
>
> The problem is that it will try to answer nearest
> Float with a rather naive algorithm.
> Moreover, computing the nthRoot: first, then raising
> the result to the power of numerator will cumulate
> rounding errors.
> So trying to get a very accurate nthRoot: first in
> case of Float result is not a good strategy anyway.
>
> Why the VM crashes exactly is another problem and
> remains to see, we'd prefer an Exception.
>
> As a workaround, I suggest sending asFloat to the
> receiver and/or operand.
>
>
> 2017-08-10 12:02 GMT+02:00 Andrei Chis
> <chisvasileandrei at gmail.com
> <mailto:chisvasileandrei at gmail.com>>:
>
>
> Hi,
>
> I was executing this code '(2009/2000) **
> (3958333/100000)' with the Pharo6.1 distribution
> and the vm crashed with she stack attached below.
> Tried it on both mac and windows 10.
> Seems that #raisedTo: has a special case for
> fractions that ends up calling #nthRoot: like
> '2009 nthRoot: 100000' leading to the crash.
>
> Cheers,
> Andrei
>
>
> 0xaddeac M LargePositiveInteger(Integer)>quo:
> 0x314093e8: a(n) LargePositiveInteger
> 0xaddec8 M LargePositiveInteger(LargeInteger)>quo:
> 0x314093e8: a(n) LargePositiveInteger
> 0xaddee8 M LargePositiveInteger(Integer)>//
> 0x314093e8: a(n) LargePositiveInteger
> 0xaddf04 M LargePositiveInteger(LargeInteger)>//
> 0x314093e8: a(n) LargePositiveInteger
> 0xaddf34 I
> LargePositiveInteger(Integer)>nthRootTruncated:
> 0x30cc8350: a(n) LargePositiveInteger
> 0xaddf5c I
> LargePositiveInteger(Integer)>nthRootRounded:
> 0x30cc8350: a(n) LargePositiveInteger
> 0xaddf88 I SmallInteger(Integer)>nthRoot: 0xfb3=2009
> 0xaddfb4 I Fraction>nthRoot: 0x4f9a940: a(n) Fraction
> 0xaddfd8 I Fraction(Number)>raisedTo: 0x4f9a940:
> a(n) Fraction
> 0xaddffc I Fraction(Number)>** 0x4f9a940: a(n)
> Fraction
> 0xade018 M UndefinedObject>DoIt 0x5fe5d00: a(n)
> UndefinedObject
> 0xade048 I OpalCompiler>evaluate 0x4f9a998: a(n)
> OpalCompiler
> 0xade074 I RubSmalltalkEditor>evaluate:andDo:
> 0x305e5878: a(n) RubSmalltalkEditor
> 0xade09c I
> RubSmalltalkEditor>highlightEvaluateAndDo:
> 0x305e5878: a(n) RubSmalltalkEditor
> 0xade0b8 M
> GLMMorphicPharoScriptRenderer(GLMMorphicPharoCodeRenderer)>popupPrint
> 0x3062fdc8: a(n) GLMMorphicPharoScri
> enderer
> 0xade0d8 I MorphicAlarm(MessageSend)>value
> 0x4f9ab20: a(n) MorphicAlarm
> 0xade0f4 M MorphicAlarm>value: 0x4f9ab20: a(n)
> MorphicAlarm
> 0xade114 M WorldState>triggerAlarmsBefore:
> 0x71bb5e0: a(n) WorldState
> 0xade140 M WorldState>runLocalStepMethodsIn:
> 0x71bb5e0: a(n) WorldState
> 0xade164 M WorldState>runStepMethodsIn: 0x71bb5e0:
> a(n) WorldState
> 0xade180 M WorldMorph>runStepMethods 0x6ab7778:
> a(n) WorldMorph
> 0xade198 M WorldState>doOneCycleNowFor: 0x71bb5e0:
> a(n) WorldState
> 0xade1b4 M WorldState>doOneCycleFor: 0x71bb5e0:
> a(n) WorldState
> 0xade1d0 M WorldMorph>doOneCycle 0x6ab7778: a(n)
> WorldMorph
> 0xade1e8 M WorldMorph class>doOneCycle 0x6a9f960:
> a(n) WorldMorph class
> 0xade200 M [] in MorphicUIManager>spawnNewProcess
> 0x2cc88718: a(n) MorphicUIManager
> 0xade220 I [] in BlockClosure>newProcess
> 0x2f178150: a(n) BlockClosure
>
>
>
>
>
>
>
>
>
>
--
Juan Vuletich
www.cuis-smalltalk.org
https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
@JuanVuletich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20170813/f37971e2/attachment-0001.html>
More information about the Vm-dev
mailing list