public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "paolo.carlini at oracle dot com" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug libstdc++/47913] [C++0x] improve ratio_add to overflow less often Date: Wed, 02 Mar 2011 10:59:00 -0000 [thread overview] Message-ID: <bug-47913-4-Zhyl12QiJA@http.gcc.gnu.org/bugzilla/> (raw) In-Reply-To: <bug-47913-4@http.gcc.gnu.org/bugzilla/> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47913 --- Comment #8 from Paolo Carlini <paolo.carlini at oracle dot com> 2011-03-02 10:59:06 UTC --- Hi, > > 1- Please make sure the code is minimally documented (are the comments in > > longlong.h enough?) > > Ok, I wasn't sure it was worth it if the code was unlikely to ever make it. Right. Mine was sort of a general comment: the comments in ratio_less are also rather terse ;) > > 2- I see stuff like __builtin_clzll(__d) on __d a uintmax_t, I'm not sure it's > > always ok, on any 32-bit and 64-bit target. > > Do you have a better alternative in mind? Should I reimplement it using > templates? It shouldn't be too hard, but I would check on the gcc ML first. I don't think you should really handcode something, just pick the right __builtin_* depending on the actual type of uintmax_t (after all it's just a typedef for one of the builtin types). Thus, if we aim for something really general here, use just a bit of templates to pick the best match among the various available __builtin_*, via make_signed on uintmax_t and then three special cases for int, long, long long. Granted, probably on widespread 32-bit and 64-bit machines, long long it's indeed a safe bet. > > More generally - I'm asking to Marc the mathematician > > here, not Mark the libstdc++ contributor - do we have a clear characterization > > of which specific overflows can be avoided? > > All of those where both the input and the output are legal std::ratio. Right. I was just curious to understand whether we can somehow characterize the inputs which are going anyway to overflow either numerator or denominator. I'm trying to figure out what the brute force approach boils down to: is it just matter of attempting simplification at each arithmetic operation, or we have to do also something else, of a more global nature in order to achieve the goal? Whatever we do, I think eventually we need something in a comment before the code anyway... > Boost isn't exactly equivalent to gcc. Making a mix of their ratio and rational > (and possibly extrapolating a bit), they avoid some overflows of the numerator > by factoring out the gcd of the numerators, and they avoid all overflows of the > denominator by reducing the numerator with the gcd of the denominators so they > can compute directly the right denominator. They still fail on 2 types of > numerator overflow, either when the numerator is too large before > simplification with the gcd, or when the 2 products are large but their sum is > small. The example at the end of the attached file shows the second case. Understood. Since 4.6.0 is approaching, do you think it would make sense for this release series to modify only a bit the GCC code, to the point that we are as good or even slightly better, if possible, than Boost, without requiring too much new code? I fear regressions, as you of course can easily understand. Ideally, we should add, mano a mano, testcases for each "subclass" of inputs which we are able to process without overflowing.
next prev parent reply other threads:[~2011-03-02 10:59 UTC|newest] Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-02-27 13:23 [Bug libstdc++/47913] New: " marc.glisse at normalesup dot org 2011-02-27 14:13 ` [Bug libstdc++/47913] " paolo.carlini at oracle dot com 2011-02-27 19:33 ` marc.glisse at normalesup dot org 2011-02-27 23:38 ` paolo.carlini at oracle dot com 2011-02-28 1:33 ` paolo.carlini at oracle dot com 2011-03-01 22:16 ` marc.glisse at normalesup dot org 2011-03-01 23:00 ` paolo.carlini at oracle dot com 2011-03-02 10:00 ` marc.glisse at normalesup dot org 2011-03-02 10:59 ` paolo.carlini at oracle dot com [this message] 2011-03-02 11:50 ` marc.glisse at normalesup dot org 2011-03-02 11:54 ` marc.glisse at normalesup dot org 2011-03-02 11:59 ` paolo.carlini at oracle dot com 2011-03-02 12:07 ` paolo.carlini at oracle dot com 2011-03-02 14:05 ` marc.glisse at normalesup dot org 2011-03-02 14:15 ` paolo.carlini at oracle dot com 2011-03-02 14:58 ` paolo at gcc dot gnu.org 2011-03-02 14:59 ` paolo.carlini at oracle dot com 2011-03-02 20:50 ` marc.glisse at normalesup dot org 2011-03-02 23:21 ` paolo.carlini at oracle dot com 2011-03-03 6:41 ` marc.glisse at normalesup dot org 2011-03-03 9:51 ` paolo.carlini at oracle dot com 2011-05-04 16:35 ` marc.glisse at normalesup dot org 2011-05-04 17:05 ` paolo.carlini at oracle dot com 2011-05-04 18:08 ` paolo.carlini at oracle dot com 2011-05-04 23:28 ` paolo at gcc dot gnu.org 2011-05-04 23:36 ` paolo.carlini at oracle dot com
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=bug-47913-4-Zhyl12QiJA@http.gcc.gnu.org/bugzilla/ \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).