Autor Tema: MOD + ABS + Comparación = imposible  (Leído 1120 veces)

Drumpi

  • Hero Member
  • *****
  • Mensajes: 6466
  • Karma: 168
  • Odio el periodo "entre proyectos"
    • La web de Drumpi
MOD + ABS + Comparación = imposible
« en: Marzo 03, 2020, 03:35:58 pm »
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:
Código: [Seleccionar]
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

  • Administrator
  • *****
  • Mensajes: 2275
  • Karma: 82
    • panreyes.com
Re:MOD + ABS + Comparación = imposible
« Respuesta #1 en: Marzo 03, 2020, 04:37:59 pm »
Prueba ésto:
 if (valorint1 % ((int) abs(valorint2)) == 0)

Yawin

  • Hero Member
  • *****
  • Mensajes: 1091
  • Karma: 45
  • La primera persona que ha "demosceneado" en Bennu.
Re:MOD + ABS + Comparación = imposible
« Respuesta #2 en: Abril 10, 2020, 02:40:29 pm »
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

  • Hero Member
  • *****
  • Mensajes: 6466
  • Karma: 168
  • Odio el periodo "entre proyectos"
    • La web de Drumpi
Re:MOD + ABS + Comparación = imposible
« Respuesta #3 en: Abril 14, 2020, 11:31:57 pm »
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

  • Hero Member
  • *****
  • Mensajes: 1091
  • Karma: 45
  • La primera persona que ha "demosceneado" en Bennu.
Re:MOD + ABS + Comparación = imposible
« Respuesta #4 en: Abril 15, 2020, 09:30:03 pm »
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

  • Hero Member
  • *****
  • Mensajes: 6466
  • Karma: 168
  • Odio el periodo "entre proyectos"
    • La web de Drumpi
Re:MOD + ABS + Comparación = imposible
« Respuesta #5 en: Abril 15, 2020, 11:48:21 pm »
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)