I'd suggesting checking out sigaddset, and the SIGFPE signal.

Install your own signal handler and do whatever you want when you
detect a SIGFPE.  I believe SIGFPE includes underflow, overflow, and
divide by zero, not sure though.

On Mon, Mar 12, 2001 at 10:08:37AM -0800, Peter Jay Salzman wrote:
> dear all,
> 
> i have code which looks like:
> 
>    long double dr;
>    long double dt;
>    long double rend;
>    long double ratio;
>    long int    N;
>    long unsigned int max_tstep;
> 
>    ratio      = 2.0L;
>    N          = 800;
>    dr         = rend / ((long double)N - 1.0L);
>    dt         = ratio*pow(dr, 2.0L);
> 
>    max_tstep  = (long unsigned int) ceil(endtime / dt);
> 
> sometimes ceil(endtime / dt) is very large, like 2.10944e+85.  this is too
> large even for a long long int.  max_tstep overflows.
> 
> sometimes i don't catch the overflow, and my program can run for a long
> time, producing garbage.
> 
> is there some kind of flag that i can check that gets raised when a
> calculation overflows?   i have many such calculations (which are performed
> once at the beginning, so i'm not worried about performance penalty).
> 
> i guess i can take a look at limit.h to and compare the maximum long
> unsigned int to the value of endtime / dt, but i'd prefer a different
> solution if one exists.  surely there's got to be SOME way of detecting this
> kind of error?
> 
> i care not for portability.  it's running on a bunch of pentium II, III and
> athlon class machines and nothing else.   gcc extensions are welcome
> (although i took a look and didn't see anything immediately helpful).
> 
> the problem is fairly pernicious.  normally i would rescale variables, but
> for this particular problem, a rescaling simply shifts the problem from one
> variable to another.
> 
> thanks!
> pete
> 
> -- 
> "Coffee... I've conquered the Borg on coffee!"               [EMAIL PROTECTED]
>        -- Kathryn Janeway on the virtues of coffee           www.dirac.org/p

Reply via email to