Condividi tramite


_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.

Vedere anche

Riferimenti

Supporto per le operazioni in virgola mobile

_clear87, _clearfp

_status87, _statusfp, _statusfp2