22

Para un gran número de crujidos, estoy considerando utilizar un punto fijo en lugar de coma flotante. Por supuesto, importará cuántos bytes tenga el tamaño del tipo de punto fijo, en qué CPU se ejecutará, si puedo usar (para Intel) el MMX o SSE o lo que sea que surja ...Cuándo utilizar el punto fijo en estos días

Me pregunto si estos días cuando el punto flotante se ejecuta más rápido que nunca, ¿vale la pena considerar el punto fijo? ¿Hay reglas generales en las que podamos decir que importará en más de un pequeño porcentaje? ¿Cuál es la descripción desde 35,000 pies de desempeño numérico? (Por cierto, supongo que se encuentra una CPU general en la mayoría de las computadoras, no en DSP o sistemas integrados especializados).

Respuesta

18

Todavía lo vale. El punto flotante es más rápido que en el pasado, pero el punto fijo también lo es. Y fijo sigue siendo el único camino a seguir si le importa la precisión más allá de lo garantizado por IEEE 754.

+2

+1, ¿tiene algún software de evaluación comparativa que utilice para verificar esto para diferentes arquitecturas? Llegué a la misma conclusión a través de la creación de perfiles, pero fue un buen trabajo y los resultados solo se relacionan con el hardware específico que probé. Interesado en ver la diferencia en los dispositivos móviles con ARM, así como los más comunes Intel y AMD. –

0

Dado que está utilizando una CPU de propósito general, sugeriría que no utilice el punto fijo, a menos que el rendimiento sea tan crítico para su aplicación que debe contar cada tic. La molestia de implementar un punto fijo y lidiar con problemas como el desbordamiento simplemente no lo vale, cuando tienes una CPU, que lo hará por ti.

En mi humilde opinión, el punto fijo solo es necesario cuando está utilizando un DSP sin soporte de hardware para operaciones de coma flotante.

11

Otra buena razón para usar un decimal fijo es que el redondeo es mucho más simple y predecible. La mayor parte del software financiero utiliza decimales de precisión arbitraria de punto fijo con redondeo a la mitad o incluso para representar el dinero.

+0

mi interés no era financiero, pero este es un buen punto – DarenW

+0

Muy cierto. Esto también se aplica cuando se implementa una simulación determinista distribuida en tiempo real. Las sutiles diferencias en las implementaciones IEEE-754 pueden dar como resultado errores extremadamente difíciles de encontrar, donde el mismo cálculo tiene un resultado diferente en diferentes sistemas distribuidos, lo que hace que diverjan del estado de simulación esperado. Ver [este artículo] (http://gafferongames.com/networking-for-game-programmers/floating-point-determinism/). –

4

Utilice un punto fijo cuando el hardware no sea compatible con coma flotante o la implementación del hardware sea una mierda.

También tenga cuidado al hacer clases para ello. Algo que piensas que sería rápido podría llegar a ser un perro cuando se trata de crear perfiles debido a copias (no) necesarias de las clases. Esa es otra pregunta para otro momento sin embargo.

+0

Sería interesante saber qué hardware no es compatible con punto flotante en estos días. Parece que ahora, incluso un viejo y roto zapato de encaje roto hace punto flotante ... 8P – DarenW

+1

(por cierto, llevo sandalias aquí en Florida, así que no estoy en la tecnología del cordón) – DarenW

+2

@DarenW: La Nintendo DS (que yo aún se considera algo nuevo) no es compatible con punto flotante a través del hardware. Ese es el único dispositivo de mano para el que he desarrollado, pero supongo que muchos otros dispositivos de bolsillo tampoco tienen una FPU. – Ponkadoodle

5

Su SIEMPRE es más rápido de usar punto fijo (experiencia de x86, pentium, 68k y ARM). Sin embargo, también puede depender del tipo de aplicación. Para la programación de gráficos (uno de mis principales usos del punto fijo) he podido optimizar el código utilizando tablas de coseno preconstruidas, tablas de registro, etc. Pero también las operaciones matemáticas básicas también han demostrado ser más rápidas.

Un comentario sobre el software financiero. Se dijo en una respuesta anterior que el punto fijo es útil para los cálculos financieros. En mi propia experiencia (desarrollo de un gran sistema de gestión de tesorería y una amplia experiencia en el procesamiento de tarjetas de crédito) NO usaría el punto fijo. Tendrá errores de redondeo usando punto flotante o fijo. Siempre utilizamos montos enteros para representar montos monetarios, contando la cantidad mínima posible (1c por euro o dólar). Esto asegura que no se pierdan cantidades parciales. Al hacer cálculos complejos, los valores se convierten en dobles, se aplican reglas de redondeo específicas de la aplicación y los resultados se convierten a números enteros.

+0

En mi caso (cálculo de comisiones) usamos Java BigDecimal, que no es exactamente un punto fijo, pero se acerca bastante. Las reglas de redondeo son, en efecto, específicas de la aplicación, pero 9 de cada 10 son equivalentes a la mitad. – ddimitrov

+0

Por cálculos complejos, ¿está entendiendo interés compuesto, tasas impositivas o algo así? Para sumar y restar montos en una cuenta, ¿no sería fijo el One True Way? ¿Usas flotadores en ese caso? – DarenW

+1

La búsqueda de tablas es una consideración importante en lo que estoy haciendo, y lo que muchos otros pueden necesitar, esto no es práctico con el punto flotante. Un muy buen punto. – DarenW

17

En situaciones en las que se manejan grandes cantidades de datos, el punto fijo puede ser dos veces más eficiente en cuanto a la memoria, p. un entero de cuatro bytes en lugar de un doble de ocho bytes. Una técnica utilizada a menudo en grandes conjuntos de datos geoespaciales es reducir todos los datos a un origen común, de modo que los bits más significativos puedan eliminarse y trabajar con enteros de punto fijo para el resto. El punto flotante solo es importante si el punto realmente flota, es decir, si se trata de un rango muy amplio de números con una precisión muy alta.

+5

Un gran comentario sobre la parte "flotante" del punto flotante - volé mi mente de par en par, y tan obvia en retroceso. – Curyous

1

Otra razón para utilizar punto fijo es que los dispositivos ARM, como los teléfonos móviles y tabletas, carecen de FPU (al menos muchos de ellos).

Para desarrollar aplicaciones en tiempo real, tiene sentido optimizar las funciones utilizando aritmética de punto fijo. Existen implementaciones de FFT (transformada rápida de Fourier), muy importantes para los gráficos, que basan sus mejoras en la eficiencia al depender de la aritmética de coma flotante.

+0

Creo que su última oración fue para "confiar en la aritmética de punto fijo". –

Cuestiones relacionadas