Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| From | Tim Rentsch <txr@alumni.caltech.edu> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: Test for overflow |
| Date | 2015-03-30 06:54 -0700 |
| Organization | A noiseless patient Spider |
| Message-ID | <kfnpp7q615a.fsf@x-alumni2.alumni.caltech.edu> (permalink) |
| References | <mfbbc6$9h9$3@speranza.aioe.org> |
jacob navia <jacob@jacob.remcomp.fr> writes:
> Hi the math experts!
>
> When parsing a digit sequence I test for overflow not by
> calculating the maximum number of digits allowed but just
> with the test
>
> tvalue = value * base;
>
> if (tvalue < value) {
> // overflow detected
> }
>
> I am assuming then that
>
> if value * base > 2^64 then
> value * base mod 2^64 < value
>
> for base >= 2 and base <= 36.
>
> Is this correct?
No.
You can test for out-of-range as follows:
If the maximum allowed value is 'ceiling', and assuming the
current value is in 'n', and the next digit value is in 'd',
then before the loop calculate
unsigned long long q = ceiling / base, r = ceiling % base;
// q is for "quotient", r is for "remainder"
and in the body of the loop test
if( n >= q && (n > q || d > r) ){
// augmenting 'n' with digit 'd' would exceed 'ceiling'
...
}
Done this way only this one test need be done, and which in
most cases will do only a single comparison.
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Test for overflow jacob navia <jacob@jacob.remcomp.fr> - 2015-03-30 13:17 +0200
Re: Test for overflow Lőrinczy Zsigmond <zsiga@nospam.for.me> - 2015-03-30 13:34 +0200
Re: Test for overflow Richard Damon <Richard@Damon-Family.org> - 2015-03-30 07:42 -0400
Re: Test for overflow asetofsymbols@gmail.com - 2015-03-30 04:47 -0700
Re: Test for overflow jacob navia <jacob@jacob.remcomp.fr> - 2015-03-30 13:57 +0200
Re: Test for overflow Richard Damon <Richard@Damon-Family.org> - 2015-03-30 08:24 -0400
Re: Test for overflow Richard Heathfield <rjh@cpax.org.uk> - 2015-03-30 13:03 +0100
Re: Test for overflow Tim Rentsch <txr@alumni.caltech.edu> - 2015-03-30 06:54 -0700
Re: Test for overflow James Kuyper <jameskuyper@verizon.net> - 2015-03-30 13:20 -0400
Re: Test for overflow James Kuyper <jameskuyper@verizon.net> - 2015-03-30 13:32 -0400
Re: Test for overflow James Kuyper <jameskuyper@verizon.net> - 2015-03-30 19:43 -0400
Re: Test for overflow jacob navia <jacob@jacob.remcomp.fr> - 2015-03-31 07:11 +0200
Re: Test for overflow James Kuyper <jameskuyper@verizon.net> - 2015-03-31 13:41 -0400
Re: Test for overflow jacob navia <jacob@jacob.remcomp.fr> - 2015-03-31 19:48 +0200
Re: Test for overflow James Kuyper <jameskuyper@verizon.net> - 2015-03-31 13:58 -0400
Re: Test for overflow Thomas Jahns <jahns@idontlikespam.dkrz.de> - 2015-04-01 10:12 +0200
Re: Test for overflow Richard Heathfield <rjh@cpax.org.uk> - 2015-04-01 09:43 +0100
Re: Test for overflow Thomas Jahns <jahns@idontlikespam.dkrz.de> - 2015-04-01 10:59 +0200
Re: Test for overflow Malcolm McLean <malcolm.mclean5@btinternet.com> - 2015-04-01 04:07 -0700
Re: Test for overflow raltbos@xs4all.nl (Richard Bos) - 2015-04-01 13:52 +0000
csiph-web