float_control
Specifica il comportamento a virgola mobile per una funzione.
float_control( value,setting [push] | push | pop )
Flag
value , setting [push]
Specifica il comportamento a virgola mobile. value può essere precise o except. Per ulteriori informazioni, vedere /fp (Specifica il comportamento della virgola mobile). setting può essere on o off.Se value è precise, le impostazioni per precise e except vengono specificate. except può essere impostata solo su on quando precise è anche impostato su on.
Se il token push facoltativo viene aggiunto, l'impostazione corrente per value viene inserita nello stack del compilatore interno.
push
Inserire l'impostazione float_control corrente nello stack del compilatore internopop
Rimuove l'impostazionefloat_control dalla parte superiore dello stack del compilatore intero e la rende la nuova impostazione float_control.
Note
Non è possibile disattivare float_control precise da quando except è attivo. Analogamente, precise non può essere disattivato quando fenv_access è attivo. Per passare dal modello di tipo strict a un modello di tipo fast con il pragma float_control, utilizzare il codice seguente:
#pragma float_control(except, off)
#pragma fenv_access(off)
#pragma float_control(precise, off)
// The following line is needed on Itanium processors
#pragma fp_contract(on)
Per passare dal modello di tipo fast a un modello di tipo strict con il pragma float_control, utilizzare il codice seguente:
#pragma float_control(precise, on)
#pragma fenv_access(on)
#pragma float_control(except, on)
// The following line is needed on Itanium processors.
#pragma fp_contract(off)
Altri pragma a virgola mobile sono i seguenti:
Esempio
Il seguente esempio mostra come acquisire un'eccezione a virgola mobile dell'overflow utilizzando il 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);
}
}