[Bug c/88451] New: No rounding in fixed-point arithmetic (Decimal to fixed-point conversion, multiplication)

mantas.mikaitis at manchester dot ac.uk gcc-bugzilla@gcc.gnu.org
Tue Dec 11 13:53:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88451

            Bug ID: 88451
           Summary: No rounding in fixed-point arithmetic (Decimal to
                    fixed-point conversion, multiplication)
           Product: gcc
           Version: 6.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mantas.mikaitis at manchester dot ac.uk
  Target Milestone: ---

Hello,

This bug report is about that there is no rounding in various parts of the
fixed-point arithmetic. Here are some cases run on ARM968:

1)

accum x = 0.04k; // This ends up as 0.03997802734375.

————————

2)

double x = 0.04;
accum y = x; // This ends up as 0.03997802734375.

————————

As you can notice, 0.04 is rounded down to 0.03997802734375, however, the
nearest accum to the 0.04 is 0.040008544921875.

3)

Multiplication of two accums results in a 63-bit value which needs to be
shifted right to put the result back to the accum type. Upon a shift, there is
no rounding and 15 bottom bits are truncated.

————————

It seems to be doing binary truncation instead of rounding, which is also
mathematically legal operation, but introduces a larger error. Looking into the
ISO draft standard for fixed-point arithmetic, it specifies that
FX_FULL_PRECISION pragma can be used to obtain full precision:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n968.pdf, but it seems to have
no effect when I turn it on.

I am working with gcc version 6.3.1 20170620 (release) [ARM/embedded-6-branch
revision 249437] (GNU MCU Eclipse ARM Embedded GCC, 64-bits).

Many thanks,
Mantas M.


More information about the Gcc-bugs mailing list