ventajas qué que programación programacion mejor lenguajes lenguaje internet desventajas actuales perl vbscript tcl modulo

perl - qué - que es un lenguaje de programacion web



¿Por qué el módulo es diferente en diferentes lenguajes de programación? (4)

Perl

print 2 % -18;

->

-16

Tcl

puts [expr {2 % -18}]

->

-16

pero VBScript

wscript.echo 2 mod -18

->

2

¿Por qué la diferencia?


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 el cociente * divisor + resto = número: puede redondear el cociente hacia el infinito negativo, o hacia cero.

Muchos idiomas simplemente eligen uno.

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


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

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


Python, por supuesto, te informa explícitamente

>>> divmod(2,-18) (-1, -16)


La respuesta de wikipedia es bastante útil aquí.

Un breve resumen es que cualquier entero se puede definir como

a = qn + r

donde todas estas letras son enteros, y

0 <= | r | <| n |.

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

Esto es porque 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 el entero de uso está en el alcance,"% "le da acceso directo al operador de módulo según lo implementado por su compilador C. Este operador no está tan bien definido para los operandos negativos, pero se ejecutará más rápido. "Entonces puede elegir cualquiera de las opciones para Perl (como C) si el entero de uso está dentro del alcance. Si el número entero de uso no está en el alcance, el manual dice "Si $ b es negativo, entonces $ a% $ b es $ a menos el múltiplo más pequeño de $ b que no es inferior a $ a (es decir, el resultado será menor o igual a cero). "