fenv_access
pragma
Disabilita (on
) o abilita le ottimizzazioni (off
) che potrebbero modificare i test dei flag dell'ambiente a virgola mobile e le modifiche alla modalità.
Sintassi
#pragma fenv_access (
{on
|off
})
Osservazioni:
Per impostazione predefinita, fenv_access
è off
. Il compilatore presuppone che il codice non possa accedere o modificare l'ambiente a virgola mobile. Se l'accesso all'ambiente non è necessario, il compilatore può eseguire altre operazioni per ottimizzare il codice a virgola mobile.
Abilitare fenv_access
se il codice verifica flag di stato a virgola mobile, eccezioni o imposta flag della modalità di controllo. Il compilatore disabilita le ottimizzazioni a virgola mobile, in modo che il codice possa accedere in modo coerente all'ambiente a virgola mobile.
L'opzione /fp:strict
della riga di comando abilita fenv_access
automaticamente . Per altre informazioni su questo e altro comportamento a virgola mobile, vedere /fp (Specificare il comportamento a virgola mobile).For more information on this and other floating-point behavior, see /fp (Specify Floating-Point Behavior).
Esistono restrizioni per i modi in cui è possibile usare l'oggetto fenv_access
pragma in combinazione con altre impostazioni a virgola mobile:
Non è possibile abilitare a
fenv_access
meno che non sia abilitata una semantica precisa. La semantica precisa può essere abilitata dafloat_control
pragmao tramite le opzioni del/fp:precise
compilatore o/fp:strict
. L'impostazione predefinita del compilatore è/fp:precise
se non viene specificata un'altra opzione della riga di comando a virgola mobile.Non è possibile usare
float_control
per disabilitare la semantica precisa quandofenv_access(on)
è impostata.
La fenv_access(on)
direttiva disabilita la generazione di contrazioni a virgola mobile, istruzioni del computer che combinano operazioni a virgola mobile. fenv_access(off)
ripristina il comportamento precedente per le contrazioni. Questo comportamento è una novità di Visual Studio 2022. Le versioni precedenti del compilatore possono generare contrazioni per impostazione predefinita in fenv_access(on)
. Per altre informazioni sulle contrazioni a virgola mobile, vedere /fp:contract
.
I tipi di ottimizzazioni a cui sono soggetti fenv_access
sono:
Eliminazione di sottoespressioni comuni globali
Movimento di codice
Riduzione di costanti
Altre direttive a pragma virgola mobile includono:
Esempi
In questo esempio viene impostato fenv_access
su on
per impostare il registro di controllo a virgola mobile per la precisione a 24 bit:
// pragma_directive_fenv_access_x86.cpp
// compile with: /O2 /arch:IA32
// processor: x86
#include <stdio.h>
#include <float.h>
#include <errno.h>
#pragma fenv_access (on)
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=9.999999776482582e-03
Se si imposta #pragma fenv_access (on)
un commento dall'esempio precedente, l'output è diverso. Perché il compilatore esegue la valutazione in fase di compilazione, che non usa la modalità di controllo.
// pragma_directive_fenv_access_2.cpp
// compile with: /O2 /arch:IA32
#include <stdio.h>
#include <float.h>
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=1.000000000000000e-02