Condividi tramite


_control87, _controlfp, __control87_2

Ottiene e imposta la parola di controllo a virgola mobile.È disponibile una versione più sicura di _controlfp; vedere _controlfp_s.

unsigned int _control87( 
   unsigned int new,
   unsigned int mask 
);
unsigned int _controlfp( 
   unsigned int new,
   unsigned int mask 
);
int __control87_2(
   unsigned int new,
   unsigned int mask,
   unsigned int* x86_cw,
   unsigned int* sse2_cw
);

Parametri

  • new
    Nuovi valori di bit di parola di controllo.

  • mask
    Maschera da impostare per i nuovi bit di parola di controllo.

  • x86_cw
    Compilato con la parola di controllo dell'unità a virgola mobile x87.Passare 0 (NULL) per impostare solo la parola di controllo SSE2.

  • sse2_cw
    Parola di controllo dell'unità a virgola mobile SSE.Passare 0 (NULL) per impostare solo la parola di controllo x87.

Valore restituito

Per _control87 e _controlfp, i bit nel valore restituito indicano lo stato del controllo a virgola mobile.Per una definizione completa dei bit restituiti da _control87, vedere FLOAT.H.

Per __control87_2, il valore restituito è 1, che indica un esito positivo.

Note

La funzione _control87 ottiene e imposta la parola di controllo a virgola mobile.La parola di controllo a virgola mobile consente al programma di modificare la precisione, l'arrotondamento, e le modalità di infinito nel pacchetto matematica a virgola mobile.È inoltre possibile mascherare o smascherare eccezioni di virgola mobile utilizzando _control87.Se il valore di mask è uguale a 0, _control87 otterrà la parola di controllo a virgola mobile.Se mask è diverso da zero, viene impostato un nuovo valore per la parola di controllo: Per ogni bit attivo (uguale a 1) in mask, il corrispondente bit 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.

[!NOTA]

Le librerie di runtime mascherano per impostazione predefinita tutte le eccezioni a virgola mobile.

_controlfp è una versione indipendente dalla piattaforma e portabile di _control87.È quasi identica alla funzione _control87 delle piattaforme Intel (x86) ed è supportata dalle piattaforme MIPS e ALPHA.Per assicurarsi che il codice a virgola mobile sia portabile in MIPS o ALPHA, utilizzare _controlfp.Se le destinazioni sono le piattaforme x86, utilizzare _control87 o _controlfp.

La differenza tra _control87 e _controlfp è il modo in cui queste due funzioni gestiscono i valori NON NORMALI.Per le piattaforme Intel (x86), _control87 può impostare e rimuovere la maschera dell'eccezione OPERANDO NON NORMALE.Le piattaforme ALPHA non supportano questa eccezione, e _controlfp non modifica la maschera dell'eccezione OPERANDO NON NORMALE.Nell'esempio seguente 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 i nuovi valori del controllo (new) sono riportati nella seguente tabella di valori esadecimali.Utilizzare le costanti portabili elencate di seguito (_MCW_EM, _EM_INVALID, e così via) come argomenti per queste funzioni, invece di fornire i valori esadecimali in modo esplicito.

Le piattaforme ALPHA supportano valori di input e output NON NORMALI nel software.Il comportamento predefinito di Windows NT su queste piattaforme è di cancellare a zero i valori NON NORMALI di input e output._controlfp fornisce una nuova maschera per mantenere e cancellare i valori NON NORMALI di input e output.

Le piattaforme Intel (x86) supportano i valori NON NORMALI di input e output a livello di hardware.Il comportamento prevede di mantenere i valori NON NORMALI._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 and x86
// processors with SSE2 support. Ignored on other x86 platforms.

