diff options
Diffstat (limited to 'newlib/libm/common/s_fma.c')
-rw-r--r-- | newlib/libm/common/s_fma.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/newlib/libm/common/s_fma.c b/newlib/libm/common/s_fma.c index 86958afcb..964a8284a 100644 --- a/newlib/libm/common/s_fma.c +++ b/newlib/libm/common/s_fma.c @@ -1,3 +1,41 @@ +/* +FUNCTION +<<fma>>, <<fmaf>>--floating multiply add +INDEX + fma +INDEX + fmaf + +ANSI_SYNOPSIS + #include <math.h> + double fma(double <[x]>, double <[y]>, double <[z]>); + float fmaf(float <[x]>, float <[y]>, float <[z]>); + +DESCRIPTION +The <<fma>> functions compute (<[x]> * <[y]>) + <[z]>, rounded as one ternary +operation: they compute the value (as if) to infinite precision and round once +to the result format, according to the rounding mode characterized by the value +of FLT_ROUNDS. That is, they are supposed to do this: see below. + +RETURNS +The <<fma>> functions return (<[x]> * <[y]>) + <[z]>, rounded as one ternary +operation. + +BUGS +This implementation does not provide the function that it should, purely +returning "(<[x]> * <[y]>) + <[z]>;" with no attempt at all to provide the +simulated infinite precision intermediates which are required. DO NOT USE THEM. + +If double has enough more precision than float, then <<fmaf>> should provide +the expected numeric results, as it does use double for the calculation. But +since this is not the case for all platforms, this manual cannot determine +if it is so for your case. + +PORTABILITY +ANSI C, POSIX. + +*/ + #include "fdlibm.h" #ifndef _DOUBLE_IS_32BITS |