mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-14 02:47:07 +03:00
57 lines
1.4 KiB
C
57 lines
1.4 KiB
C
|
/*
|
||
|
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 */
|