Sia _control87 che _controlfp influiscono sulle parole di controllo sia di x87 che di SSE2, se presente.La funzione __control87_2 consente che sia le unità in virgola mobile x87 e che le unità in virgola mobile SSE2 siano controllate insieme o separatamente.Se si desidera modificare entrambe le unità, passare gli indirizzi di due numeri interi a x86_cw e a sse2_cw.Se si desidera modificare solo un'unità, passare un indirizzo per tale parametro ma passare 0 (NULL) per l'altro.Se viene passato 0 per uno di questi parametri, la funzione non ha alcun effetto su quell'unità a virgola mobile.Questa funzionalità può essere utile nelle situazioni in cui una parte del codice utilizza l'unità a virgola mobile x87 e un'altra parte del codice utilizza l'unità a virgola mobile SSE2.Se si utilizza __control87_2 in una parte del programma e si impostano valori diversi per le parole di controllo a virgola mobile, e quindi si utilizza _control87 o _controlfp per modificare ulteriormente la parola di controllo, allora _control87 e _controlfp potrebbero non essere in grado di restituire una singola parola di controllo per rappresentare lo stato di entrambe le unità a virgola mobile.In questo caso, queste funzioni impostano il flag EM_AMBIGUOUS del valore intero restituito per indicare che c'è un'incoerenza tra le due parole di controllo.Si tratta di un avviso relativo al fatto che la parola di controllo restituita potrebbe non rappresentare con precisione lo stato di entrambe le parole di controllo a virgola mobile.

Nell'architettura x64, la modifica alla precisione di virgola mobile non è supportata.Se la maschera del controllo di precisione viene utilizzata sulla piattaforma, un'asserzione e il gestore di parametro non valido vengono richiamati, come descritto in Convalida dei parametri.

[!NOTA]

__control87_2 non è supportato nell'architettura x64.Se si utilizza __control87_2 e si compila il programma per l'architettura x64, il compilatore genera un errore.

Queste funzioni sono deprecate durante la compilazione con /clr (Compilazione Common Language Runtime) o /clr:pure poiché il common language runtime supporta solamente la precisione a virgola mobile predefinita.

Valori esadecimali

Per la maschera _MCW_EM, la cancellazione della maschera imposta l'eccezione, che abilita l'eccezione hardware, l'impostazione della maschera nasconde l'eccezione.Si noti che se si verifica _EM_UNDERFLOW o _EM_OVERFLOW, non viene generata nessuna eccezione hardware fino all'esecuzione della prossima istruzione a virgola mobile.Per generare un'eccezione hardware subito dopo _EM_UNDERFLOW o _EM_OVERFLOW, chiamare l'istruzione FWAIT MASM.

Maschera

Valore esadecimale

Costante

Valore esadecimale

_MCW_DN (Controllo non normale)

0x03000000

_DN_SAVE

_DN_FLUSH

0x00000000

0x01000000

_MCW_EM (Maschera dell'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 (Controllo di arrotondamento)

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 obbligatoria

_control87, _controlfp, _control87_2

<float.h>

Per ulteriori informazioni sulla compatibilità, vedere Compatibilità nell'introduzione.

Esempio

// crt_cntrl87.c
// processor: x86
// This program uses __control87_2 to output the x87 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_x87;

    // Show original x87 control word and do calculation.
    control_word_x87 = __control87_2(0, 0,
                                     &control_word_x87, 0);
    printf( "Original: 0x%.4x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

    // Set precision to 24 bits and recalculate.
    control_word_x87 = __control87_2(_PC_24, MCW_PC,
                                     &control_word_x87, 0);
    printf( "24-bit:   0x%.4x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

    // Restore default precision-control bits and recalculate.
    control_word_x87 = __control87_2( _CW_DEFAULT, MCW_PC, 
                                     &control_word_x87, 0 );
    printf( "Default:  0x%.4x\n", control_word_x87 );
    printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}

Output

Original: 0x0001
0.1 * 0.1 = 1.000000000000000e-002
24-bit:   0x0001
0.1 * 0.1 = 9.999999776482582e-003
Default:  0x0001
0.1 * 0.1 = 1.000000000000000e-002

Equivalente .NET Framework

Non applicabile. Per chiamare la funzione standard C, utilizzare PInvoke. Per ulteriori informazioni, vedere Esempi di PInvoke.

Vedere anche

Riferimenti

Supporto per le operazioni in virgola mobile

_clear87, _clearfp

_status87, _statusfp, _statusfp2