This is the mail archive of the glibc-bugs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug math/19094] lrint, llrint missing exceptions close to overflow threshold


https://sourceware.org/bugzilla/show_bug.cgi?id=19094

--- Comment #1 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  d0d286d32dda654f8983e8fe77bca0a2cda2051b (commit)
      from  240634ec353e3bf20e669201e6dca885ae35f42d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=d0d286d32dda654f8983e8fe77bca0a2cda2051b

commit d0d286d32dda654f8983e8fe77bca0a2cda2051b
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Thu Oct 8 22:17:45 2015 +0000

    Fix lrint, llrint missing exceptions close to overflow threshold (bug
19094).

    The dbl-64, ldbl-96 and ldbl-128 implementations of lrint and llrint
    fail to produce "invalid" exceptions in cases where the rounded result
    overflows the target type, but truncating the floating-point argument
    to the next integer towards zero does not overflow it (so in
    particular casts do not produce such exceptions).  (This issue cannot
    arise for float, or for double with 64-bit target type, or for ldbl-96
    with 64-bit target type and negative arguments, because of
    insufficient precision in the floating-point type for arguments with
    the relevant property to exist.  It also obviously cannot arise in
    FE_TOWARDZERO mode.)

    This patch fixes these problems by inserting checks for the special
    cases that can occur in each implementation, and explicitly raising
    FE_INVALID (and avoiding the cast if it might raise spurious
    FE_INEXACT, while raising FE_INEXACT explicitly in the cases where it
    is needed; unlike lround and llround, FE_INEXACT is required, not
    optional, for these functions for a within-range inexact result).

    The fixes are conditional on FE_INVALID or FE_INEXACT being defined.
    If any future architecture supports one but not both of those
    exceptions, the code will fail to compile and need fixing to handle
    that case (this seemed better than conditioning on both macros being
    defined, resulting in code that would compile but quietly miss
    exceptions on such a system).

    Tested for x86_64, x86 and mips64.  Tested the ldbl-96 changes (only
    relevant for ia64, it appears) on x86_64 by removing the x86_64
    versions of lrintl / llrintl.

        [BZ #19094]
        * sysdeps/ieee754/dbl-64/s_lrint.c: Include <fenv.h> and
        <limits.h>.
        (__lrint) [FE_INVALID || FE_INEXACT]: Force FE_INVALID exception
        when result overflows but exception would not result from cast.
        * sysdeps/ieee754/ldbl-128/s_llrintl.c: Include <fenv.h> and
        <limits.h>.
        (__llrintl) [FE_INVALID || FE_INEXACT]: Force FE_INVALID exception
        when result overflows but exception would not result from cast.
        * sysdeps/ieee754/ldbl-128/s_lrintl.c: Include <fenv.h> and
        <limits.h>.
        (__lrintl) [FE_INVALID || FE_INEXACT]: Force FE_INVALID exception
        when result overflows but exception would not result from cast.
        * sysdeps/ieee754/ldbl-96/s_llrintl.c: Include <fenv.h> and
        <limits.h>.
        (__llrintl) [FE_INVALID || FE_INEXACT]: Force FE_INVALID exception
        when result overflows but exception would not result from cast.
        * sysdeps/ieee754/ldbl-96/s_lrintl.c: Include <fenv.h> and
        <limits.h>.
        (__lrintl) [FE_INVALID || FE_INEXACT]: Force FE_INVALID exception
        when result overflows but exception would not result from cast.
        * math/libm-test.inc (lrint_test_data): Add more tests.
        (llrint_test_data): Likewise.

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                            |   26 ++++
 NEWS                                 |    2 +-
 math/libm-test.inc                   |  217 ++++++++++++++++++++++++++++++++++
 sysdeps/ieee754/dbl-64/s_lrint.c     |   37 +++++-
 sysdeps/ieee754/ldbl-128/s_llrintl.c |   35 +++++-
 sysdeps/ieee754/ldbl-128/s_lrintl.c  |   54 ++++++++-
 sysdeps/ieee754/ldbl-96/s_llrintl.c  |   19 +++-
 sysdeps/ieee754/ldbl-96/s_lrintl.c   |   55 ++++++++-
 8 files changed, 422 insertions(+), 23 deletions(-)

-- 
You are receiving this mail because:
You are on the CC list for the bug.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]