Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: XÑA en 15 de Octubre de 2006, 09:24:57 AM

Título: ¿double o float?
Publicado por: XÑA en 15 de Octubre de 2006, 09:24:57 AM
Estoy pensando en hacer una serie de clases matemáticas y me ha asaltado una duda. Resulta que se utiliza un cierto valor de epsilon debido a la precisión para hallar colisiones. He pensado que si utilizara double en lugar de float, esto quizás podría evitarse ( digo quizás porque sigue habiendo cierto error, pero es menor ).

La pregunta es:¿tarda lo mismo la CPU en procesar un double que un float ? Supongo que sí, pq creo que la arquitectura de la FPU es de 64 bits, pero no estoy seguro. Si fuera así, la única razón por la cual se utilizan floats en lugar de double es el tamaño en memoria.

Y luego DX trabaja siempre con floats y al arrancar el device, automáticamente pasa a modo 32 bits. Si mantengo el FPU preserve..¿baja mucho el rendimiento?

A ver que opinais
Título: Re: ¿double o float?
Publicado por: MrK en 15 de Octubre de 2006, 01:41:10 PM
Si mal no recuerdo, las FPU del x86 suelen trabajar con 80 bits de precision, con lo que da igual que trabajes con floats o doubles, como tu has dicho la diferencia esta en la cantidad de memoria que usas.

Para hacerlo bien no te podras ahorrar ninguna comparacion con epsilon trabajes con la precision que trabajes. Tambien notar que cada vez que guardas una variable en memoria te estas cargando parte de la precision (pues pasa de los 80 bits internos a 32 o 64), con lo que si se necesita mucha precision, se puede optimizar la rutina en asm y evitar al maximo el paso de datos de FPU a memoria y viceversa, pero bueno, el C suele hacerlo bien.
Pero ni de esta forma puedes prescindir de epsilon (como mucho puedes aspirar a un epsilon mucho mas pequenyo)

Lo del DX ni idea.

Cita de: "XÑA"Estoy pensando en hacer una serie de clases matemáticas y me ha asaltado una duda. Resulta que se utiliza un cierto valor de epsilon debido a la precisión para hallar colisiones. He pensado que si utilizara double en lugar de float, esto quizás podría evitarse ( digo quizás porque sigue habiendo cierto error, pero es menor ).

La pregunta es:¿tarda lo mismo la CPU en procesar un double que un float ? Supongo que sí, pq creo que la arquitectura de la FPU es de 64 bits, pero no estoy seguro. Si fuera así, la única razón por la cual se utilizan floats en lugar de double es el tamaño en memoria.

Y luego DX trabaja siempre con floats y al arrancar el device, automáticamente pasa a modo 32 bits. Si mantengo el FPU preserve..¿baja mucho el rendimiento?

A ver que opinais
Título: ¿double o float?
Publicado por: _Grey en 15 de Octubre de 2006, 01:52:21 PM
Disculpa que te responda este ser desactualizado, pero...

Yo usaría floats... realmente no recuerdo si es mas lenta o no la FPU, diría que si... pero de todas formas... ¡¡El FPU a muerto Larga vida a SIMD (SSE)!!

En los compiladores de hoy puedes usar las instrucciones SIMD que pueden hacer varios cálculos a la vez. Si no recuerdo mal los registros son de ¿128bits?, y meter 4 floats o 2 double, de una vez podrías hacer 4 operaciones o ... solo 2.

Hay día podrías hacer lo que te venga en gana, tiramos mas de la gráfica que de la CPU (con permiso...), con lo que quizás no notes nada, pero si no es para hacer cálculos científicos, deberías tener mas que suficiente con float, y apurar rendimiento.

Lo que puedes hacer para tratar la perdida de precisión es crear un valor que haga las veces de "margen de error" como con un 0.999999f, puede que para un perfeccionista sea un problema, pero como he dicho si no estas haciendo cálculos científicos, y se trata de colisiones 2D/3D, suficiente.


Saludos.

PD: creo que los registros del FPU son de 80bits, aun que no creo que fuera desde los primeros modelos.
Título: ¿double o float?
Publicado por: Tavo en 15 de Octubre de 2006, 08:31:42 PM
Yo elegiria float, pero si es para calculos cientificos es otra cosa. Lo mejor es trabajar en ASM, pero como es C, lo mejor es crear una clase (ah, no, C es impertativo, perdon :P), una estructura pero..... bueno, la idea seria crear una clase que administre las cuentas, ocuparia un poco mas de memoria pero no habria margen de error.
Título: ¿double o float?
Publicado por: XÑA en 15 de Octubre de 2006, 10:56:04 PM
¿y sabeis si esto tiene penalización?

