---
name: "fma"
section: "3"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/fma"
---

# fma(3)

floating-point multiply and add

## NAME

fma, fmaf, fmal - floating-point multiply and add

## LIBRARY

Math library (*libm*, *-lm*)

## SYNOPSIS

```
#include <math.h>
```

**double fma(double** *x***, double** *y***, double** *z***);** **float fmaf(float** *x***, float** *y***, float** *z***);** **long double fmal(long double** *x***, long double** *y***, long double** *z***);**

Feature Test Macro Requirements for glibc (see [**feature\_test\_macros**(7)](/feature_test_macros/7.md)):

**fma**(), **fmaf**(), **fmal**():

```
    _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L
```

## DESCRIPTION

These functions compute *x* \* *y* + *z*. The result is rounded as one ternary operation according to the current rounding mode (see [**fenv**(3)](/fenv/3.md)).

## RETURN VALUE

These functions return the value of *x* \* *y* + *z*, rounded as one ternary operation.

If *x* or *y* is a NaN, a NaN is returned.

If *x* times *y* is an exact infinity, and *z* is an infinity with the opposite sign, a domain error occurs, and a NaN is returned.

If one of *x* or *y* is an infinity, the other is 0, and *z* is not a NaN, a domain error occurs, and a NaN is returned.

If one of *x* or *y* is an infinity, and the other is 0, and *z* is a NaN, a domain error occurs, and a NaN is returned.

If *x* times *y* is not an infinity times zero (or vice versa), and *z* is a NaN, a NaN is returned.

If the result overflows, a range error occurs, and an infinity with the correct sign is returned.

If the result underflows, a range error occurs, and a signed 0 is returned.

## ERRORS

See [**math\_error**(7)](/math_error/7.md) for information on how to determine whether an error has occurred when calling these functions.

The following errors can occur:

- Domain error: *x \* y + z* or *x \* y* is invalid.

  An invalid floating-point exception (**FE\_INVALID**) is raised.

- Range error: result overflow

  An overflow floating-point exception (**FE\_OVERFLOW**) is raised.

- Range error: result underflow

  An underflow floating-point exception (**FE\_UNDERFLOW**) is raised.

These functions do not set *errno*.

## ATTRIBUTES

For an explanation of the terms used in this section, see [**attributes**(7)](/attributes/7.md).

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **fma**(), **fmaf**(), **fmal**() | Thread safety | MT-Safe |

## STANDARDS

C11, POSIX.1-2008.

## HISTORY

glibc 2.1. C99, POSIX.1-2001.

## SEE ALSO

[**remainder**(3)](/remainder/3.md), [**remquo**(3)](/remquo/3.md)
