On 7/7/21 3:16 PM, Morten Welinder wrote:
> Gnumeric's rounding here is indeed done with
>
> round_to_int(x * 10^d) / 10^d
>
> except that round_to_int deliberately misrounds 0.5-1ulp to 1.
I observe that it's not quite that simple.
I assume the intent is the following:
If the input differs from the nearest integer by only one epsilon,
gnumeric uses the integer value instead.
Call this scheme [A].
Let's focus attention on the int() spreadsheet function.
For positive numbers, I observe that the behavior can be
described as follows:
apply scheme [A], then call POSIX floor().
In contrast, however, for negative numbers I observe that
scheme [A] is not successfully applied. The observed behavior
is identical to POSIX floor().
Diagrams of this are here:
https://www.av8n.com/hack/img48/non-posix-floor_1.png
https://www.av8n.com/hack/img48/non-posix-floor_-1.png
The spreadsheet used to compute the diagrams is here:
https://www.av8n.com/hack/non-posix-floor.gnumeric
I am aware that the function go_fake_floor() in file
...../goffice/goffice/math/go-math.c
contains code that seemingly tries to apply scheme [A],
but even so, the observed numerical result does not conform
to scheme [A].
I don't much care, because I try not to do calculations that
are sensitive to the 16th decimal place. Furthermore, it's
easy to defend against the depredations of scheme [A].
Even so, the observed behavior sure is weird.
_______________________________________________
gnumeric-list mailing list
gnumeric-list gnome org
https://mail.gnome.org/mailman/listinfo/gnumeric-list