2017-04-11 21:13:36 +00:00
|
|
|
/*
|
|
|
|
FUNCTION
|
2017-10-07 00:16:47 +00:00
|
|
|
<<fma>>, <<fmaf>>---floating multiply add
|
2017-04-11 21:13:36 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
#ifdef __STDC__
|
|
|
|
double fma(double x, double y, double z)
|
|
|
|
#else
|
|
|
|
double fma(x,y)
|
|
|
|
double x;
|
|
|
|
double y;
|
|
|
|
double z;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
/* Implementation defined. */
|
|
|
|
return (x * y) + z;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* _DOUBLE_IS_32BITS */
|