_control87, _controlfp, __control87_2

obtiene y establece la palabra de control flotante.Una versión más segura de _controlfp está disponible; vea _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
);

Parámetros

  • new
    nuevos valores de bit de la CONTROL-palabra.

  • mask
    Máscara para nuevos bits de la CONTROL-palabra el conjunto.

  • x86_cw
    Completo con la palabra de control de la unidad de punto flotante x87.Paso en 0 (NULL) para establecer únicamente la palabra de control SSE2.

  • sse2_cw
    Palabra de Control de la unidad flotante de SSE.Paso en 0 (NULL) para establecer únicamente la palabra de control x87.

Valor devuelto

Para _control87 y _controlfp, los bits del valor devuelto indican el estado de control flotante.Para ver una definición completa de los bits devueltos por _control87, vea FLOAT.H.

Para __control87_2, el valor devuelto es 1, que indica éxito.

Comentarios

la función de _control87obtiene y establece la palabra de control flotante.La palabra de control flotante permite que el programa cambie la precisión, el redondeo, y los modos de infinito en el paquete de software matemáticos flotante.También puede máscara o desenmascarar excepciones de punto flotante mediante _control87.Si el valor de mask es igual a 0, _control87obtiene la palabra de control flotante.Si mask es distinto de cero, un nuevo valor para la palabra de control se establece: Para cualquier bit que está activado (utilizan el igual a 1) en mask, el bit correspondiente en new para actualizar la palabra de control.es decir fpcntrl = ((fpcntrl & ~mask) | (new & mask)) donde es la palabra fpcntrl de control flotante.

[!NOTA]

La máscara de las bibliotecas en tiempo de ejecución todas las excepciones de punto flotante de forma predeterminada.

_controlfpes una plataforma-independiente, versión portable de _control87.Es casi idéntica a la función de _control87en plataformas Intel (x86) y es compatible con MIPS y plataformas Alpha.Para asegurarse de que el código flotante sea portable a MIPS o a la ALFA, utilice _controlfp.Si usa como destino plataformas x86, utilice _control87o _controlfp.

La diferencia entre _control87y _controlfpes la manera estos valores de una llamada DENORMAL de dos funciones.Para plataformas Intel (x86), _control87establecer y borrar la máscara de la excepción de OPERANDO de DENORMAL.Las plataformas Alpha no admiten esta excepción, y _controlfpno modifica la máscara de la excepción de OPERANDO de DENORMAL.El ejemplo siguiente muestra la diferencia:

_control87( _EM_INVALID, _MCW_EM ); 
// DENORMAL is unmasked by this call
_controlfp( _EM_INVALID, _MCW_EM ); 
// DENORMAL exception mask remains unchanged

Los valores posibles por la constante de máscara (mask) y nuevos valores de control (new) se muestran en la tabla siguiente de valores hexadecimales.Utilice constantes portables enumeradas abajo (_MCW_EM, _EM_INVALID, etc.) como argumentos a estas funciones, en lugar de proporcionar los valores hexadecimales explícitamente.

Las plataformas Alpha admiten los valores de entrada y salida de DENORMAL en software.El comportamiento predeterminado de windows NT en estas plataformas es vaciar los valores de entrada y salida de DENORMAL a cero._controlfp proporciona una nueva máscara para mantener y para vaciar los valores de entrada y salida DENORMAL.

Plataformas Intel (x86) admiten los valores de entrada y salida de DENORMAL en hardware.El comportamiento es conservar los valores de DENORMAL._control87 no proporciona una máscara para cambiar este comportamiento.El ejemplo siguiente se muestra esta diferencia:

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

_control87 y _controlfp afectan a las palabras de control para el x87 y el SSE2, si existe.La función __control87_2 permite unidades de punto flotante x87 y SSE2 que se controlarán conjuntamente o por separado.Si desea afectar a ambas unidades, pase las direcciones de dos enteros a x86_cw y a sse2_cw.Si solo desea afectar a una unidad, pase una dirección para ese parámetro pero paso en 0 (NULL) para la otra.Si 0 se pasa para uno de estos parámetros, la función no tiene ningún efecto en esa unidad de punto flotante.Esta funcionalidad podría ser útil en situaciones donde la parte del código utiliza la unidad de punto flotante x87 y otra parte del código utiliza la unidad de punto flotante SSE2.Si utiliza __control87_2 en una parte de un programa y establezca valores diferentes para las palabras de control de punto flotante, y utilice _control87 o _controlfp manipular aún más la palabra de control, se _control87 y _controlfp no puedan devolver una sola palabra de control para representar el estado de ambas unidades de punto flotante.En este caso, estas funciones establecen el indicador de EM_AMBIGUOUS en el valor entero devuelto para indicar que hay una inconsistencia entre las dos palabras de control.Esta advertencia que word de control devuelta no represente el estado de ambas palabras de control de punto flotante exactamente.

En la arquitectura de x64 , cambiar la precisión de punto flotante no se admite.Si la máscara de control de precisión se utiliza en esa plataforma, invoque una aserción y el controlador no válido de parámetro, tal y como se describe en Validación de parámetros.

[!NOTA]

__control87_2 no se admite en la arquitectura de x64 .Si utiliza __control87_2 y compila el programa para la arquitectura de x64 , el compilador genera un error.

Se han dejado de utilizar estas funciones al compilar con /clr (Compilación de Common Language Runtime) o /clr:pure porque Common Language Runtime admite únicamente la precisión flotante predeterminada.

valores hexadecimales

Para la máscara de _MCW_EM , borrar la máscara establece la excepción, que permite la excepción de hardware; establecer la máscara oculta la excepción.Tenga en cuenta que si _EM_UNDERFLOW o _EM_OVERFLOW aparece, no se produce ninguna excepción de hardware hasta que se ejecute la instrucción de coma flotante siguiente.Para generar una excepción de hardware inmediatamente después de _EM_UNDERFLOW o de _EM_OVERFLOW, llame a la instrucción de FWAIT MASM.

Máscara

valor hexadecimal

Constante

valor hexadecimal

_MCW_DN (control de Denormal)

0x03000000

_DN_SAVE

_DN_FLUSH

0x00000000

0x01000000

_MCW_EM (máscara de excepción de la interrupción)

0x0008001F

_EM_INVALID

_EM_DENORMAL

_EM_ZERODIVIDE

_EM_OVERFLOW

_EM_UNDERFLOW

_EM_INEXACT

0x00000010

0x00080000

0x00000008

0x00000004

0x00000002

0x00000001

_MCW_IC (control de Infinity)

0x00040000

_IC_AFFINE

_IC_PROJECTIVE

0x00040000

0x00000000

_MCW_RC (que redondea el control)

0x00000300

_RC_CHOP

_RC_UP

_RC_DOWN

_RC_NEAR

0x00000300

0x00000200

0x00000100

0x00000000

_MCW_PC (control de Precisión)

0x00030000

_PC_24 (24 bits)

_PC_53 (53 bits)

_PC_64 (64 bits)

0x00020000

0x00010000

0x00000000

Requisitos

rutina

Encabezado necesario

_control87, _controlfp, _control87_2

<float.h>

Para obtener más información de compatibilidad, vea compatibilidad en la Introducción.

Ejemplo

// 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 en .NET Framework

No es aplicable Para llamar a la función estándar de C, utilice PInvoke. Para obtener más información, vea La invocación de plataforma ejemplos.

Vea también

Referencia

Compatibilidad de punto flotante

_clear87, _clearfp

_status87, _statusfp, _statusfp2