2010-04-02 19 views
7

HI,precisión de punto flotante en Visual C++

Estoy intentando utilizar el robust predicates para la geometría computacional de Jonathan Richard Shewchuk.

No soy un programador, por lo que no estoy seguro de lo que estoy diciendo, es posible que esté cometiendo un error básico.

El punto es que los predicados deben permitir una precisión aritmética con precisión de coma flotante. En mi computadora: Asus pro31/S (Core Due Centrino Processor) no funcionan. El problema puede permanecer en el hecho de que mi computadora puede usar algunas mejoras en la precisión del punto flotante que está en conflicto con el usado por Shewchuk. El autor dice:

/* On some machines, the exact arithmetic routines might be defeated by the */ 
/* use of internal extended precision floating-point registers. Sometimes */ 
/* this problem can be fixed by defining certain values to be volatile, */ 
/* thus forcing them to be stored to memory and rounded off. This isn't */ 
/* a great solution, though, as it slows the arithmetic down.    */ 

Ahora lo que me gustaría saber es que hay una manera, tal vez algo de opción del compilador, para desactivar los registros de coma flotante de precisión extendida interna.

Realmente appriaciate su ayuda

Respuesta

0

Si está utilizando CGC, el SO responder aquí podría ayudar:

Si se está utilizando otro compilador, se podría ser capaz de encontrar algunas pistas en ese ejemplo (o tal vez publicar un comentario en esa respuesta para ver si Mike Dinsdale podría saber.

3

La opción de compilador que desea para Visual Studio es /fp:strict que se expone en el IDE como Project->Properties->C/C++->Code Generation->Floating Point Model

3

Sí, usted tiene que cambiar la palabra de control FPU para evitar esto. Se explica bien para los compiladores más populares en este web page. Tenga en cuenta que esto es dramáticamente incompatible con lo que la mayoría de las bibliotecas esperan que haga la FPU, no mezclar y combinar. Siempre restaure la palabra de control FPU cuando haya terminado.

1

_control87(_PC_53, _MCW_PC) o _control87(_PC_24, _MCW_PC) harán el truco. Aquellos establecieron la precisión en double y single respectivamente con MSVC. Es posible que desee utilizar _controlfp_s(...), ya que eso le permite recuperar la palabra de control actual explícitamente después de configurarla.

+0

quiere trabajar con las compilaciones x64 – Gabriel

+0

Tenga cuidado. Llamar a _control87 en compilaciones x64 puede arrojar una excepción. Programa: ... Archivo: amd64 \ ieee.c Línea: 109 Expresión: (máscara & ~ (_MCW_DN | _MCW_EM | _MCW_RC)) == 0 – Damian

1

Como han notado otros, puede solucionar esto estableciendo la palabra de control x87 para limitar la precisión del punto flotante. Sin embargo, una mejor manera sería hacer que MSVC genere código SSE/SSE2 para las operaciones de coma flotante; Me sorprende que no sea así por el momento en la actualidad, dadas las ventajas de rendimiento (y el hecho de que evita que uno se encuentre con molestos errores como los que está viendo), pero no hay nada que ver con MSVC. idiosincrasias.

Al hablar acerca de MSVC, creo que el indicador /arch:SSE2 hará que MSVC use instrucciones SSE y SSE2 para aritmética de precisión simple y doble, lo que debería resolver el problema.

+1

El objetivo principal de la aritmética de precisión extendida de x87 es evitar tener que recurrir a estas bibliotecas ridículas para operaciones de matriz en primer lugar. ¿Quién querría una menor precisión para ser el * default *? – Gabe

+1

@gabe: El 'x87' no ofrece la precisión suficiente para realizar aritmética exacta, que es lo que proporcionan estas primitivas geométricas. En casos como este, lo único que hace es romper los algoritmos que se comportan correctamente en * cualquier otra arquitectura *. También introduce todo tipo de errores difíciles de predecir en los que los resultados numéricos se ven afectados por cálculos semánticamente no relacionados. Existen beneficios definidos para la aritmética extendida 'x87', pero no tantos que debería usarse sin ninguna consideración crítica de las alternativas. –

+0

Wow. ¿Estás también en contra de las operaciones fusionadas de multiplicación y suma? Recuerde, x87 fue la primera implementación de IEEE 754, y casi con certeza la más popular. Teniendo en cuenta que Intel Itanium e i960, y Motorola 68881 y 88110 tienen aritmética de precisión extendida, no es el único. – Gabe

Cuestiones relacionadas