float_control
Určuje chování čísla s plovoucí desetinnou čárkou pro funkci.
float_control( value,setting [push] | push | pop )
Příznaky
value , setting [push]
Určuje chování plovoucí desetinné čárky.value může být precise nebo except.Další informace naleznete v tématu /fp (zadání chování hodnot s plovoucí desetinnou čárkou).setting může být buď on nebo off.Pokud je value nastaveno na precise, jsou určena nastavení pro precise a except .except lze nastavit pouze na on , když je precise nastaveno na on.
Pokud je přidán nepovinný token push , je aktuální nastavení pro value vloženo do vnitřního zásobníku kompilátoru.
push
Vloží aktuální nastavení float_control do vnitřního zásobníku kompilátoru.pop
Odebere nastavenífloat_control z horní části vnitřního zásobníku kompilátoru a vytvoří jej novým nastavením float_control.
Poznámky
Nastavení float_control precise nelze zapnout, když je nastavení except zapnuto.Podobně, nastavení precise nelze vypnout, když je nastavení fenv_access zapnuto.Chcete-li přejít z přísného modelu na rychlý model s direktivou pragma float_control, použijte následující kód:
#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)
Chcete-li přejít z rychlého modelu na přísný model s direktivou pragma float_control, použijte následující kód:
#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)
Mezi další direktivy pragma pro čísla s plovoucí desetinnou čárkou patří:
Příklad
Následující příklad ukazuje, jak zachytit výjimku přetečení hodnoty s plovoucí desetinnou čárkou pomocí direktivy 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);
}
}