This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v3 2/3] Add default implementation of fenv.h and all methods


On 2019-08-07 07:28, Joel Sherrill wrote:
> On Wed, Aug 7, 2019 at 8:27 AM Howland, Craig D. via newlib wrote:
>> On Wednesday, August 7, 2019 4:36 AM Corinna Vinschen wrote:
>>> On Aug  6 14:13, Joel Sherrill wrote:

Wouldn't it be clearer to conditionally define those constants based on some
obviously fictional symbol e.g.

#if FLOATING_POINT_EXCEPTIONS_SUPPORTED	// replace by implementation symbol
/*
 * The following macros are to be defined if the respective exception is
 * supported by the implementation, each with a unique bit mask:
 *
 *	FE_DIVBYZERO
 *	FE_INEXACT
 *	FE_INVALID
 *	FE_OVERFLOW
 *	FE_UNDERFLOW
 *
 * Other implementation-specific exceptions may be defined, and must start
 * with FE_ followed by a capital letter.
 *
 * FE_ALL_EXCEPT must be defined as the logical OR of all exceptions.
 */
#define FE_DIVBYZERO 0x00000001
#define FE_INEXACT   0x00000002
#define FE_INVALID   0x00000004
#define FE_OVERFLOW  0x00000008
#define FE_UNDERFLOW 0x00000010

#define FE_ALL_EXCEPT \
	(FE_DIVBYZERO|FE_INEXACT|FE_INVALID|FE_OVERFLOW|FE_UNDERFLOW)

/*
 * The following macros are to be defined if the respective rounding direction
 * is supported by the implementation via the fegetround() and fesetround()
 * functions, each with a unique positive value.
 *
 *   FE_DOWNWARD
 *   FE_TONEAREST
 *   FE_TOWARDZERO
 *   FE_UPWARD
 *
 * Other implementation-specific rounding modes may be defined, and must start
 * with FE_ followed by a capital letter.
 */
#define FE_DOWNWARD        1
#define FE_TONEAREST       2
#define FE_TOWARDZERO      3
#define FE_UPWARD          4

#endif // FLOATING_POINT_EXCEPTIONS_SUPPORTED - replace by implementation symbol

#define FE_ALL_EXCEPT 0      /* NONE SUPPORTED IN PLACEHOLDER TEMPLATE */

>>>> +/*
>>>> + * The following typedefs are required. See the C and POSIX standards
>> for
>>>> + * details:
>>>> + *
>>>> + *   fenv_t
>>>> + *   fexcept_t
>>>> + */
>>>> +typedef size_t fenv_t;
>>>> +typedef size_t fexcept_t;

>>> While these types are defined, the above macros are not.  Wouldn't
>>> it make sense to define all or nothing by default?

>> The standards require the types to be defined, but the individual macros
>> are to be defined only if supported by the implementation.  The
>> default implementation being provided supports nothing, only
>> returning error, so it is proper for them to not be defined.  But having
>> them there commented out to serve as a template seems to be a good thing.

> Quick reply. :)
> This is the POSIX language:
> "The *<fenv.h>* header shall define the following constants if and only if
> the implementation supports the floating-point exception by means of the
> floating-point functions *feclearexcept*(), *fegetexceptflag*(),
> *feraiseexcept*(), *fesetexceptflag*() and *fetestexcept*().
> Each expands to an integer constant expression with values such that
> bitwise-inclusive ORs of all combinations of the constants result in
> distinct values."

-- 
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada

This email may be disturbing to some readers as it contains
too much technical detail. Reader discretion is advised.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]