[Cuis-dev] More on The Cuis Book
Ignacio Sniechowski
0800nacho at gmail.com
Mon Mar 6 04:03:26 PST 2023
Thanks for your response, Martin!
I thought that #roundTo: only affected representation, but it seems that
there are some caveats when applied to floatings.
I've experimented with 0.1, 0.01, and 0.001, and this misrepresentation
affects other numbers in the interval. So the lesson would be: be careful
with #roundUp: & similar methods when using floating as the imagined or
expected representation could fail.
Thanks again
Nacho
*Ignacio Sniechowski*
On Sun, Mar 5, 2023 at 10:34 PM Martin McClure <martin at hand2mouse.com>
wrote:
> On 3/5/23 16:51, Ignacio Sniechowski via Cuis-dev wrote:
>
> Float pi to: 5 by: 1/3 do: [:i | Transcript show: (i roundTo: 0.01) ;
> space] ⇒ 3.14 3.47 3.81 4.14 4.47 4.81
> *"*3.14 3.47 3.81 4.14 4.47 4.8100000000000005" the last number is not
> rounded...
> What is especially intriguing is the last case...that 4.8100000000000005
> is not rounded.
>
>
> Hi Nacho,
>
> Ah, welcome the lovely and confusing world of decimal expressions of
> binary floating-point numbers.
>
> What is not obvious here is that the last case *is* rounded.
>
> "roundTo: 0.01" requests that the result be an exact multiple of 0.01. But
> 0.01 is not exactly representable as a floating-point number, so the
> closest Float is used, and that float is a bit greater than 1/100.
>
> 0.01 asFraction > (1/100) ==> true
>
> So we end up with a float that is 481 * 0.01, which is a little more than
> 481 / 100, *and* there exists a different float which is closer to 481 /
> 100. Every float has a unique default print string. The string '4.81' is
> used for that other float, so we have to use the string
> '4.8100000000000005' for the float that is the correct result of the
> expression.
>
> Regards,
> -Martin
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20230306/09d06c28/attachment.htm>
More information about the Cuis-dev
mailing list