[Vm-dev] vm crash when using rairedTo: with fractions

Andrei Chis chisvasileandrei at gmail.com
Thu Aug 10 20:19:11 UTC 2017

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.


On Thu, Aug 10, 2017 at 9:27 PM, Nicolas Cellier <
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>:
>> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20170810/9ff1bc24/attachment.html>

More information about the Vm-dev mailing list