forked from KolibriOS/kolibrios
upload sdk
git-svn-id: svn://kolibrios.org@4349 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
56
contrib/sdk/sources/newlib/math/s_fma.c
Normal file
56
contrib/sdk/sources/newlib/math/s_fma.c
Normal file
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
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
|
||||
|
||||
#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 */
|
Reference in New Issue
Block a user