Pregunta

Perl

print 2 % -18;

- >

-16

Tcl

puts [expr {2 % -18}]

- >

wscript.echo 2 mod -18

pero VBScript

2

- >

<*>

¿Por qué la diferencia?

¿Fue útil?

Solución

La respuesta de wikipedia es bastante útil aquí.

Un breve resumen es que cualquier número entero se puede definir como

a = qn + r

donde todas estas letras son enteras, y

0 < = | r | < | n |.

Casi todos los lenguajes de programación requerirán que (a / n) * n + (a% n) = a. Por lo tanto, la definición de módulo dependerá casi siempre de la definición de división entera. Hay dos opciones para la división de enteros por números negativos 2 / -18 = 0 o 2 / -18 = -1. Dependiendo de cuál sea el verdadero para su idioma, generalmente cambiará el operador%.

Esto se debe a que 2 = (-1) * -18 + (-16) y 2 = 0 * -18 + 2.

Para Perl la situación es complicada. La página del manual dice: " Tenga en cuenta que cuando use el entero está en alcance, "% " le brinda acceso directo al operador de módulo tal como lo implementó su compilador de C. Este operador no está tan bien definido para los operandos negativos, pero se ejecutará más rápido. " Por lo tanto, puede elegir cualquier opción para Perl (como C) si el uso de enteros está dentro del alcance. Si use integer no está dentro del alcance, el manual dice & Quot; Si $ b es negativo, entonces $ a% $ b es $ a menos el múltiplo más pequeño de $ b que no sea menor que $ a (es decir, el resultado será menor o igual a cero). "

Otros consejos

La página " Operación del módulo " de Wikipedia explica bastante bien . No intentaré hacerlo mejor aquí, ya que es probable que cometa un error sutil pero importante.

El problema es que puedes definir " resto " o " módulo " de diferentes maneras, y diferentes idiomas han elegido diferentes opciones para implementar.

Después de dividir un número y un divisor, uno de los cuales es negativo, tiene al menos dos formas de separarlos en un cociente y un resto, de modo que cociente * divisor + resto = número: puede redondear el cociente hacia infinito negativo, o hacia cero.

Muchos idiomas solo eligen uno.

No puedo resistirme a señalar que Common Lisp ofrece ambos.

python, por supuesto, te informa explícitamente

>>> divmod(2,-18)
(-1, -16)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top