float_control
Określa zachowanie zmiennoprzecinkowe funkcji.
float_control( value,setting [push] | push | pop )
Flagi
value , setting [push]
Określa zachowanie zmiennoprzecinkowe.value może być precise lub except.Aby uzyskać więcej informacji, zobacz /fp (Określenie zachowania zmiennoprzecinkowego).setting może być zarówno on , jak i off.Jeśli value jest precise, to ustawienia dla precise i except są określane.except może być ustawione na on , tylko gdy precise jest również ustawione na on.
Jeśli zostanie dodany opcjonalny token push , bieżące ustawienie dla value zostanie wypchnięte na wewnętrzny stos kompilatora.
push
Wypycha bieżące ustawienie float_control na wewnętrzny stos kompilatorapop
Usuwa ustawienie float_control ze szczytu wewnętrznego stosu kompilatora i czyni je nowym ustawieniem float_control.
Uwagi
Nie można wyłączyć float_control precise, gdy włączone jest except.Podobnie, nie można wyłączyć precise, gdy włączone jest fenv_access.Aby przy użyciu dyrektywy float_control przejść z trybu z ograniczeniami na tryb szybki, użyj następującego kodu:
#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)
Aby przy użyciu dyrektywy float_control przejść z trybu szybkiego na tryb z ograniczeniami, użyj następującego kodu:
#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)
Do innych dyrektyw zmiennoprzecinkowych należą:
Przykład
Poniższy przykład pokazuje, w jaki sposób przechwycić wyjątek przepełnienia zmiennoprzecinkowego przy użyciu dyrektywy 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);
}
}