_controlfp_s
Ottiene e imposta la parola di controllo a virgola mobile.Si tratta di una versione di _control87, _controlfp, __control87_2 con i miglioramenti della sicurezza come descritto in Funzionalità di sicurezza in CRT.
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
Parametri
currentControl
il valore di bit corrente di controllo-Word.newControl
nuovi valori di bit di controllo-Word.mask
Mascherare dei nuovi bit di controllo-Word impostare.
Valore restituito
Zero in caso di esito positivo oppure errno codice di errore valore.
Note
_controlfp_s è un piattaforma-indipendente e versione più sicura di _control87, che entra o imposta la parola di controllo a virgola mobile l'indirizzo currentControl e newControl, rispettivamente.I bit nei valori indicano lo stato del controllo a virgola mobile.Lo stato del controllo a virgola mobile consente al programma di modificare la precisione, l'arrotondamento e le modalità di infinito nel pacchetto matematici a virgola mobile.Uno inoltre possibile mascherare o smascherare le eccezioni a virgola mobile tramite _controlfp_s.
se il valore per mask è uguale a 0, _controlfp_s ottiene la parola di controllo a virgola mobile e archivia il valore recuperato in currentControl.
se mask è diverso da zero, un nuovo valore per la parola di controllo è impostato su: Per qualsiasi bit che è attivato (uguale a 1) in mask, il bit corrispondente in new viene utilizzato per aggiornare la parola di controllo.Ovvero fpcntrl = ((fpcntrl & ~mask) | (new & mask)) dove fpcntrl è la parola di controllo a virgola mobile.in questo scenario, currentControl è impostato sul valore dopo la modifica completa, non è il valore di bit precedente di controllo-Word.
[!NOTA]
Le librerie di runtime apposito tutte le eccezioni a virgola mobile per impostazione predefinita.
_controlfp_s è pressoché identica a _control87 in piattaforme Intel (x86) ed è supportato in piattaforme alfa e di MIPS.Per assicurarsi che il codice a virgola mobile è portabile a MIPS o alle componenti alfa, utilizzare _controlfp_s.Se si intende utilizzare le piattaforme x86, utilizzare _control87o _controlfp_s.
La differenza tra _control87e _controlfp_sè la modalità gestiscono di queste due funzioni DENORMAL valori.Per le piattaforme Intel (x86), _control87possibile impostare e deselezionare la maschera di eccezione di OPERANDO di DENORMAL.le piattaforme ALFABETICHE non supportano questa eccezione e _controlfp_snon modifica la maschera di eccezione di OPERANDO di DENORMAL.Il seguente esempio viene illustrata la differenza:
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call.
_controlfp( _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged.
I valori possibili per la costante della maschera (mask) e nuovi valori del controllo (newControlnella tabella seguente sono riportati di valori esadecimali.Utilizzare le costanti portabili elencate (_MCW_EM, _EM_INVALID, e così via) come argomenti a tali funzioni, anziché immettere i valori esadecimali in modo esplicito.
Le piattaforme ALFABETICHE supportano l'input e i valori di output di DENORMAL nel software.Il comportamento predefinito di Windows NT su queste piattaforme è di svuotamento di input e di output di DENORMAL a zero._controlfp_s fornisce una nuova maschera per mantenere e lo svuotamento input e di output di DENORMAL.
Le piattaforme Intel (x86) supportano l'input e i valori di output di DENORMAL in hardware.Il comportamento è mantenere i valori di DENORMAL._control87 non fornisce una maschera per modificare questo comportamento.Nell'esempio seguente viene illustrata questa differenza:
controlfp( _DN_SAVE, _MCW_DN);
// Denormal values preserved by software on ALPHA. NOP on x86
controlfp( _DN_FLUSH, _MCW_DN);
// Denormal values flushed to zero by hardware on ALPHA. Ignored on x86
_controlfp_s influisce sulle parole di controllo sia per il x87 che lo SSE2, se presente.È possibile che le due parole di controllo e siano incoerente tra loro (a causa di una chiamata precedente a __control87_2, ad esempio); se c " è un'incoerenza tra le due parole di controllo, _controlfp_s imposta EM_AMBIGUOUS flag in currentControl.Si tratta di un avviso della parola di controllo restituita non potrebbe rappresentare lo stato di entrambe le parole di controllo a virgola mobile in precisione.
In x64 l'architettura, cambiando la precisione dei valori a virgola mobile non è supportata.Se la maschera del controllo di precisione viene utilizzata in quella piattaforma, il gestore non valido di parametro viene richiamato, come descritto in Convalida dei parametri.
Se la maschera non è impostato correttamente, la funzione genera un'eccezione non valida di parametro, come descritto in Convalida dei parametri.Se l'esecuzione è consentita per continuare, la funzione restituisce EINVAL e set errno in EINVAL.
Questa funzione è deprecata durante la compilazione con /clr (Compilazione Common Language Runtime) o /clr:pure poiché Common Language Runtime supporta solo la precisione dei valori a virgola mobile predefinita.
valori esadecimali
per _MCW_EM la maschera, deselezionando la maschera imposta eccezione, che consente l'eccezione hardware, impostare la maschera nasconde l'eccezione.si noti che se a _EM_UNDERFLOW o _EM_OVERFLOW si verifica, alcuna eccezione hardware viene generata finché non esegua l'istruzione a virgola mobile seguente.Per generare un'eccezione hardware immediatamente successiva a _EM_UNDERFLOW o _EM_OVERFLOW, chiamare l'istruzione di FWAIT MASM.
Maschera |
Valore esadecimale |
Costante |
Valore esadecimale |
---|---|---|---|
_MCW_DN (Controllo di non normale) |
0x03000000 |
_DN_SAVE _DN_FLUSH |
0x00000000 0x01000000 |
_MCW_EM (Maschera di eccezione di interruzione) |
0x0008001F |
_EM_INVALID _EM_DENORMAL _EM_ZERODIVIDE _EM_OVERFLOW _EM_UNDERFLOW _EM_INEXACT |
0x00000010 0x00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC (Controllo dell'infinito) |
0x00040000 |
_IC_AFFINE _IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RC (Mediante arrotondamento controllo) |
0x00000300 |
_RC_CHOP _RC_UP _RC_DOWN _RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC (Controllo di precisione) |
0x00030000 |
_PC_24 (24 bit) _PC_53 (53 bit) _PC_64 (64 bit) |
0x00020000 0x00010000 0x00000000 |
Requisiti
routine |
Intestazione di associazione |
---|---|
_controlfp_s |
<float.h> |
Per ulteriori informazioni sulla compatibilità, vedere compatibilità nell'introduzione.
Esempio
// 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 );
}
Output
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
Equivalente di .NET Framework
Non applicabile.Per chiamare la funzione c standard, utilizzare PInvoke.Per ulteriori informazioni, vedere Esempi di pinvoke.