/fp (Especificar comportamiento de punto flotante)
Actualización: noviembre 2007
Especifica el comportamiento de punto flotante en un archivo de código fuente.
/fp:[precise | except[-] | fast | strict ]
Indicadores
precise
Es la opción predeterminada.Mejora la consistencia de las pruebas de punto flotante de igualdad y desigualdad, deshabilitando las optimizaciones que pudieran cambiar la precisión de los cálculos en punto flotante. Esto es necesario por conformidad estricta con ANSI. De forma predeterminada, el compilador almacena en los registros de 80 bits del coprocesador los resultados intermedios de los cálculos de punto flotante. Esto aumenta la velocidad del programa y reduce su tamaño. No obstante, dado que en el cálculo están involucrados tipos de datos de punto flotante que se representan en la memoria con menos de 80 bits, la utilización de los bits adicionales de precisión (80 bits menos el número de bits de un tipo de punto flotante más pequeño) a través de un cálculo laborioso puede generar resultados incoherentes.
Con /fp:precise en procesadores x86, el compilador efectuará redondeo en variables de tipo flotante hasta la precisión adecuada para asignaciones y conversiones de tipos y cuando se pasen parámetros a una función. Este redondeo garantiza que los datos no tienen una importancia mayor que la capacidad de su tipo. Un programa compilado con /fp:precise puede ser más lento y mayor que otro compilado sin /fp:precise. /fp:precise deshabilita valores intrínsecos; en su lugar, se utilizan las rutinas de biblioteca en tiempo de ejecución estándar. Para obtener más información, vea /Oi (Generar funciones intrínsecas).
El siguiente comportamiento de punto flotante se habilita con /fp:precise:
Contracciones, o sustitución de múltiples operaciones por una operación compuesta con un único redondeo al final, se habilita con /fp:precise.
Las optimizaciones de expresiones que no son válidas para valores especiales (NaN, +infinito, -infinito, +0, -0) no se permiten. Ninguna de las optimizaciones x-x => 0, x*0 => 0, x-0 => x, x+0 => x y 0-x => -x es válida por diversas razones (vea IEEE 754 y el estándar C99).
El compilador controlará correctamente comparaciones que impliquen a NaN. Por ejemplo, x != x se evalúa como true si x es NaN y las comparaciones ordenadas que implican a NaN producen una excepción.
La evaluación de expresiones seguirá el método FLT_EVAL_METHOD=2 de C99, con una excepción. Al programar para procesadores x86, dado que FPU se establece en precisión de 53 bits, esto se considerará precisión doble.
La multiplicación por 1.0 exactamente se transforma en un uso del otro factor. x*y*1.0 se transforma en x*y. Del mismo modo, x*1.0*y se transforma en x*y.
La división por 1.0 exactamente se transforma en un uso del dividendo. x*y/1.0 se transforma en x*y. Del mismo modo, x/1.0*y se transforma en x*y.
El uso de /fp:precise con fenv_access ON deshabilita algunas optimizaciones, como evaluaciones del tiempo de compilación de expresiones de punto flotante. Por ejemplo, si cambia el modo de redondeo con _control87, _controlfp, __control87_2 y el compilador efectúa un cálculo de punto flotante, el modo de redondeo especificado no entrará en vigor hasta que fenv_access se establezca en ON.
/fp:precise reemplaza la opción del compilador /Op.
fast
Crea el código más rápido en la mayoría de los casos. /fp:fast no se puede utilizar con /fp:strict ni /fp:precise; se utilizará la última opción especificada en la línea de comandos. /fp:fast y /fp:except generarán un error del compilador.Si se selecciona /Za, /Ze (Deshabilitar extensiones de lenguaje) (compatibilidad con ANSI) y /fp:fast, se puede producir un comportamiento inesperado. Por ejemplo, las operaciones de punto flotante de precisión simple no se pueden redondear a precisión simple.
except[-]
Modelo de excepción en punto flotante confiable. Se producirán excepciones inmediatamente una vez desencadenado. De forma predeterminada, esta opción está desactivada. Al anexar explícitamente un signo menos a la opción, se deshabilita.strict
El modelo de punto flotante más estricto. /fp:strict provoca que fp_contract sea OFF y fenv_access ON. /fp:except se implica y se puede deshabilitar especificando explícitamente /fp:except-. Cuando se utiliza con /fp:except-, /fp:strict fuerza la semántica strict en punto flotante pero sin considerar eventos excepcionales.
Comentarios
En una misma compilación, se pueden especificar varias opciones de /fp.
Para controlar el comportamiento de punto flotante por función, vea el pragma float_control.
Casi todas las optimizaciones en punto flotante relacionadas con /fp:strict, /fp:except (y sus correspondientes pragmas) y el pragma fp_contract dependen del equipo. /fp:strict y /fp:except no son compatibles con /clr.
/fp:precise debería tratar la mayoría de los requisitos de punto flotante de una aplicación. Si es necesario, se pueden utilizar /fp:except y /fp:strict, pero el rendimiento se podría ver afectado. Si el rendimiento es muy importante, puede ser conveniente utilizar /fp:fast.
/fp:strict, /fp:fast y /fp:precise son modos de precisión (exactitud). Sólo puede haber uno en vigor en un momento dado. Si se especifican /fp:strict y /fp:precise, el compilador utiliza el que procesa en último lugar. No puede especificar /fp:strict y /fp:fast simultáneamente.
Para obtener más información, vea https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/floapoint.asp.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para obtener información detallada, vea Cómo: Abrir páginas de propiedades del proyecto.
Expanda el nodo Propiedades de configuración.
Amplíe el nodo C/C++.
Seleccione la página de propiedades Generación de código.
Modifique la propiedad Modelo de punto flotante.
Para establecer esta opción del compilador mediante programación
- Vea floatingPointModel.