2012-05-28 12 views
6

Estaba calculando proyecciones de puntos 2D normalizados y accidentalmente noté que eran más precisas que cuando se proyectaban los puntos sin normalizarlos. Mi código está en C++ y compilo con NDK para un móvil Android que carece de FPU (unidad de coma flotante).Normalizando variables en C++ entre (0,1) para obtener precisión en aritmética

¿Por qué obtengo precisión en los cálculos con C++ cuando primero normalizo los valores para que estén entre 0 y 1?

¿Es generalmente cierto en C++ que gana precisión en aritmética si trabaja con variables que están entre 0 y 1 o está relacionado con el caso de compilar para un dispositivo ARM?

+5

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Florian

+1

Lo que probablemente esté viendo es más dígitos debido a la incapacidad de los valores de coma flotante para ser exactos en las computadoras. –

+0

Entonces, ¿tal vez veo más precisión porque estoy compilando para un dispositivo ARM que no tiene FPU y se está convirtiendo en aritmética de punto fijo? –

Respuesta

9

Tiene un malentendido de precisión. La precisión es básicamente la cantidad de bits disponibles para representar la mantisa de su número.

Puede parecer que tiene más dígitos después del punto decimal si mantiene la escala entre 0 y 1, pero eso no es precisión, que no cambia en absoluto en función de la escala o el signo.

Por ejemplo, la precisión simple tiene 23 bits de precisión, ya sea que su número sea 0.5 o 1e38. La precisión doble tiene 52 bits de precisión.

Consulte this answer para obtener más información sobre la representación del nivel de bit IEEE754.

+0

bien, ¿entonces no estaba refiriéndose a la precisión, sino a la precisión en los cálculos –

+0

y cuando estamos hablando de aritmética de punto fijo? En ese caso, ¿la cantidad máxima de bits necesaria para representar el entero máximo afecta la precisión? –

+1

Si usa punto flotante en coma fija en lugar de C++ IEEE754 estándar, está fuera del alcance del estándar de C++, en cuyo caso el comportamiento es específico de la implementación. Pero incluso el punto fijo (si se escala bien) tendrá este mismo comportamiento de precisión similar, independientemente de la escala. Si está viendo una precisión diferente a diferentes escalas, realmente depende de cómo se haya implementado. – paxdiablo

3

Si realiza cálculos basados ​​en matrices, es posible que desee calcular los números de condición de sus matrices. Básicamente, el número de condición mide el tamaño del error numérico en su respuesta como una función del tamaño del error numérico en sus entradas. Se dice que un problema con un número de condición baja está bien acondicionado, mientras que un problema con un número de condición alta se dice que está mal acondicionado.

Para algunos problemas, puede preprocesar sus datos (por ejemplo, volviendo a escalar las unidades en las que mida ciertas variables) para que el número de condición sea más favorable. P.ej. una hoja de cálculo financiera en la que algunas columnas se miden en centavos de dólar y otras en miles de millones de dólares están mal condicionadas.

Consulte Wikipedia para una explicación detallada.