Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #59271

Re: Test for overflow

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>

Show all headers | View raw


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


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