[444] | 1 | /* |
---|
| 2 | FUNCTION |
---|
| 3 | <<fma>>, <<fmaf>>---floating multiply add |
---|
| 4 | INDEX |
---|
| 5 | fma |
---|
| 6 | INDEX |
---|
| 7 | fmaf |
---|
| 8 | |
---|
| 9 | SYNOPSIS |
---|
| 10 | #include <math.h> |
---|
| 11 | double fma(double <[x]>, double <[y]>, double <[z]>); |
---|
| 12 | float fmaf(float <[x]>, float <[y]>, float <[z]>); |
---|
| 13 | |
---|
| 14 | DESCRIPTION |
---|
| 15 | The <<fma>> functions compute (<[x]> * <[y]>) + <[z]>, rounded as one ternary |
---|
| 16 | operation: they compute the value (as if) to infinite precision and round once |
---|
| 17 | to the result format, according to the rounding mode characterized by the value |
---|
| 18 | of FLT_ROUNDS. That is, they are supposed to do this: see below. |
---|
| 19 | |
---|
| 20 | RETURNS |
---|
| 21 | The <<fma>> functions return (<[x]> * <[y]>) + <[z]>, rounded as one ternary |
---|
| 22 | operation. |
---|
| 23 | |
---|
| 24 | BUGS |
---|
| 25 | This implementation does not provide the function that it should, purely |
---|
| 26 | returning "(<[x]> * <[y]>) + <[z]>;" with no attempt at all to provide the |
---|
| 27 | simulated infinite precision intermediates which are required. DO NOT USE THEM. |
---|
| 28 | |
---|
| 29 | If double has enough more precision than float, then <<fmaf>> should provide |
---|
| 30 | the expected numeric results, as it does use double for the calculation. But |
---|
| 31 | since this is not the case for all platforms, this manual cannot determine |
---|
| 32 | if it is so for your case. |
---|
| 33 | |
---|
| 34 | PORTABILITY |
---|
| 35 | ANSI C, POSIX. |
---|
| 36 | |
---|
| 37 | */ |
---|
| 38 | |
---|
| 39 | #include "fdlibm.h" |
---|
| 40 | |
---|
| 41 | #ifndef _DOUBLE_IS_32BITS |
---|
| 42 | |
---|
| 43 | #ifdef __STDC__ |
---|
| 44 | double fma(double x, double y, double z) |
---|
| 45 | #else |
---|
| 46 | double fma(x,y) |
---|
| 47 | double x; |
---|
| 48 | double y; |
---|
| 49 | double z; |
---|
| 50 | #endif |
---|
| 51 | { |
---|
| 52 | /* Implementation defined. */ |
---|
| 53 | return (x * y) + z; |
---|
| 54 | } |
---|
| 55 | |
---|
| 56 | #endif /* _DOUBLE_IS_32BITS */ |
---|