Resta de floats

Started by warrior_rockk, October 02, 2013, 03:47:38 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

warrior_rockk

Algo he leído por el foro de que hay que tener en cuenta la precisión de los floats, pero el problema que tengo no es muy normal. Tengo este ejemplo que resta 0.1 a un valor float hasta llegar al 0 y al llegar a 0.2 me deja la resta en 0.0999 con lo que la siguiente resta se pasa del 0:


process main()
private
float f;
begin
f = 1.0;
loop
f -=0.1;
frame;
end;
end



panreyes

Es el comportamiento esperado :)

warrior_rockk

¿y porqué? ¿Porque 0.2 - 0.1  no es igual a 0.1? De ser así como se comporta, no se pueden utilizar los floats para ciertas operaciones...

panreyes

Para hacer los floats lo más rápidos posibles, estos pierden algo de precisión. No es algo de BennuGD, sino de la programación en general.


Además, las operaciones con floats son mucho más lentas que en ints, por lo que nunca se recomienda utilizarlas si no son necesarias.

SplinterGU

sos groso PiXeL, me ahorraste la respuesta.

warrior_rockk, estos problemas de precision son comunes en las operaciones con punto flotante, no es un problema de bennugd, es un problema del estandard IEEE
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

pixel, me has hecho pensar (o quizas darme cuenta) que el problema del blitter podria estar en el cambio que se introdujo tiempo atras para usar floats en varias de las operaciones, y por eso quizas el problema de precision... mmm... luego lo probare! gracias!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

panreyes

Sigamos con el Brainstorming, diciendo palabras aleatorias, para ver si te ayudo más:
OpenGL
GL
Open
GLOpen
OPENGL


Yo lo dejo caer xD

SplinterGU

Quote from: PiXeL on October 02, 2013, 10:27:54 PM
Sigamos con el Brainstorming, diciendo palabras aleatorias, para ver si te ayudo más:
OpenGL
GL
Open
GLOpen
OPENGL


Yo lo dejo caer xD

ya lo se, pero eso es un cambio grande... quizas, casi tan grande como fue pasar de fenix a bennugd... y seguramente muchos seguiran tirando del render por software para plataformas raras, en las que no haya ogl, se que seran menos, pero si hacer el fix no implica mucho esfuerzo, creo que deberia hacerlo.

para ogl, lamentablemente necesito un tiempo que por lo que resta de este año creo que no tendre.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Respecto al hilo: más que por velocidad, podría incluso tener que ver el cómo se manejan los floats por hardware, ya que la precisión de estos se basan en un sistema binario con un máximo de 32bits por cifra, y tienen lugar redondeos varios que no son aceptables.
Los FLOATS se usan cuando se necesitan juntar cifras grandes (>100000) con otras pequeñas (<0.001), ya que al usar una potencia de 10 no ocupan tanto espacio en memoria, a cambio de una perdida de precisión. Existe un valor en los ordenadores (creo que se llamaba "beta") que ondoca el grado de desviación en los cálculos con floats, y hay ordenadores carísimos con una baja "beta" para esos menesteres, a los que los mortales comunes no tenemos acceso.
Pero cuando se van a usar valores con un rango limitado, aun cuando se usen decimales, es mejor usar INT, aunque después tengamos que multiplicar o dividir el resultado por una potencia de 10 y guardarlo en un float. Es poco más lento (inapreciable), más compatible con cualquier dispositivo, y mucho más preciso.

Respecto a OGL: recuerdo lo que fue el cambio de Fenix a Bennu. Pasaron dos meses antes de tener la primera alpha, y sólo hacía algunas funciones de texto y las funciones de carga de DLLs, el tema gráfico se modificó bastante después y hubo que esperar varios meses hasta la primera beta medio funcional. Si el código es como creo que es, casi mejor empezar de cero. Habrá muchas cosas que se puedan usar, como pasó con Fenix, pero si ahora se rompe el uso de las SDL surfaces (creo que es así como se llaman los objetos que contienen los gráficos en memoria internamente), casi todo depende de ellas ¿o no?
Lo mejor es tomárselo todo con paiencia e ir poco a poco, y no ponerse una fecha temprana.

¿En serio hay operaciones con floats para el cálculo de gráficos?
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)