[R] [External] Funky calculations

Richard M. Heiberger
2022-02-02T02:04:45Z

I apologize if my tone came across wrong.  I enjoy reading your comments on this
list.

My goal was to describe what the IEEE and R interpret "careful coding"
to be.

> On Feb 01, 2022, at 20:42, Avi Gross <avigross at verizon.net> wrote:
>
> Richard,
>
> I think it was fairly clear I was explaining how people do arithmetic
manually and often truncate or round to some number of decimal places. I said
nothing about what R does or what the IEEE standards say and I do not
particularly care when making MY point.
>
> My point is that humans before computers also had trouble writing down any
decimals that continue indefinitely. It cannot be expected computer versions of
arithmetic can do much better. Different people can opt to do the calculation
with the same or different numbers of digits ad when compared to each other they
may not match.
>
> I do care what it does in my programs, of course. My goal here was to
explain to someone that the anomaly found was not really an anomaly and that
careful coding may be required in these situations.
>
>
> -----Original Message-----
> From: Richard M. Heiberger <rmh at temple.edu>
> To: Avi Gross <avigross at verizon.net>
> Cc: Nathan Boeger <nboeger at gmail.com>; r-help at r-project.org
<r-help at r-project.org>
> Sent: Tue, Feb 1, 2022 2:44 pm
> Subject: Re: [External] [R] Funky calculations
>
>
> RShowDoc('FAQ')
>
>
> then search for 7.31
>
>
> This statement
> "If you stop at a 5 or 7 or 8 and back up to the previous digit, you
round up. Else you leave the previous result alone."
> is not quite right.  The recommendation in IEEE 754, and this is how R does
arithmetic, is to Round Even.
>
> I ilustrate here with decimal, even though R and other programs use binary.
>
>> x <- c(1.4, 1.5, 1.6, 2.4, 2.5, 2.6, 3.4, 3.5, 3.6, 4.4, 4.5, 4.6)
>> r <- round(x)
>> cbind(x, r)
>         x r
> [1,] 1.4 1
> [2,] 1.5 2
> [3,] 1.6 2
> [4,] 2.4 2
> [5,] 2.5 2
> [6,] 2.6 3
> [7,] 3.4 3
> [8,] 3.5 4
> [9,] 3.6 4
> [10,] 4.4 4
> [11,] 4.5 4
> [12,] 4.6 5
>>
>
> Numbers whose last digit is not 5 (when in decimal) round to the nearest
integer.
> Numbers who last digit is 5 (1.5, 2.5, 3.5, 4.5 above)
> round to the nearest EVEN integer.
> Hence 1.5 and 3.5 round up to the even numbers 2 and 4.
> 2.5 and 4.5 round down do the even numbers 2 and 4.
>
> This way the round ups and downs average out to 0.  If we always went up
from .5 we would have
> an updrift over time.
>
> For even more detail click on the link in FAQ 7.31 to my appendix
> https:// link.springer.com/content/pdf/bbm%3A978-1-4939-2122-5%2F1.pdf
> and search for "Appendix G".
>
> Section G.5 explains Round to Even.
> Sections G.6 onward illustrate specific examples, such as the one that
started this email thread.
>
> Rich
>