Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Kloppix on June 30, 2012, 02:56:27 PM

Title: Modulo de un numero negativo
Post by: Kloppix on June 30, 2012, 02:56:27 PM
En python  " -45 % 360 "  da 315, lo que me resultaría utilísimo a la hora de utilizar ANGLE. Pero en Bennu " -45 % 360 " da -45.  Por que la diferencia?
Title: Re:Modulo de un numero negativo
Post by: Rein (K´)ah Al-Ghul on June 30, 2012, 04:05:44 PM
360 + ( - 45 ) = 315
Title: Re:Modulo de un numero negativo
Post by: SplinterGU on June 30, 2012, 07:44:49 PM
Quote from: Kloppix on June 30, 2012, 02:56:27 PM
En python  " -45 % 360 "  da 315, lo que me resultaría utilísimo a la hora de utilizar ANGLE. Pero en Bennu " -45 % 360 " da -45.  Por que la diferencia?

kloppix, que criterios sigue eso que mencionas de python... no creo que python haga eso, eso que mencionas no tiene pies ni cabeza... me resulta raro que python tenga ese bug...
mira


splinter@splinter:/tmp> cat 1.c
#include <stdio.h>

int main(int argc, char*argv[])
{
        printf( "%d\n", -45 % 360 );
}
splinter@splinter:/tmp> ./1
-45
splinter@splinter:/tmp>
Title: Re:Modulo de un numero negativo
Post by: Kloppix on July 01, 2012, 01:51:22 PM

Quote from: Rein (K´)ah Al-Ghul on June 30, 2012, 04:05:44 PM
360 + ( - 45 ) = 315


Si, me dí cuenta . Lo que me parecía curioso es que el mismo operador de diferentes resultados en 2 lenguajes.


Quote from: SplinterGU on June 30, 2012, 07:44:49 PM
kloppix, que criterios sigue eso que mencionas de python... no creo que python haga eso, eso que mencionas no tiene pies ni cabeza... me resulta raro que python tenga ese bug...
mira


En el intérprete de python ">>> -45%360" da como resultado -315. Busqué en internet y hay mucha gente preguntando lo mismo. Que por qué se comporta diferente a Java o C.  Ejemplo (http://stackoverflow.com/questions/1907565/c-python-different-behaviour-of-the-modulo-operation (http://stackoverflow.com/questions/1907565/c-python-different-behaviour-of-the-modulo-operation)):


I've found some strange behaviour in python regarding negative numbers:
>>> a = -5
>>> a % 4
3
Could anyone explain what's going on?


------------------------Respuesta-------------


Unlike C or C++, Python's modulo operator (%) always return a number having the same sign as the denominator (divisor). Your expression yields 3 because


(-5) % 4 = (-2 × 4 + 3) % 4 = 3.




En resumen: El que se comporta raro no es Bennu sino Python.
Title: Re:Modulo de un numero negativo
Post by: SplinterGU on July 01, 2012, 06:55:15 PM
a ver... el modulo es el resto de una division... nunca el resto de "-45 / 360" puede dar -315, por mas explicaciones que la gente de python le quiera dar... es imposible eso...

no le veo logica... para mi es un bug, que no entiendo como llegaron a hacerlo...

ni bennugd, ni C, ni java, ni basic, tiene ese comportamiento...

en fin, el resto de la division -15/360 da -15...
Title: Re:Modulo de un numero negativo
Post by: Rein (K´)ah Al-Ghul on July 01, 2012, 08:21:12 PM
tal vez el "%" en python corresponda a otro operador en los demas lenguajes...
Title: Re:Modulo de un numero negativo
Post by: SplinterGU on July 01, 2012, 11:26:11 PM
no, no, corresponde a modulo, pero con numeros negativos da problemas...

mira otra curiosidad... si pones

print -45%-360 da

-45!!!!

chan!!!

print 45%-360

da

-315

bueno, tras unas pruebas, esta seria la correcta implementacion de % para python...


#!/usr/bin/python

def sgn(a):
        if (a==0):
                return 0
        return a/abs(a)

def mod(a,b):
        return (abs(a)%abs(b))*(sgn(a))

print mod(-45,360)
print mod(45,360)
print mod(45,-360)

print mod(0,350)
print mod(350,350)
print mod(-350,350)
print mod(-351,350)
print mod(-349,350)


esto corresponde a lo mismo en C.
Title: Re:Modulo de un numero negativo
Post by: hardyx on July 09, 2012, 08:40:02 AM
Estoy con SplinterGU, es un fallo de Python. El módulo es el resto de la división y tiene que dar un número del mismo signo y siempre menor que el divisor. No tiene sentido que dé la suma de los números. Leyendo en Stackoverflow dicen que Phyton usa una operación matemática diferente que no es el resto de la división que conocemos.