Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Lekéri és beállítja a lebegőpontos vezérlő szót. Ennek a verziónak _control87_controlfp__control87_2 a biztonsági fejlesztései a CRT biztonsági funkcióiban leírtak szerint érhetők el.
Szemantika
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
Paraméterek
currentControl
Az aktuális vezérlőszavas bitérték.
newControl
Új vezérlőszavas bitértékek.
mask
Új vezérlőszavas bitek maszkolása.
Visszaadott érték
Sikeres esetben nulla, vagy errno értékhibakód.
Megjegyzések
A _controlfp_s függvény a platformfüggetlen és biztonságosabb verziója _control87, amely a lebegőpontos vezérlő szót a tárolt currentControl címbe helyezi, és a használatával newControlbeállítja. Az értékek bitjei a lebegőpontos vezérlő állapotát jelzik. A lebegőpontos vezérlési állapot lehetővé teszi, hogy a program a platformtól függően módosítsa a lebegőpontos matematikai csomag pontossági, kerekítési és végtelenségi módjait. A lebegőpontos kivételek maszkolására vagy maszkolására is használható _controlfp_s .
Ha az érték mask értéke 0, lekéri a lebegőpontos vezérlőszót, _controlfp_s és a beolvasott értéket a következőben currentControltárolja: .
Ha mask nem, akkor a vezérlőszó új értéke van beállítva: Minden olyan bitnél, amely be van állítva (azaz egyenlő 1) maska megfelelő bittel, a rendszer a vezérlőszó frissítésére használja a megfelelő bitet new . Más szóval, fpcntrl = ((fpcntrl & ~mask) | (newControl & mask)) hol fpcntrl van a lebegőpontos vezérlőszó. Ebben a forgatókönyvben currentControl a módosítás befejeződése után az értékre van állítva; nem a régi vezérlőszavas bitérték.
Megjegyzés:
Alapértelmezés szerint a futásidejű kódtárak elfedik az összes lebegőpontos kivételt.
_controlfp_s majdnem megegyezik az _control87 Intel (x86), x64 és ARM platformokon elérhető funkcióval. Ha x86, x64 vagy ARM platformot céloz meg, használhatja _control87 vagy _controlfp_s.
A különbség _control87_controlfp_s a denormális értékek között és abban van, hogy hogyan kezelik a denormális értékeket. Az Intel (x86), x64 és ARM platformok esetében _control87 beállíthatja és törölheti a DENORMAL OPERAND kivételmaszkot.
_controlfp_s nem módosítja a DENORMAL OPERAND kivételmaszkot. Ez a példa a különbséget mutatja be:
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call.
unsigned int current_word = 0;
_controlfp_s( ¤t_word, _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged.
A maszkállandó () és az új vezérlőértékek (masknewControl) lehetséges értékei a következő Hexadecimális értékek táblában láthatók. Használja az alább felsorolt hordozható állandókat (_MCW_EM_EM_INVALIDés így tovább) argumentumként ezeknek a függvényeknek a helyett, hogy explicit módon adja meg a hexadecimális értékeket.
Az Intel (x86)-alapú platformok támogatják a DENORMAL hardver bemeneti és kimeneti értékeit. Az x86-os viselkedés az értékek megőrzése DENORMAL . Az ARM-platform és az SSE2-támogatással rendelkező x64-platformok lehetővé teszik DENORMAL az operandusok és az eredmények kipirulásához vagy nullára kényszerítéséhez. A _controlfp_s, _controlfpés _control87 függvények maszkot biztosítanak a viselkedés módosításához. Az alábbi példa a maszk használatát mutatja be:
unsigned int current_word = 0;
_controlfp_s(¤t_word, _DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(¤t_word, _DN_FLUSH, _MCW_DN);
// Denormal values flushed to zero by hardware on ARM platforms
// and x64 processors with SSE2 support. Ignored on other x86 platforms.
Ezt a függvényt a rendszer figyelmen kívül hagyja a fordításhoz (/clrCommon Language Runtime-fordítás), mert a közös nyelvi futtatókörnyezet (CLR) csak az alapértelmezett lebegőpontos pontosságot támogatja.
X64 esetén csak az MXCSR-nyilvántartásban tárolt SSE2 vezérlőszavak érintettek. A végtelen mód vagy a lebegőpontos pontosság módosítása nem támogatott. Ha a pontosság-vezérlési maszkot az x64 platformon használják, a függvény érvényesítést ad, és az érvénytelen paraméterkezelő meghívása a paraméterérvényesítésben leírtak szerint történik.
X86 _controlfp_s esetén az x87 és az SSE2 vezérlőszavait is befolyásolja, ha vannak ilyenek. Előfordulhat, hogy a két vezérlőszavak nem összhangban vannak egymással (például egy korábbi hívás __control87_2miatt); ha a két vezérlőszava között ellentmondás van, _controlfp_s akkor a jelölőt a EM_AMBIGUOUS következő értékre állítja currentControl: . Figyelmeztetés, hogy a visszaadott vezérlőszavak nem feltétlenül jelölik pontosan a lebegőpontos vezérlőszavak állapotát.
Ha a maszk nincs megfelelően beállítva, ez a függvény érvénytelen paraméterkivételt hoz létre a paraméterérvényesítésben leírtak szerint. Ha a végrehajtás folytatva van, ez a függvény ad vissza, és a függvényt a értékre EINVALállítja.errnoEINVAL
Alapértelmezés szerint ennek a függvénynek a globális állapota hatóköre az alkalmazásra terjed ki. A viselkedés módosításához tekintse meg a globális állapotot a CRT-ben.
Arm-platformok
- A végtelen mód vagy a lebegőpontos pontosság módosítása nem támogatott. Ha a pontosságvezérlő maszkot az x64-platformon használják, a függvény helyességi műveletet indít el, és a paraméterérvényesítésben leírtak szerint érvénytelen paraméterkezelőt hív meg.
- Az ARM32 (megszűnt) esetén a Windows nem támogatja a FP-kivételek használatát.
- Az ARM64-en az egész
_MCW_EMvagy bármely bit maszkolása (_EM_INEXACT, ,_EM_UNDERFLOW,_EM_OVERFLOW_EM_ZERODIVIDEés_EM_INVALID) megfelelően módosítsa az FPCR-regisztert. A standard matematikai függvények (például érvénytelen műveletstd::acos) által kiváltott lebegőpontos kivételek mentesülnek a viselkedés alól, és az FPCR-regisztrációtól függően figyelmen kívül hagyhatók vagy megfelelően emelhetők. További információkért lásd az ARM32 ABI-konvenciók áttekintését. - A ARM64EC a Windows elkapja a processzor lebegőpontos kivételeit, és letiltja őket az FPCR-regisztrációban. Ez biztosítja a különböző processzorvariánsok konzisztens viselkedését.
Maszkállandók és értékek
A maszk esetében a _MCW_EM törlés a kivételt állítja be, amely lehetővé teszi a hardveres kivételt; a beállítás elrejti a kivételt. Ha bekövetkezik _EM_UNDERFLOW vagy _EM_OVERFLOW előfordul, a rendszer nem ad ki hardverkivételt a következő lebegőpontos utasítás végrehajtásáig. Ha közvetlenül utána vagy _EM_UNDERFLOWután _EM_OVERFLOW szeretne hardverkivételt létrehozni, hívja meg az utasítástFWAIT MASM.
| Maszk | Hexa érték | Állandó | Hexa érték |
|---|---|---|---|
_MCW_DN (Denormális vezérlő) |
0x03000000 | _DN_SAVE_DN_FLUSH |
0x00000000 0x01000000 |
_MCW_EM (Kivételmaszk megszakítása) |
0x0008001F | _EM_INVALID_EM_DENORMAL_EM_ZERODIVIDE_EM_OVERFLOW_EM_UNDERFLOW_EM_INEXACT |
0x00000010 0x00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC (Végtelen vezérlőelem)(ARM- vagy x64-platformokon nem támogatott.) |
0x00040000 | _IC_AFFINE_IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RC (Kerekítés vezérlő) |
0x00000300 | _RC_CHOP_RC_UP_RC_DOWN_RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC (Pontosság-vezérlés)(ARM- vagy x64-platformokon nem támogatott.) |
0x00030000 |
_PC_24 (24 bit)_PC_53 (53 bit)_PC_64 (64 bit) |
0x00020000 0x00010000 0x00000000 |
Követelmények
| Rutin | Kötelező fejléc |
|---|---|
_controlfp_s |
<float.h> |
További kompatibilitási információkért lásd: Kompatibilitás.
példa
// crt_contrlfp_s.c
// processor: x86
// This program uses _controlfp_s to output the FP control
// word, set the precision to 24 bits, and reset the status to
// the default.
#include <stdio.h>
#include <float.h>
#pragma fenv_access (on)
int main( void )
{
double a = 0.1;
unsigned int control_word;
int err;
// Show original FP control word and do calculation.
err = _controlfp_s(&control_word, 0, 0);
if ( err ) /* handle error here */;
printf( "Original: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Set precision to 24 bits and recalculate.
err = _controlfp_s(&control_word, _PC_24, MCW_PC);
if ( err ) /* handle error here */;
printf( "24-bit: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Restore default precision-control bits and recalculate.
err = _controlfp_s(&control_word, _CW_DEFAULT, MCW_PC);
if ( err ) /* handle error here */;
printf( "Default: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Original: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
24-bit: 0xa001f
0.1 * 0.1 = 9.999999776482582e-003
Default: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
Lásd még
Matematikai és lebegőpontos támogatás
_clear87, _clearfp
_status87, , _statusfp_statusfp2
_control87, , _controlfp__control87_2