2012-10-05 55 views

Respuesta

46

Cuando se tiene la expresión:

a % b = c 

que significa realmente existe un entero n que hace c lo más pequeño posible, pero no negativo.

a - n*b = c 

A mano, que sólo puede restar 2 (o añadir 2 si su número es negativo) una y otra vez hasta que el resultado final es el número positivo más pequeño posible:

3.14 % 2 
= 3.14 - 1 * 2 
= 1.14 

Además, 3.14 % 2 * pi es interpretado como (3.14 % 2) * pi. No estoy seguro de si quería escribir 3.14 % (2 * pi) (en cualquier caso, el algoritmo es el mismo. Basta con restar/agregar hasta que el número sea lo más pequeño posible).

+2

prefiero la explicación x% y es x - (Math.floor (x/y) * y) que es lo mismo que lo que ha dicho pero las apariencias más comprensible para mí – sabbahillel

+0

@sabbahillel Y es por eso que '(-123)% 10 == 7' en python3, mientras que el resultado es -3 en otros lenguajes como C++. Porque '(-123) - (math.floor (-123/10) * 10) == 7' –

2

mismo que un módulo normal de 3.14 % 6.28 = 3.14, al igual que 3.14%4 =3.143.14%2 = 1.14 (el resto ...)

+0

Orden o operaciones –

+0

@MadPhysicist ¿qué? el orden de las operaciones del módulo es el mismo que el del pow ... ciertamente menos que el igual ... ¿cuál es el problema? –

+0

'%' tiene la misma precedencia que '/', que es definitivamente menor que pow (igual que los tiempos). '3.14% 2 * pi' es lo mismo que' (3.14% 2) * pi == 1.14 * pi' en lugar de '3.14% (2 * pi)'. –

20

Además de las otras respuestas, la fmod documentation tiene algunas cosas interesantes que decir sobre el tema:

math.fmod(x, y)

Return fmod(x, y), tal como se define por la biblioteca de la plataforma C . Tenga en cuenta que la expresión Python x % y no puede devolver el mismo resultado . La intención de la norma C es que fmod(x, y) ser exactamente (matemáticamente; a precisión infinita) igual a x - n*y para algunos número entero n tal que el resultado tiene el mismo signo que x y magnitud menos de abs(y). Python's x % y devuelve un resultado con el signo y en su lugar, y puede no ser exactamente computable para los argumentos flotantes. Para ejemplo, fmod(-1e-100, 1e100) es -1e-100, sino el resultado de Python de -1e-100 % 1e100 es 1e100-1e-100, que no se puede representar exactamente como un flotador, y rondas a la sorprendente 1e100. Por este motivo, generalmente se prefiere función fmod() cuando se trabaja con flotadores, mientras que Python's x % y es preferible cuando se trabaja con enteros.

+0

Nunca supe de 'fmod'. ¡Gracias! – Blender

1

Lo mismo que cabría esperar del módulo normal ... p. Ej. 7 % 4 = 3, 7.3 % 4.0 = 3.3

Tenga cuidado con los problemas de precisión de coma flotante.

0

debe utilizar fmod (a, b) Mientras abs (x% y) < abs (y) es cierto matemáticamente, por flotadores que puede no ser cierto numéricamente debido a redondeo.Por ejemplo, y suponiendo una plataforma en la que un flotante de Python es un número de precisión doble IEEE 754, para que -1e-100% 1e100 tenga el mismo signo que 1e100, el resultado calculado es -1e-100 + 1e100, que es numéricamente exactamente igual a 1e100. La función fmod() en el módulo matemático devuelve un resultado cuyo signo coincide con el signo del primer argumento en su lugar, y así devuelve -1e-100 en este caso. Qué enfoque es más apropiado depende de la aplicación.

donde se usa x = a% b para el módulo entero