_controlfp_s

obtiene y establece la palabra de control flotante.Ésta es una versión de _control87, _controlfp, __control87_2 con mejoras de seguridad como se describe en Características de seguridad en CRT.

errno_t _controlfp_s(
    unsigned int *currentControl,
    unsigned int newControl,
    unsigned int mask
);

Parámetros

  • currentControl
    el valor de bit actual de la CONTROL-palabra.

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

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

Valor devuelto

cero si correctamente o un código de error de valor de errno .

Comentarios

_controlfp_s es una plataforma-independiente y una versión más segura de _control87, que obtiene y establece la palabra de control flotante en la dirección de currentControl y de newControl, respectivamente.Los bits en los valores indican el estado de control flotante.El estado 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 se puede máscara o desenmascarar excepciones de punto flotante mediante _controlfp_s.

Si el valor de mask es igual a 0, _controlfp_s obtiene la palabra de control flotante y almacena el valor recuperado en currentControl.

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.En este escenario, currentControl se establece en el valor después de que el cambio complete; no es el valor anterior de bit de la CONTROL-palabra.

[!NOTA]

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

_controlfp_s es casi idéntico a la función de _control87 en plataformas Intel (x86) y lo admite MIPS y plataformas Alpha.Para asegurarse de que el código flotante sea portable a MIPS o a la ALFA, utilice _controlfp_s.Si usa como destino plataformas x86, utilice _control87o _controlfp_s.

La diferencia entre _control87y _controlfp_ses la manera estos valores de DENORMAL de una llamada 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 _controlfp_sno 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 (newControl) 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_s 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. Ignored on x86

_controlfp_s afecta a las palabras de control para el x87 y el SSE2, si existe.Es posible que las dos palabras de control estén incoherente con sí (debido a una llamada anterior a __control87_2, por ejemplo); si hay una inconsistencia entre las dos palabras de control, _controlfp_s establece la marca de EM_AMBIGUOUS en currentControl.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 flotante no se admite.Si la máscara de control de precisión se utiliza en esa plataforma, se invoca el controlador no válido de parámetro, tal y como se describe en Validación de parámetros.

Si la máscara no se establece correctamente, esta función genera una excepción no válida del parámetro, como se describe en Validación de parámetros.Si la ejecución puede continuar, esta función devuelve EINVAL y establece errno a EINVAL.

Se deja de utilizar esta función 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

_controlfp_s

<float.h>

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

Ejemplo

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

No es aplicablePara 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