8000 Traducción del operador // (floor division) al español · Issue #2754 · python/python-docs-es · GitHub
[go: up one dir, main page]

Skip to content

Traducción del operador // (floor division) al español #2754

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
jcaalzago opened this issue Nov 26, 2023 · 7 comments
Closed

Traducción del operador // (floor division) al español #2754

jcaalzago opened this issue Nov 26, 2023 · 7 comments

Comments

@jcaalzago
Copy link
Contributor
jcaalzago commented Nov 26, 2023

En la documentación en español de Python se traduce el operador // y el término floor division como división entera.

Creo que la traducción del término no es adecuada y para que se entienda los motivos que tengo, lo argumento a continuación.

Nota: para no crear confusión, en esta argumentación, me referiré con el término en inglés floor division . En el último punto expongo una serie de opciones que creo que ayudarían a eliminar el problema que creo que tiene esa traducción (obviamente se admiten sugerencias).

Definiciones

División entera

El concepto de división entera implica que se cumple la siguiente igualdad:

Dividendo = divisor * cociente + resto

Teniendo en cuenta que:

  • todos los términos serán números enteros
  • el divisor no puede ser 0
  • y el resto estará comprendido en el rango (-divisor, divisor) (sin incluirlos, por eso el uso de paréntesis ( ) y no corchetes [ ])

Para que se entiendan los ejemplos, la notación usada para la división es la siguiente:
imagen

Algunos tipos de división entera

La división entera engloba distintos resultados, todas las siguientes implementaciones son correctas (hay más) y tienen cabida dentro de la definición:

  • floor division: en esta el signo del resto coincide con el signo del divisor. Para ello, el cociente de la división real se redondea al primer entero inferior poniendo como límite a menos infinito (aplicamos la función entera piso, suelo o floor) => math.floor(Dividendo / divisor) => int(Dividendo / divisor)
Ejemplos de división "floor division"

imagen

  • división euclídea: en esta el resto es no negativo y menor estricto que el divisor, 0 <= resto < |divisor| (resto >= 0 and resto < abs(divisor))
Ejemplos de división euclídea

imagen

  • división truncada: en esta el signo del resto coincide con el signo del Dividendo. Para ello, la división termina en el momento en el que habría que sacar decimales, o lo que es lo mismo, truncando (despreciando la parte fraccionaria) => math.trunc(Dividendo / divisor) => int(Dividendo / divisor)
Ejemplos de división truncada

imagen

Como podemos ver, de base usar únicamente división entera (sin ningún "apellido") a todas estas divisiones, resulta ambiguo, más que nada, porque todas son enteras. Es necesario especificar a qué tipo nos referimos. De usar una sin especificar el tipo, parece más razonable que la división entera fuera la última presentada (división truncada), porque en ella, al realizar la división a mano, no es necesario hacer ninguna operación extra para modificar ni el cociente, ni el resto, sale de forma natural al parar la división antes de obtener la parte fraccionaria.

"División entera" en la programación

En algunos lenguajes (no en Python)

En C
#include <stdio.h>

int main()
{
  printf(" 7 //  2 = %2d\t 7  %%  2 = %2d\n",  7 /  2,  7 %  2);
  printf(" 7 // -2 = %2d\t 7  %% -2 = %2d\n",  7 / -2,  7 % -2);
  printf("-7 //  2 = %2d\t-7  %%  2 = %2d\n", -7 /  2, -7 %  2);
  printf("-7 // -2 = %2d\t-7  %% -2 = %2d\n", -7 / -2, -7 % -2);

  return 0;
}
En C++
#include <iomanip>
#include <iostream>

using namespace std;

int main()
{

  cout << " 7 //  2 = " << setw(2) <<  7 /  2 << "\t 7  %  2 = " << setw(2) << 7 %  2 << endl;
  cout << " 7 // -2 = " << setw(2) <<  7 / -2 << "\t 7  % -2 = " << setw(2) << 7 % -2 << endl;
  cout << "-7 //  2 = " << setw(2) << -7 /  2 << "\t-7  %  2 = " << setw(2) <<-7 %  2 << endl;
  cout << "-7 // -2 = " << setw(2) << -7 / -2 << "\t-7  % -2 = " << setw(2) <<-7 % -2 << endl;

  return 0;
}
En Bash
echo -e " 7 //  2 =  `expr  7 /  2` \t 7 %  2 =  `expr  7 %  2`"
echo -e " 7 // -2 = ` expr  7 / -2` \t 7 % -2 =  `expr  7 % -2`"
echo -e "-7 //  2 = ` expr -7 /  2` \t-7 %  2 = ` expr -7 %  2`"
echo -e "-7 // -2 =  `expr -7 / -2` \t-7 % -2 = ` expr -7 % -2`"
En Java
public class Main
{
    public static void main(String[] args) {
  	  System.out.println(" 7 //  2 =  " + ( 7 /  2) + "\t 7 %  2 =  " + ( 7 %  2));
  	  System.out.println(" 7 // -2 = "  + ( 7 / -2) + "\t 7 % -2 =  " + ( 7 % -2));
  	  System.out.println("-7 //  2 = "  + (-7 /  2) + "\t-7 %  2 = "  + (-7 %  2));
  	  System.out.println("-7 // -2 =  " + (-7 / -2) + "\t-7 % -2 = "  + (-7 % -2));
    }
}
En PHP
<?php

