नोट
इस पृष्ठ तक पहुंच के लिए प्राधिकरण की आवश्यकता होती है। आप साइन इन करने या निर्देशिकाएँ बदलने का प्रयास कर सकते हैं।
इस पृष्ठ तक पहुंच के लिए प्राधिकरण की आवश्यकता होती है। आप निर्देशिकाएँ बदलने का प्रयास कर सकते हैं।
Specifies floating-point behavior for a function.
Syntax
#pragma float_control
#pragma float_control( precise,{on|off} [, push])
#pragma float_control( except,{on|off} [, push])
#pragma float_control({push|pop})
Options
precise, on | off, push
Specifies whether to enable (on) or disable (off) precise floating-point semantics. For information on differences with the /fp:precise compiler option, see the Remarks section. The optional push token pushes the current setting for float_control on the internal compiler stack.
except, on | off, push
Specifies whether to enable (on) or disable (off) floating-point exception semantics. The optional push token pushes the current setting for float_control on the internal compiler stack.
except can only be set to on when precise is also set to on.
push
Pushes the current float_control setting on to the internal compiler stack.
pop
Removes the float_control setting from the top of the internal compiler stack, and makes that the new float_control setting.
Remarks
The float_control pragma doesn't have the same behavior as the /fp compiler option. The float_control pragma only governs part of the floating-point behavior. It must be combined with fp_contract and fenv_access pragma directives to recreate the /fp compiler options. The following table shows the equivalent pragma settings for each compiler option:
| Option | float_control(precise, *) |
float_control(except, *) |
fp_contract(*) |
fenv_access(*) |
|---|---|---|---|---|
/fp:strict |
on |
on |
off |
on |
/fp:precise |
on |
off |
off* |
off |
/fp:fast |
off |
off |
on |
off |
* In versions of Visual Studio before Visual Studio 2022, the /fp:precise behavior defaulted to fp_contract(on).
| Option | float_control(precise, *) |
float_control(except, *) |
fp_contract(*) |
fenv_access(*) |
|---|---|---|---|---|
/fp:strict |
on |
on |
off |
on |
/fp:precise |
on |
off |
off |
off |
/fp:fast |
off |
off |
on |
off |
In other words, you may need to use several pragma directives in combination to emulate the /fp:fast, /fp:precise, and /fp:strict command-line options.
There are restrictions on the ways you can use the float_control and fenv_access floating-point pragma directives in combination:
You can only use
float_controlto setexcepttoonif precise semantics are enabled. Precise semantics can be enabled either by thefloat_controlpragma, or by using the/fp:preciseor/fp:strictcompiler options.You can't use
float_controlto turn offprecisewhen exception semantics are enabled, whether by afloat_controlpragma or a/fp:exceptcompiler option.You can't enable
fenv_accessunless precise semantics are enabled, whether by afloat_controlpragma or a compiler option.You can't use
float_controlto turn offprecisewhenfenv_accessis enabled.
These restrictions mean the order of some floating-point pragma directives is significant. To go from a fast model to a strict model using pragma directives, use the following code:
#pragma float_control(precise, on) // enable precise semantics
#pragma fenv_access(on) // enable environment sensitivity
#pragma float_control(except, on) // enable exception semantics
#pragma float_control(precise, on) // enable precise semantics
#pragma fenv_access(on) // enable environment sensitivity
#pragma float_control(except, on) // enable exception semantics
#pragma fp_contract(off) // disable contractions
To go from a strict model to a fast model by using the float_control pragma, use the following code:
#pragma float_control(except, off) // disable exception semantics
#pragma fenv_access(off) // disable environment sensitivity
#pragma float_control(precise, off) // disable precise semantics
#pragma fp_contract(on) // enable contractions
If no options are specified, float_control has no effect.
The float_control directive disables contractions when it turns on precise or except. Use of float_control to turn off precise or except restores the previous setting for contractions. You can use the fp_contract pragma directive to change the compiler behavior on contractions. float_control(push) and float_control(pop) push and pop the setting for contractions as part of the float_control setting on to the internal compiler stack. This behavior is new in Visual Studio 2022. The float_control directive in previous compiler versions did not affect contraction settings.
Example
The following sample shows how to catch an overflow floating-point exception by using pragma float_control.
// pragma_directive_float_control.cpp
// compile with: /EHa
#include <stdio.h>
#include <float.h>
double func( ) {
return 1.1e75;
}
#pragma float_control (except, on)
int main( ) {
float u[1];
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, ~_EM_OVERFLOW, _MCW_EM);
if (err != 0)
printf_s("_controlfp_s failed!\n");
try {
u[0] = func();
printf_s ("Fail");
return(1);
}
catch (...) {
printf_s ("Pass");
return(0);
}
}
Pass
See also
Pragma directives and the __pragma and _Pragma keywords
fenv_access pragma
fp_contract pragma