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