Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿double o float?

Iniciado por XÑA, 15 de Octubre de 2006, 09:24:57 AM

« anterior - próximo »

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

MrK

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

_Grey

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.

Tavo

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.

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

MrK

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.

Tavo

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!

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 :)

ethernet

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?

ZüNdFoLGe

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.

senior wapo

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.

XÑA

quiero hacer unas clases matemáticas en .Net y la precisión es importante

ethernet

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.

AK47

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

ethernet

jaja, te he preguntado para qué lo usabais, no te he dicho que lo quites :P






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.