double a=10;

float b=(float)a;

Es decir, si no es algo trivial para el asm pasar de double a float, o por el contrario es costoso
Título: ¿double o float?
Publicado por: MrK en 15 de Octubre de 2006, 11:29:01 PM
Cita de: "XÑA"¿y sabeis si esto tiene penalización?

double a=10;

float b=(float)a;

Es decir, si no es algo trivial para el asm pasar de double a float, o por el contrario es costoso

lo mas practico para estas cosas es poner el codigo en el Visual C o similar, y mirar que codigo asm genera :)


509:  double a=10;
0041CB18   mov         dword ptr [ebp-10h],0
0041CB1F   mov         dword ptr [ebp-0Ch],40240000h
510:
511:      float b=(float)a;
0041CB26   fld         qword ptr [ebp-10h]
0041CB29   fstp        dword ptr [ebp-14h]


parece que para convertir, simplemente carga el double de 64 bits en el copro, y lo "descarga" a una zona de memoria de 32 bits, en principio no parece muy costoso.
Título: ¿double o float?
Publicado por: Tavo en 16 de Octubre de 2006, 01:25:32 AM
aclaracion:

double a = 10.0

Pone el punto 0 siempre que trabajes con decimales, vas a tener errores en las cuentas, ya me paso de hacer 1/3 y que me diera cualquier cosa, asi que acordate de eso ;)

Saludos!
Título: ¿double o float?
Publicado por: AK47 en 16 de Octubre de 2006, 01:41:41 PM
typedef double REAL
Cuando lo tengas más o menos funcionando y veas que va demasiado lento, puedes cambiarlo a float y ver que resultados te da. Sino tiras con los doubles y listos. Es lo que hacemos nosotros en el juego, y por ahora con doubles va sin problemas :)
Título: ¿double o float?
Publicado por: ethernet en 16 de Octubre de 2006, 02:34:13 PM
Cita de: "AK47"typedef double REAL
Cuando lo tengas más o menos funcionando y veas que va demasiado lento, puedes cambiarlo a float y ver que resultados te da. Sino tiras con los doubles y listos. Es lo que hacemos nosotros en el juego, y por ahora con doubles va sin problemas :)

Y qué haces en tu juego que necesite doubles?
Título: ¿double o float?
Publicado por: ZüNdFoLGe en 16 de Octubre de 2006, 03:58:23 PM
Cita de: "ethernet"
Y qué haces en tu juego que necesite doubles?

buena pregunta, me he quedado pensando en qué cosa podria usarse un double y no se me ocurre otra que en algun score extra desubicado.
Título: ¿double o float?
Publicado por: senior wapo en 16 de Octubre de 2006, 04:25:50 PM
Yo si me he encontrado necesidad de doubles para alguna función de intersección de un un rayo de pantalla a triángulo. Los floats se debordaban facilmente.

Por lo demas, floats para todo.
Título: ¿double o float?
Publicado por: XÑA en 16 de Octubre de 2006, 05:47:52 PM
quiero hacer unas clases matemáticas en .Net y la precisión es importante
Título: ¿double o float?
Publicado por: ethernet en 16 de Octubre de 2006, 08:52:32 PM
Para el único caso que veo necesarios más precisión es para casos en los que tengas grandes distancias y a la vez pequeñas, sobretodo por las posibles multiplicaciones más que por el hecho de que con float no vaya a poder un rango dinámico alto.
Título: ¿double o float?
Publicado por: AK47 en 16 de Octubre de 2006, 09:54:31 PM
Lo pusimos con la idea de evitar posibles fallos de precisión, pero si me dices que no es necesario pues ya lo cambiaremos... si nos da la gana :P
Título: ¿double o float?
Publicado por: ethernet en 16 de Octubre de 2006, 10:03:36 PM
jaja, te he preguntado para qué lo usabais, no te he dicho que lo quites :P
Título: ¿double o float?
Publicado por: ethernet en 16 de Octubre de 2006, 10:04:37 PM
Cita de: "XÑA"quiero hacer unas clases matemáticas en .Net y la precisión es importante

Por qué razón para .net? no se puede hacer código para compilar en nativo y  para CLR?
Título: ¿double o float?
Publicado por: XÑA en 17 de Octubre de 2006, 10:49:25 AM
La razón es que XNA es .net