Mi PC no sabe restar?

Started by Anyeos, April 21, 2013, 03:42:36 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Anyeos

Este código:
fangle = father.angle;
if (fangle < 0) fangle = 360000-fangle; end


devuelve 405000 cuando fangle es igual a -45000

WTF??

Como hace para lograr esa cuenta que no tiene ni pie ni cabeza? Si para lograrlo lo que tiene que hacer es sumarle 25000, pero 45000 no es 25000, menos mal que al menos considera el 5000.

fangle es de tipo "int".

He tenido algunos problemitas matemáticos (y eran míos no del software) pero con esta me mató che, jaja. Me dejó pagando mal.

Imprimiendo con say me salió esto:
1fangle=-45000
fangle=405000

(El 1 adelante de fangle es a propósito para distinguir el primero del segundo: Antes de hacer la cuenta, y después de haberla hecho).

Ahora la pregunta del millón es: ¿Cómo hago para arreglar eso?

Voy a intentar hacerlo por mis propios medios y la verdad no pensaba publicar nada en estos foros pero me sorprendió cuando me arrojó ese resultado por eso el juego me andaba mal, le erraba groso en un cálculo que había para al colisionar generar un rebote y me puse a bueno, tratar de terminar con eso pero no, con esta me mató che.

Estuve peleándola con la hoja, el papel y el lápiz, con la trigonometría, pitágoras y las matemáticas en general hasta que al fin pensé que lo había logrado (hasta no me había avivado de que la pantalla tiene el eje de las Y invertido comparado con los cálculos matemáticos en papel). Todo ese laburo y en un caso en particular me funcionaba mal, claro, cuando fangle era -25000. Y cuando imprimo los valores para ver qué andaba pasando, me encuentro conque fangle vale 405000. ¿Y de dónde pudo sacar ese número? Así que puse código también para imprimir el valor antes de que haga la cuenta y después de que la hizo. Para mi sorpresa hacía mal la cuenta.


Y la solución no puede ser usar ese valor negativo de -25000 aunque es válido como ángulo porque necesito de 0 a 360º para las fórmulas que hice, de otra forma no funcionarían. Y es un bardo volverlas a hacer o más bien estipular todos los ángulos posibles inclusive negativos, tendría que poner medio un choclo de código.

Así que estoy en un drama ahora. Me mató che, nunca me imaginé que una computadora hiciera mal una cuenta tan simple como una resta.


Me tiro a indagar a que el problema viene de más atrás (aunque no debería), como que en el otro process se produce un giro de ángulo o sumatoria que se desborda. No obstante yo les hago a todos el % 360000 pero pareciera que no sirve hacer eso. Inclusive hacer eso me devuelve valores negativos, no sé por qué, pero lo hace.
Bueno hasta ahí llegaron mis conocimientos sobre eso. No sé qué voy a hacer ahora.


@SplinterGU, avisame si estos mensajes míos te parecen muy fuera de tema y no los hago más. Lo que pasa que a mi me gusta hacerlos nada más. Me hacen sentir un poco más aliviado.

Erkosone

Simple, menos por menos es mas, aritmética básica ;)
Tienes que sumar en vez de restar melón XD..

KeoH

La cuenta esta perfecta xDD al final a un numero positivo le estas restando un numero negativo .. asi q en esencia lo que haces es sumar xD ....

SplinterGU

sos groso, sabelo!

es lo que dice erko.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Anyeos

#4
Aaah! chavón, es que yo tenía en mente otra idea. Y andaba medio desvelado jaja, se ve que la cabeza desvelada no sirve mucho.
Es que tengo un bug en mi cerebro jaja.

Este era el código que yo quería:

    if (fangle < 0) fangle = 360000+fangle; end
    if (fangle > 360000) fangle = fangle-360000; end

Con eso mantengo el ángulo dentro de 360000 en valores positivos. El problema mío era lograr eso pero con código rápido.

Y por eso no me encajaba el resultado en mi cabeza porque no me di cuenta que puse al revés mi lógica. Que bolu... ja Luego me confundí con el tema del signo, más bien parece que me lo olvidé, increíble siendo algo tan elemental que nunca se me pasa por alto. No sé cómo me pudo pasar eso :S

Pero igual que opinan sobre usar % 360000 para mantener el ángulo dentro de sus valores? Porque a mi no me "hace caso", no funciona como espero, igual me salen valores negativos y yo quería mantenerlo dentro de los positivos (de 0 a 360000).

Voy a probar a ver si además sumándole 360000 me funciona como espero. Lo que quiero es que no me arroje números negativos como ese tal -45000 que me salía. Pero a su vez quiero que sea rápido para ejecutar, calculo que es más rápido hacer una suma y obtener el módulo que hacer dos comparaciones y una suma. No sé qué sería más rápido la verdad.

En esta PC grande no noto diferencia pero capaz en un dispositivo con recursos limitados se alcanza a observar.

¿Qué código sería más rápido?
Este:

    if (fangle < 0) fangle = 360000+fangle; end
    if (fangle > 360000) fangle = fangle-360000; end


O este:
fangle  = (fangle+360000) % 360000;

Y además, el último funcionaría o me seguirá arrojando números negativos?

Voy a probar a ver si me arroja números negativos pero la velocidad no sé cómo calculársela.


Gracias por la ayuda jaja, que tonto.

Saludos



-editado-
Ya probé y parece que la fórmula:
fangle  = (fangle+360000) % 360000;

Funciona bien. Cualquier valor negativo que pudiera tener me arroja siempre uno positivo. Claro, salvo que comencemos con un numero más negativo que lo que daría la suma. Pero esa situación no se daría nunca si se aplica esta fórmula cada vez que se modifica el ángulo.

Ahora no sé cómo corno fui tan bol*** de no darme cuenta de esto antes. Si inclusive ya había escrito en una parte de mi código justamente eso. Lo que acabo de hacer recién fue encontrar de cul* ese código solamente porque estaba buscando el otro código de recién. Y encontré que en un sitio donde hay un cañón que apunta al jugador puse eso para mantener sus ángulos dentro de lo positivo.
Sin embargo hay una función que utilizo globalmente que tenía un código peor pensado, siendo que esa función es crítica porque la utilizo en varios procesos. Pero como pude ser tan bol... já

Bueno, pero me avivé, menos mal.