You copied the Doc URL to your clipboard.


Defined in float.h, the _controlfp() function is provided for compatibility with Microsoft products. It enables you to control exception traps and rounding modes.


The ARM® Compiler toolchain does not support floating-point exception trapping for AArch64 targets.

The function prototype for _controlfp() is:

unsigned int _controlfp(unsigned int new, unsigned int mask);


This function requires a floating-point model that supports exceptions. In ARM Compiler 6 this is disabled by default, and can be enabled by the armclang command-line option -ffp-mode=full.

_controlfp() also modifies a control word using a mask to isolate the bits to modify. For every bit of mask that is zero, the corresponding control word bit is unchanged. For every bit of mask that is nonzero, the corresponding control word bit is set to the value of the corresponding bit of new. The return value is the previous state of the control word.


This is different behavior to that of __ieee_status() or __fp_status(), where you can toggle a bit by setting a zero in the mask word and a one in the flags word.

The following table describes the macros you can use to form the arguments to _controlfp().

Table 5-1 _controlfp argument macros

Macro Description
_MCW_EM Mask containing all exception bits
_EM_INVALID Bit describing the Invalid Operation exception
_EM_ZERODIVIDE Bit describing the Divide by Zero exception
_EM_OVERFLOW Bit describing the Overflow exception
_EM_UNDERFLOW Bit describing the Underflow exception
_EM_INEXACT Bit describing the Inexact Result exception
_MCW_RC Mask for the rounding mode field
_RC_CHOP Rounding mode value describing Round Toward Zero
_RC_UP Rounding mode value describing Round Up
_RC_DOWN Rounding mode value describing Round Down
_RC_NEAR Rounding mode value describing Round To Nearest


The values of these macros are not guaranteed to remain the same in future versions of ARM products. To ensure that your code continues to work if the value changes in future releases, use the macro rather than its value.

For example, to set the rounding mode to round down, call:

_controlfp(_RC_DOWN, _MCW_RC);

To trap the Invalid Operation exception and untrap all other exceptions:

_controlfp(_EM_INVALID, _MCW_EM);

To untrap the Inexact Result exception:

_controlfp(0, _EM_INEXACT);