float_control
pragma
Hiermee geeft u gedrag met drijvende komma op voor een functie.
Syntaxis
#pragma float_control
#pragma float_control( precise,
{on
|off
} [, push
])
#pragma float_control( except,
{on
|off
} [, push
])
#pragma float_control(
{push
|pop
})
Opties
precise
, on
| off
, push
Hiermee geeft u op of (on
) of uitschakelen (off
) nauwkeurige drijvendekomma-semantiek. Zie de sectie Opmerkingen voor informatie over verschillen met de optie /fp:precise
compiler. Het optionele push
token pusht de huidige instelling voor float_control
op de interne compilerstack.
except
, on
| off
, push
Hiermee geeft u op of de semantiek van drijvendekommagelingen (on
) moet worden ingeschakeld of uitgeschakeld (off
). Het optionele push
token pusht de huidige instelling voor float_control
op de interne compilerstack.
except
kan alleen worden ingesteld op on
wanneer precise
ook is ingesteld op on
.
push
Hiermee wordt de huidige float_control
-instelling naar de interne compilerstack gepusht.
pop
Hiermee verwijdert u de float_control
instelling boven aan de interne compilerstack en zorgt u ervoor dat de nieuwe float_control
-instelling.
Opmerkingen
De float_control
pragma heeft niet hetzelfde gedrag als de /fp
compileroptie. De float_control
pragma bepaalt alleen een deel van het drijvendekommagegedrag. Deze moet worden gecombineerd met fp_contract
en fenv_access
pragma instructies om de /fp
compileropties opnieuw te maken. In de volgende tabel ziet u de equivalente pragma instellingen voor elke compileroptie:
Optie | 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 versies van Visual Studio vóór Visual Studio 2022 is het /fp:precise
gedrag standaard ingesteld op fp_contract(on)
.
Optie | 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 |
Met andere woorden, mogelijk moet u verschillende pragma instructies in combinatie gebruiken om de /fp:fast
, /fp:precise
en /fp:strict
opdrachtregelopties te emuleren.
Er gelden beperkingen voor de manieren waarop u de float_control
en fenv_access
drijvendekommage pragma instructies in combinatie kunt gebruiken:
U kunt
float_control
alleen gebruiken omexcept
in te stellen opon
als nauwkeurige semantiek is ingeschakeld. Nauwkeurige semantiek kan worden ingeschakeld door defloat_control
pragmaof met behulp van de/fp:precise
of/fp:strict
compileropties.U kunt
float_control
niet gebruiken omprecise
uit te schakelen wanneer de semantiek van uitzonderingen is ingeschakeld, ongeacht of deze zijn ingeschakeld door eenfloat_control
pragma of een/fp:except
compileroptie.U kunt
fenv_access
niet inschakelen, tenzij nauwkeurige semantiek is ingeschakeld, ongeacht of eenfloat_control
pragma of een compileroptie.U kunt
float_control
niet gebruiken omprecise
uit te schakelen wanneerfenv_access
is ingeschakeld.
Deze beperkingen betekenen dat de volgorde van een aantal drijvendekomma-pragma richtlijnen aanzienlijk is. Gebruik de volgende code om van een snel model naar een strikt model te gaan met behulp van pragma instructies:
#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
Gebruik de volgende code om van een strikt model naar een snel model te gaan met behulp van de float_control
pragma:
#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
Als er geen opties zijn opgegeven, heeft float_control
geen effect.
De float_control
richtlijn schakelt contracties uit wanneer deze precise
of except
inschakelt. Gebruik van float_control
om precise
of except
herstelt de vorige instelling voor contracties. U kunt de fp_contract
pragma instructie gebruiken om het compilergedrag op samentrekkingen te wijzigen.
float_control(push)
en float_control(pop)
de instelling voor samentrekkingen pushen en popen als onderdeel van de float_control
-instelling op de interne compilerstack. Dit gedrag is nieuw in Visual Studio 2022. De float_control
-instructie in eerdere compilerversies heeft geen invloed op contractie-instellingen.
Voorbeeld
In het volgende voorbeeld ziet u hoe u een overloopuitzondering met drijvende komma kunt ondervangen met behulp van pragmafloat_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
Zie ook
Pragma-instructies en de __pragma
en _Pragma
trefwoorden
fenv_access
pragma
fp_contract
pragma