fenv.h implementation questions
Bruce Evans
bde at zeta.org.au
Wed Dec 24 01:09:47 PST 2003
On Tue, 23 Dec 2003, Steven G. Kargl wrote:
> Bruce Evans wrote:
> > On Sun, 21 Dec 2003, Steven G. Kargl wrote:
> >
> > > Is the following a sufficient implementation of fenv.h?
> > > _fenv_t and _fexcept_t would be defined in machine/fenv.h,
> > > which I haven't implemented, yet. I'm assuming that
> > > these may be architecture specific (e.g., endianness).
> >
> > fenv_t and fexcept_t are very MD, and hopefully aren't needed
> > in more than 1 file, so they should be declared directly in
> > <machine/fenv.h>.
>
> Certainly, fenv_t and fexcept_t are MD, but I don't
> believe that their use is restricted to 1 file (unless
> I'm totally misinterpreting what you wrote). Consider,
I checked. It is only defined in <fenv.h> according to C99 (n869.txt
draft) and and POSIX.1-2001 (draft7).
> #include <errno.h>
> #include <fenv.h>
> #include <math.h>
>
> int foo(x) {
> double x;
> fexcept_t bar;
> errno = 0;
> x = ceil(x);
> if (errno != 0) { /* FE occurred */
> fegetexception(&bar, FE_ALL_EXCEPT);
> /* Do something to address FE */
> } else {
> ....
> }
> }
You got it from <fenv.h> there. It is not in <math.h> though.
> (snip)
>
> > > #ifdef _EXCEPTIONS
> > > #define FE_DIVBYZERO 0x00000001 /* Divide by zero */
> > > #define FE_INEXACT 0x00000002 /* Inexact flag raised */
> > > #define FE_INVALID 0x00000004 /* Invalid operation */
> > > #define FE_OVERFLOW 0x00000008 /* Overflow */
> > > #define FE_UNDERFLOW 0x00000010 /* Underflow */
> > > #define FE_ALL_EXCEPT 0x0000001F /* Bitwise-or of above flags */
> > > #endif /* _EXCEPTIONS */
> > >
> > > #ifdef _ROUNDING_MODES
> > > #define FE_DOWNWARD 0x00000020 /* Round downward */
> > > #define FE_TONEAREST 0x00000040 /* Round to nearest */
> > > #define FE_TOWARDZERO 0x00000080 /* Round towards zero */
> > > #define FE_UPWARD 0x00000100 /* Round upwards */
> > > #endif /* _ROUNDING_MODES */
> >
> > These should probably all be MD. It saves a negative amount of code to
> > use a common definition since larger code would be required to convert
> > between the MI bits and the MI bits.
> >
>
> I'll have to look at SuSv3 again, but the above definitions
> should be suitable for both big and little endian machines.
> I'm not sure about 32 bit versus 64 bit machines. Are you
> concerned that an architecture may only support a subset of
> the above flags?
Each arch has its own natural definitions of the flags. E.g., on i386's
the natural division by 0 flag is FP_X_DZ = 0x04, not 0x00000001.
Bruce
More information about the freebsd-standards
mailing list