Modulo de un numero negativo

Started by Kloppix, June 30, 2012, 02:56:27 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Kloppix

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?

Rein (K´)ah Al-Ghul


Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

SplinterGU

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>
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Kloppix

#3

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):


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.

SplinterGU

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...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Rein (K´)ah Al-Ghul

tal vez el "%" en python corresponda a otro operador en los demas lenguajes...

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

hardyx

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.