On 2005-06-01 00:58:25 +0200, Andreas Schwab wrote:
> You are mistaken.
No, I don't see any problem.
> #include <assert.h>
> #include <float.h>
>
> long double one = 1.0;
> long double one_plus_eps;
>
> int
> main (void)
> {
> long double one_plus_eps;
>
> one_plus_eps = one + LDBL_EPSILON;
> assert (one != one_plus_eps);
> return 0;
> }
I don't know how the standard should be interpreted (see below), but
if your program fails, this means that either your program is buggy
or the C implemention is buggy.
The standard says for LDBL_EPSILON: "the difference between 1 and the
least value greater than 1 that is representable in the given floating
point type, b^(1-p)".
One may decide that p = 64. The processor will round to double
precision, but that's OK since the C standard doesn't require
correct rounding (the accuracy is implementation-defined, as
said in #4). Your program will fail because it is not portable:
you made some assumptions about the accuracy.
One may decide that p = 53. I think this is better. Your program
will work (unless LDBL_EPSILON has a value assuming that p = 64,
but this would mean that your C implementation is buggy).
--
Vincent Lef�vre <[EMAIL PROTECTED]> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA