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.
Prueba ésto:
if (valorint1 % ((int) abs(valorint2)) == 0)
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)
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
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.
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.