1d5580d09SDavid Schultz.\" Copyright (c) 2005 David Schultz <das@FreeBSD.org> 2d5580d09SDavid Schultz.\" All rights reserved. 3d5580d09SDavid Schultz.\" 4d5580d09SDavid Schultz.\" Redistribution and use in source and binary forms, with or without 5d5580d09SDavid Schultz.\" modification, are permitted provided that the following conditions 6d5580d09SDavid Schultz.\" are met: 7d5580d09SDavid Schultz.\" 1. Redistributions of source code must retain the above copyright 8d5580d09SDavid Schultz.\" notice, this list of conditions and the following disclaimer. 9d5580d09SDavid Schultz.\" 2. Redistributions in binary form must reproduce the above copyright 10d5580d09SDavid Schultz.\" notice, this list of conditions and the following disclaimer in the 11d5580d09SDavid Schultz.\" documentation and/or other materials provided with the distribution. 12d5580d09SDavid Schultz.\" 13d5580d09SDavid Schultz.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14d5580d09SDavid Schultz.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15d5580d09SDavid Schultz.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16d5580d09SDavid Schultz.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17d5580d09SDavid Schultz.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18d5580d09SDavid Schultz.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19d5580d09SDavid Schultz.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20d5580d09SDavid Schultz.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21d5580d09SDavid Schultz.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22d5580d09SDavid Schultz.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23d5580d09SDavid Schultz.\" SUCH DAMAGE. 24d5580d09SDavid Schultz.\" 25d5580d09SDavid Schultz.Dd January 22, 2005 26d5580d09SDavid Schultz.Dt FMA 3 27d5580d09SDavid Schultz.Os 28d5580d09SDavid Schultz.Sh NAME 29d5580d09SDavid Schultz.Nm fma , 3066d672d8SDavid Schultz.Nm fmaf , 3166d672d8SDavid Schultz.Nm fmal 32d5580d09SDavid Schultz.Nd fused multiply-add 33d5580d09SDavid Schultz.Sh LIBRARY 34d5580d09SDavid Schultz.Lb libm 35d5580d09SDavid Schultz.Sh SYNOPSIS 36d5580d09SDavid Schultz.In math.h 37d5580d09SDavid Schultz.Ft double 38d5580d09SDavid Schultz.Fn fma "double x" "double y" "double z" 39d5580d09SDavid Schultz.Ft float 40d5580d09SDavid Schultz.Fn fmaf "float x" "float y" "float z" 4166d672d8SDavid Schultz.Ft long double 4266d672d8SDavid Schultz.Fn fmal "long double x" "long double y" "long double z" 43d5580d09SDavid Schultz.Sh DESCRIPTION 44d5580d09SDavid SchultzThe 4566d672d8SDavid Schultz.Fn fma , 4666d672d8SDavid Schultz.Fn fmaf , 47d5580d09SDavid Schultzand 4866d672d8SDavid Schultz.Fn fmal 49d5580d09SDavid Schultzfunctions return 50d5580d09SDavid Schultz.No "(x * y) + z" , 51d5580d09SDavid Schultzcomputed with only one rounding error. 52d5580d09SDavid SchultzUsing the ordinary multiplication and addition operators, by contrast, 53d5580d09SDavid Schultzresults in two roundings: one for the intermediate product and one for 54d5580d09SDavid Schultzthe final result. 55d5580d09SDavid Schultz.Pp 56d5580d09SDavid SchultzFor instance, the expression 57d5580d09SDavid Schultz.No "1.2e100 * 2.0e208 - 1.4e308" 58d5580d09SDavid Schultzproduces \*(If due to overflow in the intermediate product, whereas 59d5580d09SDavid Schultz.No "fma(1.2e100, 2.0e208, -1.4e308)" 60d5580d09SDavid Schultzreturns approximately 1.0e308. 61d5580d09SDavid Schultz.Pp 62d5580d09SDavid SchultzThe fused multiply-add operation is often used to improve the 63d5580d09SDavid Schultzaccuracy of calculations such as dot products. 64d5580d09SDavid SchultzIt may also be used to improve performance on machines that implement 65d5580d09SDavid Schultzit natively. 66d5580d09SDavid SchultzThe macros 6766d672d8SDavid Schultz.Dv FP_FAST_FMA , 68d5580d09SDavid Schultz.Dv FP_FAST_FMAF 6966d672d8SDavid Schultzand 7066d672d8SDavid Schultz.Dv FP_FAST_FMAL 71d5580d09SDavid Schultzmay be defined in 72d5580d09SDavid Schultz.In math.h 73d5580d09SDavid Schultzto indicate that 7466d672d8SDavid Schultz.Fn fma , 7566d672d8SDavid Schultz.Fn fmaf , 76d5580d09SDavid Schultzand 7766d672d8SDavid Schultz.Fn fmal 78d5580d09SDavid Schultz(respectively) have comparable or faster speed than a multiply 79d5580d09SDavid Schultzoperation followed by an add operation. 80d5580d09SDavid Schultz.Sh IMPLEMENTATION NOTES 8166d672d8SDavid SchultzIn general, these routines will behave as one would expect if 82d5580d09SDavid Schultz.No "x * y + z" 83d5580d09SDavid Schultzwere computed with unbounded precision and range, 84d5580d09SDavid Schultzthen rounded to the precision of the return type. 85d5580d09SDavid SchultzHowever, on some platforms, if 86d5580d09SDavid Schultz.Fa z 87d5580d09SDavid Schultzis \*(Na, these functions may not raise an exception even 88d5580d09SDavid Schultzwhen the computation of 89d5580d09SDavid Schultz.No "x * y" 90d5580d09SDavid Schultzwould have otherwise generated an invalid exception. 91d5580d09SDavid Schultz.Sh SEE ALSO 92d5580d09SDavid Schultz.Xr fenv 3 , 93d5580d09SDavid Schultz.Xr math 3 94d5580d09SDavid Schultz.Sh STANDARDS 95d5580d09SDavid SchultzThe 9666d672d8SDavid Schultz.Fn fma , 9766d672d8SDavid Schultz.Fn fmaf , 98d5580d09SDavid Schultzand 9966d672d8SDavid Schultz.Fn fmal 100d5580d09SDavid Schultzfunctions conform to 101d5580d09SDavid Schultz.St -isoC-99 . 102d5580d09SDavid SchultzA fused multiply-add operation with virtually identical 103d5580d09SDavid Schultzcharacteristics appears in IEEE draft standard 754R. 104d5580d09SDavid Schultz.Sh HISTORY 10566d672d8SDavid SchultzThe 10666d672d8SDavid Schultz.Fn fma 10766d672d8SDavid Schultzand 10866d672d8SDavid Schultz.Fn fmaf 10966d672d8SDavid Schultzroutines first appeared in 11066d672d8SDavid Schultz.Fx 5.4 , 11166d672d8SDavid Schultzand 11266d672d8SDavid Schultz.Fn fmal 11366d672d8SDavid Schultzappeared in 11419797b22SJoel Dahl.Fx 6.0 . 115