PreviousIndexLast

[bug-gsl] Re: diff.c (numerical differentiation) (2008-04-10)

From: spasmous <spasmous@.........>
Subject: Re: diff.c (numerical differentiation)
Date: Thu, 10 Apr 2008 13:22:16 -0700
To: bug-gsl@gnu.org

Hi Brian,

Sorry that may also be foiled if the CPU has high precision registers.
I think it's necessary to add a volatile variable to force the compiler to
use the same precision throughout.


volatile double y;
...
h = sqrt (GSL_SQRT_DBL_EPSILON / (2.0 * a2));
...
// ensure difference between (x+h) and h are representable in double
y = x+h;
h = y-x;

*result = (GSL_FN_EVAL (f, x + h) - GSL_FN_EVAL (f, x)) / h;


Thanks!



On Tue, Apr 8, 2008 at 1:55 PM, Brian Gough <bjg@network-theory.co.uk>
wrote:

> At Sun, 6 Apr 2008 13:29:41 -0700,
> spasmous wrote:
> > h = sqrt (GSL_SQRT_DBL_EPSILON / (2.0 * a2));
> > ...
> > h = (x+h)-x; // ensure difference between (x+h) and x is exactly h
> > *result = (GSL_FN_EVAL (f, x + h) - GSL_FN_EVAL (f, x)) / h;
>
> Thanks for the suggestion.
>
> --
> Brian Gough
>