This is the mail archive of the libc-hacker@sourceware.cygnus.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
ISO C99 seems to have added after the final draft some information about errno in <math.h> with the macros MATH_ERRNO, MATH_ERREXCEPT and math_errhandling. § 7.12.1 defines the usage of these three macros (§ 7.12 gives details about the declaration). The open question is which value math_errhandling should get. It can have the following values: - 0 meaning: Nothing known about errno and floating-point exceptions. - 1 (MATH_ERRNO): * errno is set to EDOM for a domain error; * errno is set to ERANGE for an overflow * errno might be set to ERANGE for underflows - 2 (MATH_ERREXCEPT): * An ``invalid'' floating-point exception is raised for a domain error; * ``divide-by-zero'' or ``overflow'' floating-point exceptions are raised for overflow * An ``underflow'' floating-point exception might be raised for underflow - 3 (MATH_ERRNO|MATH_ERREXCEPT): Combination of 1 and 2 I'm not sure if we're consistent in glibc's setting of errno and raising the flags. For example if -ffast-math is used, we cannot have math_errhandling & MATH_ERRNO set. Setting math_errhandling to MATH_ERREXCEPT should be fine but I'm not sure if we checked all places. If we'd like to be on the safe side, we could set math_errhandling to 0 - but that's lazyness, I do think we can do better ;-). What's the right value to use? I can provide a patch by the end of the week, I'm travelling on Monday/Tuesday. Andreas P.S. Here're some parts of the standard: [#9] The macros MATH_ERRNO MATH_ERREXCEPT expand to the integer constants 1 and 2, respectively; the macro math_errhandling expands to an expression that has type int and the value MATH_ERRNO, MATH_ERREXCEPT, or the bitwise OR of both. The value of math_errhandling is constant for the duration of the program. It is unspecified whether math_errhandling is a macro or an identifier with external linkage. If a macro definition is suppressed or a program defines an identifier with the name math_errhandling, the behavior is undefined. If the expression math_errhandling & MATH_ERREXCEPT can be nonzero, the implementation shall define the macros FE_DIVBYZERO, FE_INVALID, and FE_OVERFLOW in <fenv.h>. 7.12.1 Treatment of error conditions [#1] The behavior of each of the functions in <math.h> is specified for all representable values of its input arguments, except where stated otherwise. Each function shall execute as if it were a single operation without generating any externally visible exceptional conditions. [#2] For all functions, a domain error occurs if an input argument is outside the domain over which the mathematical function is defined. The description of each function lists any required domain errors; an implementation may define additional domain errors, provided that such errors are consistent with the mathematical definition of the function.194) On a domain error, the function returns an implementation-defined value; if the integer expression math_errhandling & MATH_ERRNO is nonzero, the integer expression errno acquires the value EDOM; if the integer expression math_errhandling & MATH_ERREXCEPT is nonzero, the ``invalid'' floating-point exception is raised. [#3] Similarly, a range error occurs if the mathematical result of the function cannot be represented in an object of the specified type, due to extreme magnitude. [#4] A floating result overflows if the magnitude of the mathematical result is finite but so large that the mathematical result cannot be represented without extraordinary roundoff error in an object of the specified type. If a floating result overflows and default rounding is in effect, or if the mathematical result is an exact infinity (for example log(0.0)), then the function returns the value of the macro HUGE_VAL, HUGE_VALF, or HUGE_VALL according to the return type, with the same sign as the correct value of the function; if the integer expression math_errhandling & MATH_ERRNO is nonzero, the integer expression errno acquires the value ERANGE; if the integer expression math_errhandling & MATH_ERREXCEPT is nonzero, the ``divide-by-zero'' floating-point exception is raised if the mathematical result is an exact infinity and the ``overflow'' floating-point exception is raised otherwise. [#5] The result underflows if the magnitude of the mathematical result is so small that the mathematical result cannot be represented, without extraordinary roundoff error, in an object of the specified type.195) If the result underflows, the function returns an implementation-defined value whose magnitude is no greater than the smallest normalized positive number in the specified type; if the integer expression math_errhandling & MATH_ERRNO is nonzero, whether errno acquires the value ERANGE is implementation- defined; if the integer expression math_errhandling & MATH_ERREXCEPT is nonzero, whether the ``underflow'' floating-point exception is raised is implementation- defined. -- Andreas Jaeger SuSE Labs aj@suse.de private aj@arthur.inka.de
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |