xref: /freebsd/lib/msun/man/fma.3 (revision 0a36787e4c1fa0cf77dcf83be0867178476e372b)
1.\" Copyright (c) 2005 David Schultz <das@FreeBSD.org>
2.\" All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\"
13.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23.\" SUCH DAMAGE.
24.\"
25.\" $FreeBSD$
26.\"
27.Dd January 22, 2005
28.Dt FMA 3
29.Os
30.Sh NAME
31.Nm fma ,
32.Nm fmaf ,
33.Nm fmal
34.Nd fused multiply-add
35.Sh LIBRARY
36.Lb libm
37.Sh SYNOPSIS
38.In math.h
39.Ft double
40.Fn fma "double x" "double y" "double z"
41.Ft float
42.Fn fmaf "float x" "float y" "float z"
43.Ft long double
44.Fn fmal "long double x" "long double y" "long double z"
45.Sh DESCRIPTION
46The
47.Fn fma ,
48.Fn fmaf ,
49and
50.Fn fmal
51functions return
52.No "(x * y) + z" ,
53computed with only one rounding error.
54Using the ordinary multiplication and addition operators, by contrast,
55results in two roundings: one for the intermediate product and one for
56the final result.
57.Pp
58For instance, the expression
59.No "1.2e100 * 2.0e208 - 1.4e308"
60produces \*(If due to overflow in the intermediate product, whereas
61.No "fma(1.2e100, 2.0e208, -1.4e308)"
62returns approximately 1.0e308.
63.Pp
64The fused multiply-add operation is often used to improve the
65accuracy of calculations such as dot products.
66It may also be used to improve performance on machines that implement
67it natively.
68The macros
69.Dv FP_FAST_FMA ,
70.Dv FP_FAST_FMAF
71and
72.Dv FP_FAST_FMAL
73may be defined in
74.In math.h
75to indicate that
76.Fn fma ,
77.Fn fmaf ,
78and
79.Fn fmal
80(respectively) have comparable or faster speed than a multiply
81operation followed by an add operation.
82.Sh IMPLEMENTATION NOTES
83In general, these routines will behave as one would expect if
84.No "x * y + z"
85were computed with unbounded precision and range,
86then rounded to the precision of the return type.
87However, on some platforms, if
88.Fa z
89is \*(Na, these functions may not raise an exception even
90when the computation of
91.No "x * y"
92would have otherwise generated an invalid exception.
93.Sh SEE ALSO
94.Xr fenv 3 ,
95.Xr math 3
96.Sh STANDARDS
97The
98.Fn fma ,
99.Fn fmaf ,
100and
101.Fn fmal
102functions conform to
103.St -isoC-99 .
104A fused multiply-add operation with virtually identical
105characteristics appears in IEEE draft standard 754R.
106.Sh HISTORY
107The
108.Fn fma
109and
110.Fn fmaf
111routines first appeared in
112.Fx 5.4 ,
113and
114.Fn fmal
115appeared in
116.Fx 6.0 .
117