Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Specifica il comportamento a virgola mobile per una funzione.
Sintassi
#pragma float_control
#pragma float_control( precise,{on|off} [, push])
#pragma float_control( except,{on|off} [, push])
#pragma float_control({push|pop})
Opzioni
precise, on | off, push
Specifica se abilitare (on) o disabilitare (off) la semantica a virgola mobile precisa. Per informazioni sulle differenze con l'opzione del /fp:precise compilatore, vedere la sezione Osservazioni. Il token facoltativo push esegue il push dell'impostazione corrente per float_control nello stack del compilatore interno.
except, on | off, push
Specifica se abilitare () o disabilitare (onoff) la semantica delle eccezioni a virgola mobile. Il token facoltativo push esegue il push dell'impostazione corrente per float_control nello stack del compilatore interno.
except può essere impostato solo su on quando precise è impostato anche su on.
push
Esegue il push dell'impostazione corrente float_control nello stack del compilatore interno.
pop
Rimuove l'impostazione float_control dalla parte superiore dello stack del compilatore interno e imposta la nuova float_control impostazione.
Osservazioni:
non float_controlpragma ha lo stesso comportamento dell'opzione del /fp compilatore. L'unica float_controlpragma regola parte del comportamento a virgola mobile. Deve essere combinato con fp_contract le direttive e fenv_accesspragma per ricreare le opzioni del /fp compilatore. La tabella seguente illustra le impostazioni equivalenti pragma per ogni opzione del compilatore:
| Opzione | 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 |
* Nelle versioni di Visual Studio precedenti a Visual Studio 2022, il /fp:precise comportamento predefinito è fp_contract(on).
| Opzione | 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 altre parole, potrebbe essere necessario usare diverse pragma direttive in combinazione per emulare le /fp:fastopzioni della riga di comando , /fp:precisee /fp:strict .
Esistono restrizioni per i modi in cui è possibile usare le float_control direttive a virgola mobile fenv_access e pragma in combinazione:
È possibile usare
float_controlper impostare suexceptonsolo se è abilitata una semantica precisa. La semantica precisa può essere abilitata dafloat_controlpragmao tramite le opzioni del/fp:precisecompilatore o/fp:strict.Non è possibile usare
float_controlper disattivareprecisequando la semantica delle eccezioni è abilitata, indipendentemente da un'opzionefloat_controlpragma/fp:exceptdel compilatore o .Non è possibile abilitare a
fenv_accessmeno che non sia abilitata una semantica precisa, indipendentemente da un'opzionefloat_controlpragma del compilatore o da un'opzione del compilatore.Non è possibile usare
float_controlper disattivareprecisequandofenv_accessè abilitato.
Queste restrizioni indicano che l'ordine di alcune direttive a pragma virgola mobile è significativo. Per passare da un modello rapido a un modello rigoroso usando pragma direttive, usare il codice seguente:
#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
Per passare da un modello strict a un modello rapido usando , float_controlpragmausare il codice seguente:
#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
Se non vengono specificate opzioni, float_control non ha alcun effetto.
La float_control direttiva disabilita le contrazioni quando attiva precise o except. Utilizzo di float_control per disattivare precise o except ripristinare l'impostazione precedente per le contrazioni. È possibile usare la fp_contractpragma direttiva per modificare il comportamento del compilatore sulle contrazioni.
float_control(push) e float_control(pop) push e pop l'impostazione per le contrazioni come parte dell'impostazione float_control sullo stack del compilatore interno. Questo comportamento è una novità di Visual Studio 2022. La float_control direttiva nelle versioni precedenti del compilatore non influisce sulle impostazioni di contrazione.
Esempio
L'esempio seguente illustra come intercettare un'eccezione a virgola mobile overflow usando 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
Vedi anche
direttive Pragma e parole chiave __pragma e _Pragma
fenv_access pragma
fp_contract pragma