MOD + ABS + Comparación = imposible

Started by Drumpi, March 03, 2020, 03:35:58 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Buenas a todos:


Anoche estaba escribiendo código y me pasó una cosa muy curiosa. Tengo una línea de código similar a esta:
if (valorint1 % abs(valorint2) == 0)
Pues el compilador me lanzaba un error de que la operación sólo podía ejecutarse con números enteros. Vale, ABS devuelve un float, pero si quitaba el ABS y ponía (-valorint2) (porque sé que va a ser negativo, lo de ABS es por las formalidades), me sigue diciendo lo mismo.
Si guardo abs(valorint) en una variable temporal, sí funciona, pero la línea, tal cual, no.


Y he hecho comparaciones con valores abs anteriormente sin problemas, pero parece que con el módulo, la cosa no es tan sencilla :p


Ya de paso, ando un poco oxidado con BennuGD después de tanto C#, VB, XML... ¿Cómo era el casteo de variables? Para convertir un float en un int.
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)

panreyes

Prueba ésto:
if (valorint1 % ((int) abs(valorint2)) == 0)

Yawin

El módulo devuelve el resto y buscas que sea cero. Eso significa que el dividendo tiene que ser múltiplo del divisor.Todo número múltiplo de un número también es múltiplo de su negativo. Por lo que no necesitas hacer el "abs".
O sea: 100%2 == 100%(-2)
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

Puede que sí o puede que no. Creo recordar que si uno de los valores es negativo, tanto el cociente como el resto son negativos.
Sé que tuve muchos problemas con los valores positivos y negativos cuando trataba de hacer cíclico el scroll tileado, usando el mod para obtener valores dentro del rango del ancho/alto del mapa.

Lo malo es que no lo he corregido aun, y ya no sé dónde está esa línea ^^U
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)

Yawin

Te certifico que el módulo será siempre 0 en el caso que necesitas. Como digo, para que el resto sea cero, el dividendo tiene que ser múltiplo del divisor. Todos los múltiplos de un número lo son de su negativo (evidentemente, el resultado de la división cambiará de signo) y su módulo, por tanto, sigue siendo cero.
Y el cero es cero. No es ni positivo ni negativo.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

Ups, cierto ^^U
Llevaba un día de mucho programar y, claro, estaba pensando en todos los valores del resto, no estaba pensando que el valor que a mi me hacía falta es sólo el cero.
Bien visto, eso ahorra un cálculo a la operación, puede parecer poco, pero si la operación va donde sospecho, cualquier cálculo que se ahorre será bienvenido.
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)