[squeak-dev] The Inbox: Kernel-mtf.924.mcz

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Sat May 2 21:10:16 UTC 2015


2015-05-02 23:04 GMT+02:00 Nicolas Cellier <
nicolas.cellier.aka.nice at gmail.com>:

>
>
> 2015-05-02 22:32 GMT+02:00 Levente Uzonyi <leves at elte.hu>:
>
>> On Sat, 2 May 2015, Nicolas Cellier wrote:
>>
>>
>>>
>>> 2015-05-02 18:27 GMT+02:00 <commits at source.squeak.org>:
>>>       A new version of Kernel was added to project The Inbox:
>>>       http://source.squeak.org/inbox/Kernel-mtf.924.mcz
>>>
>>>       ==================== Summary ====================
>>>
>>>       Name: Kernel-mtf.924
>>>       Author: mtf
>>>       Time: 2 May 2015, 12:26:05.675 pm
>>>       UUID: 7f688860-5202-4c0d-8ece-8723fe7317d6
>>>       Ancestors: Kernel-nice.923
>>>
>>>       Copied Number >> #round: from Pharo. One of 3 methods needed to
>>> make the Artefact pdf library work on squeak:
>>>       https://sites.google.com/site/artefactpdf/
>>>
>>>       =============== Diff against Kernel-nice.923 ===============
>>>
>>>       Item was added:
>>>       + ----- Method: Float>>round: (in category 'truncation and round
>>> off') -----
>>>       + round: numberOfWishedDecimal
>>>       +         "only leave a fixed amount of decimal"
>>>       +         "10.12345 round: 2 => 10.12"
>>>       +
>>>       +         | v |
>>>       +         v := 10 raisedTo: numberOfWishedDecimal.
>>>       +         ^ ((self * v) rounded / v) asFloat
>>>       + !
>>>
>>>
>>> self assert: (Float fmax round: 2) = Float fmax.
>>>
>>> It's probably not very important for artefact, but if this method has a
>>> wider usage than artefact, then it should better be robust to overflow...
>>>
>>>       Item was added:
>>>       + ----- Method: Fraction>>round: (in category 'truncation and
>>> round off') -----
>>>       + round: numberOfWishedDecimal
>>>       +       ^self asFloat round: numberOfWishedDecimal!
>>>
>>>
>>> Transforming exact arithmetic into inexact Float sounds like heresy to
>>> me ;)
>>> That's a questionable choice.
>>> Why this cult to Float would be necessary here?
>>>
>>>       Item was added:
>>>       + ----- Method: Integer>>round: (in category 'truncation and round
>>> off') -----
>>>       + round: numberOfWishedDecimal
>>>       +       ^self!
>>>
>>>       Item was added:
>>>       + ----- Method: Number>>round: (in category 'truncation and round
>>> off') -----
>>>       + round: numberOfWishedDecimal
>>>       +       self subclassResponsibility!
>>>
>>>
>>> If it's subclass responsibility, then it must be implemented in
>>> ScaledDecimal.
>>> This is not necessary in Pharo, because ScaledDecimal has been moved
>>> under Fraction, but it is in Squeak.
>>> I'd rather see Float implementation moved up (without the asFloat) and
>>> Float invoking super asFloat...
>>>
>>> I didn't check artefact, but I suspect that the usage is just to
>>> printShowingMaxDecimals: numberOfWishedDecimal, which would make the whole
>>> method
>>> moot.
>>>
>>
>> The method was probably written by someone who's not aware of #roundTo:.`
>>
>
> No, this is because 'x roundTo: (10 raisedTo: n) reciprocal' is a bit
> worse than '(x * (10 raisedTo: n) asFloat) rounded / (10 raisedTo: n)
> asFloat'
> Indeed, in the first one you perform one more inexact operation (1/100 ~=
> 0.01).
>
> But anyway, these are vain efforts, because #round: in Pharo still
> cumulates several inexact operations and thus will sometimes fail to
> deliver the correct answer.
>
> For example:
>     self assert: 1.0005 < (5/10000+1) ==> ((1.0005 round: 3) = 1).
> alas, it answers 1.001 and differs from printShowingMaxDecimalPlaces: 3...
> Definitely not top quality.
>
> I think Pharo did not integrate printShowingMaxDecimalPlaces: so that
> probably explains the mistake.
> Or maybe they were influenced by Python round, but should have checked how
> it is implemented:
> For example, see
> https://github.com/python/cpython/blob/c7688b44387d116522ff53c0927169db45969f0e/Python/pymath.c
>
> double round(double x) { double absx, y; absx = fabs(x); y = floor(absx);
> if (absx - y >= 0.5) y += 1.0; return copysign(y, x); }
>

Oups, that's round without argument...


>
> That should translate easily in Smalltalk if REALLY necessary...
>
>
> You're right about the printing thing in Artefact. I replaced #round: with
>> #printOn:maxDecimalPlaces: in my image.
>>
>>
> Easy to guess, the only other possible use I can think of, is naive
> monetary apps; that makes two reasons to ban the message ;)
>
>
>
> Levente
>>
>>
>>> Nicolas
>>>
>>>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150502/31715ffe/attachment.htm


More information about the Squeak-dev mailing list