123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- .\" Copyright (c) 2005 David Schultz <[email protected]>
- .\" All rights reserved.
- .\"
- .\" Redistribution and use in source and binary forms, with or without
- .\" modification, are permitted provided that the following conditions
- .\" are met:
- .\" 1. Redistributions of source code must retain the above copyright
- .\" notice, this list of conditions and the following disclaimer.
- .\" 2. Redistributions in binary form must reproduce the above copyright
- .\" notice, this list of conditions and the following disclaimer in the
- .\" documentation and/or other materials provided with the distribution.
- .\"
- .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- .\" SUCH DAMAGE.
- .\"
- .\" $FreeBSD: src/lib/msun/man/fma.3,v 1.3 2005/11/24 09:25:10 joel Exp $
- .\"
- .Dd January 22, 2005
- .Dt FMA 3
- .Os
- .Sh NAME
- .Nm fma ,
- .Nm fmaf ,
- .Nm fmal
- .Nd fused multiply-add
- .Sh LIBRARY
- .Lb libm
- .Sh SYNOPSIS
- .In math.h
- .Ft double
- .Fn fma "double x" "double y" "double z"
- .Ft float
- .Fn fmaf "float x" "float y" "float z"
- .Ft long double
- .Fn fmal "long double x" "long double y" "long double z"
- .Sh DESCRIPTION
- The
- .Fn fma ,
- .Fn fmaf ,
- and
- .Fn fmal
- functions return
- .No "(x * y) + z" ,
- computed with only one rounding error.
- Using the ordinary multiplication and addition operators, by contrast,
- results in two roundings: one for the intermediate product and one for
- the final result.
- .Pp
- For instance, the expression
- .No "1.2e100 * 2.0e208 - 1.4e308"
- produces \*(If due to overflow in the intermediate product, whereas
- .No "fma(1.2e100, 2.0e208, -1.4e308)"
- returns approximately 1.0e308.
- .Pp
- The fused multiply-add operation is often used to improve the
- accuracy of calculations such as dot products.
- It may also be used to improve performance on machines that implement
- it natively.
- The macros
- .Dv FP_FAST_FMA ,
- .Dv FP_FAST_FMAF
- and
- .Dv FP_FAST_FMAL
- may be defined in
- .In math.h
- to indicate that
- .Fn fma ,
- .Fn fmaf ,
- and
- .Fn fmal
- (respectively) have comparable or faster speed than a multiply
- operation followed by an add operation.
- .Sh IMPLEMENTATION NOTES
- In general, these routines will behave as one would expect if
- .No "x * y + z"
- were computed with unbounded precision and range,
- then rounded to the precision of the return type.
- However, on some platforms, if
- .Fa z
- is \*(Na, these functions may not raise an exception even
- when the computation of
- .No "x * y"
- would have otherwise generated an invalid exception.
- .Sh SEE ALSO
- .Xr fenv 3 ,
- .Xr math 3
- .Sh STANDARDS
- The
- .Fn fma ,
- .Fn fmaf ,
- and
- .Fn fmal
- functions conform to
- .St -isoC-99 .
- A fused multiply-add operation with virtually identical
- characteristics appears in IEEE draft standard 754R.
- .Sh HISTORY
- The
- .Fn fma
- and
- .Fn fmaf
- routines first appeared in
- .Fx 5.4 ,
- and
- .Fn fmal
- appeared in
- .Fx 6.0 .
|