echo " 7 //  2 =  " . intdiv( 7,  2) . "\t  7 %  2 =  " . ( 7 %  2) . "\n";
echo " 7 // -2 = "  . intdiv( 7, -2) . "\t  7 % -2 =  " . ( 7 % -2) . "\n";
echo "-7 //  2 = "  . intdiv(-7,  2) . "\t -7 %  2 = "  . (-7 %  2) . "\n";
echo "-7 // -2 =  " . intdiv(-7, -2) . "\t -7 % -2 = "  . (-7 % -2) . "\n";
En Pascal
program Prueba;
begin
  writeln (' 7 //  2 =  ',  7 div  2, ''#9' 7 %  2 =  ', 7 mod  2);
  writeln (' 7 // -2 = ' ,  7 div -2, ''#9' 7 % -2 =  ', 7 mod -2);
  writeln ('-7 //  2 = ' , -7 div  2, ''#9'-7 %  2 = ' ,-7 mod  2);
  writeln ('-7 // -2 =  ', -7 div -2, ''#9'-7 % -2 = ' ,-7 mod -2);
end.

En todos estos lenguajes de programación (o de comandos, según el caso) la salida del programa es (en esta salida // representa a la división truncada (hacia 0) y % al módulo):

 7 //  2 =  3     7 %  2 =  1
 7 // -2 = -3     7 % -2 =  1
-7 //  2 = -3    -7 %  2 = -1
-7 // -2 =  3    -7 % -2 = -1

Es decir, en todos los ejemplos puestos, todos realizan la "división entera" como división truncada.

En Python

En cambio en Python (a partir de la versión 2.2 pep-0238/, versión en la que se crea el operador // ) el código usando el dicho operador (//) y el del módulo (%) (que siempre es coherente con la división aplicada), sería el que sigue:

En Python
print (' 7 //  2 = ',  7 //  2, '\t 7 %  2 = ', 7 %  2)
print (' 7 // -2 =' ,  7 // -2, '\t 7 % -2 =' , 7 % -2)
print ('-7 //  2 =' , -7 //  2, '\t-7 %  2 = ',-7 %  2)
print ('-7 // -2 = ', -7 // -2, '\t-7 % -2 =' ,-7 % -2)

Y la salida es la siguiente:

 7 //  2 =  3    7 %  2 =  1
 7 // -2 = -4    7 % -2 = -1
-7 //  2 = -4   -7 %  2 =  1
-7 // -2 =  3   -7 % -2 = -1

En este caso Python realiza la "división entera" como floor division.

Con esto no quiero decir que no haya más lenguajes que utilicen este criterio para la "división entera", ni que sea o no un buen criterio para el operador, simplemente que al traducirlo como "división entera", a los que vienen de alguno de los lenguajes que he comentado, la confusión está casi garantizada.

Seguimos en Python (biblioteca decimal)

En la biblioteca decimal tenemos que el operador // y % funcionan de forma distinta. Pego un extracto de la documentación de dicha biblioteca:
imagen

Es decir, que el siguiente código en Python:
from decimal import Decimal

print ('Decimal( 7) // Decimal( 2) = ', Decimal( 7) // Decimal( 2), '\tDecimal( 7) % Decimal( 2) = ', Decimal( 7) % Decimal( 2))
print ('Decimal( 7) // Decimal(-2) =' , Decimal( 7) // Decimal(-2), '\tDecimal( 7) % Decimal(-2) = ', Decimal( 7) % Decimal(-2))
print ('Decimal(-7) // Decimal( 2) =' , Decimal(-7) // Decimal( 2), '\tDecimal(-7) % Decimal( 2) =' , Decimal(-7) % Decimal( 2))
print ('Decimal(-7) // Decimal(-2) = ', Decimal(-7) // Decimal(-2), '\tDecimal(-7) % Decimal(-2) =' , Decimal(-7) % Decimal(-2))

Produce esta salida:

Decimal( 7) // Decimal( 2) =  3 	Decimal( 7) % Decimal( 2) =  1
Decimal( 7) // Decimal(-2) = -3 	Decimal( 7) % Decimal(-2) =  1
Decimal(-7) // Decimal( 2) = -3 	Decimal(-7) % Decimal( 2) = -1
Decimal(-7) // Decimal(-2) =  3 	Decimal(-7) % Decimal(-2) = -1

La misma salida que producen en otros lenguajes, es decir, como división truncada.
Lo cual hace todavía más confuso usar de nuevo "división entera" para el mismo operador.

Resumen

  • A las personas que aprenden a programar antes que en Python en alguno (y más) de los lenguajes que he comentado arriba, el hecho de leer en la documentación en español el termino "división entera" como traducción de "floor division" o //, lleva directamente a equívoco. Seguramente hasta que no vea que no funciona como espera, no se va a percatar de que realmente se trata de un operador distinto al que está acostumbrado.
  • En la documentación en inglés no existe esta ambigüedad, porque directamente al operador lo llaman floor division , quedando bien claro qué hace.
  • Existe ambigüedad si usamos dentro de Python el mismo nombre para el operador usado entre objetos decimal o entre enteros (y flotantes).

Propuesta

  1. Cambiar la traducción del término floor division y del operador // en un contexto distinto de la biblioteca decimal por una de las siguientes opciones (se admiten sugerencias):
  • división piso o suelo (no las separaría, porque creo que dependiendo de la zona del lector se entiende mejor uno u otro)
  • división a la baja (redondeado a la baja)
  • división entera a la baja
  • ...
  1. Cambiar la traducción del término floor division y del operador // en el contexto de la biblioteca decimal por una de las siguientes opciones (se admiten sugerencias):
  • división truncada
  • división entera truncada
  • ...
  1. Añadir la traducción del término floor division y del operador // a la memoria de traducción (añadiendo la distinción de cuando se traduce en la biblioteca decimal o en otros contextos.

Bueno, creo que ya está bien XD.

Gracias si has llegado hasta aquí XD

@cacrespo
Copy link
Collaborator

Muchas gracias @jcaalzago por el detalle. Voy a tomarme unos días para pensarlo detenidamente y compartir mis impresiones.
Más allá de lo que definamos estoy seguro que esto ya ha tenido impacto positivo en varios de la comunidad (de mínima aprendimos cosas nuevas :P )

@jcaalzago
Copy link
Contributor Author

Muchas gracias por la respuesta @cacrespo :)

@cacrespo
Copy link
Collaborator
cacrespo commented Dec 4, 2023

Hola @jcaalzago! Acabo de repasar en detalle el issue y definitivamente pienso que tenemos que hacer algo...

Gracias a la maravilla de find_in_po.py veo que en muchos lugares está traducido como "división de piso", "división de suelo", "división de redondeo" ¿?

Dado que como mencionás

usar únicamente división entera (sin ningún "apellido") a todas estas divisiones, resulta ambiguo,

pienso que deberíamos agregarle el "apellido". Por un lado, garantiza que cualquiera que tenga el concepto "mal aprendido" rápidamente puede asociarlo y por el otro, no perdemos precisión conceptual.

Entonces, retomando tus propuestas... me inclino por:

  • Cambiar la traducción del término floor division y del operador // en un contexto distinto de la biblioteca decimal por división entera a la baja
  • No tocar lo de la biblioteca Decimal. Arrancar por dar coherencia a "floor division" (en Decimal, es otra cosa). En todo caso más adelante revisar en profundidad ese módulo.
  • Añadir la traducción del término floor division y del operador // a la memoria de traducción (añadiendo la distinción de cuando se traduce en la biblioteca decimal o en otros contextos).

Si tienes ganas podemos encarar todo este trabajo juntos. Obviamente, primero busquemos más feedback y aprobación del resto del grupo.

@jcaalzago
Copy link
Contributor Author

Hola @cacrespo , me parece razonable la propuesta. Gracias.

Respecto a lo de encarar todo el trabajo juntos, claro que sí, me gustaría mucho :).

Y claro, buscando antes el respaldo de la comunidad, como comentas.

Gracias por todo

@Sublian
Copy link
Contributor
Sublian commented Dec 4, 2023

@jcaalzago excelente contribución, en mi caso aprendí con C++ y como mencionas crea cierta confusión dado que no se ven los mismos resultados.
Me agrada la opción división a la baja.
Espero más personas puedan dar sus ideas.

@jcaalzago
Copy link
Contributor Author

@jcaalzago excelente contribución, en mi caso aprendí con C++ y como mencionas crea cierta confusión dado que no se ven los mismos resultados.
Me agrada la opción división a la baja.
Espero más personas puedan dar sus ideas.

¡¡Muchas gracias @Sublian !!

@jcaalzago
Copy link
Contributor Author

Al final aceptado el cambio de floor division por división entera a la baja, se ejecutan los cambios en la issue 2797

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants
0