Hay una dificultad en la división que todos los lenguajes de programación que admiten la división comparten: se debe tomar una decisión de diseño para tratar una expresión como un número entero 7 dividido por un número entero 3 que podría escribir un programador. ¿Lo que debe hacerse?
En primer lugar, uno debe darse cuenta de que desde el comienzo de las computadoras electrónicas, podrían manejar enteros. Si los únicos números que maneja una computadora son enteros pero los valores no enteros necesitan ser manipulados, el programador tiene que pasar por algunas contorsiones para escalar los números mentalmente, de modo que cuando la computadora manipula enteros, el programador aplica una escala mental al entradas, cálculos intermedios y salidas para que el programador piense en estos valores como números reales (en realidad, un subconjunto muy restringido de los mismos). Es muy incómodo y muy fácil cometer errores. (Tengo experiencia personal en el manejo de dicha programación).
El concepto de aritmética de punto flotante se desarrolló para permitir trabajar mucho más convenientemente con valores no enteros, así como con valores enteros mucho más grandes (pero redondeados a alguna aproximación) que la aritmética entera nominal podría manejar. La aritmética de coma flotante usa un formato bastante similar a la notación científica, y el punto decimal (en realidad binario) podría “flotar” a través de la mantisa ajustando el valor de un exponente de potencia de 2 (no 10). Esto tuvo la consecuencia de que un valor entero como 3 tendría dos representaciones bastante diferentes, una si se manipulara con aritmética de enteros y otra si se manipulara con aritmética de punto flotante, y no se permitía mezclar y combinar. Dos valores que debían combinarse (sumados, restados, multiplicados y, si están disponibles, divididos) tenían que ser tanto una representación entera como una representación de punto flotante, por lo que se proporcionó la conversión de cada tipo al otro.
¿Cómo saber si su 7 es tratado como un número entero (en el sentido de Python, por supuesto, es matemáticamente) o de punto flotante? Si hay un punto para un punto decimal en cualquier parte de cómo se escribe el 7 (como 7. o 7.0) o hay un campo de exponente con una e o E (como 7e0) o ambos (como 7.E0), es un punto flotante 7; de lo contrario es un entero 7.
- Cómo integrar (ax + b) / (cx + d) ^ 2
- ¿Qué son los sistemas criptográficos que codifican una clave secreta A a B, usan B para cifrar C y luego requieren A para descifrar C?
- Cómo calcular [matemáticas] \ displaystyle \ lim_ \ limits {n \ to \ infty} \ {(\ sqrt {5} +2) ^ n \} \ cos \ pi \ lfloor \, (\ sqrt {5} +2 ) ^ n \ rfloor \ [/ math] donde [math] \ {x \} [/ math] denota la parte fraccional de [math] \, x [/ math] y [math] \ lfloor x \ rfloor [/ math ] denota la función de piso
- ¿Qué es [math] \ lim_ {x \ to- \ infty} \ left (x + \ sqrt {x ^ 2 + 6x + 2} \ right) [/ math]?
- ¿Qué es 5?
La suma, la resta y la multiplicación son sencillas: combinar dos enteros y un resultado entero, no es gran cosa. Se aplica un comportamiento paralelo para valores de punto flotante. La división es mucho más difícil filosóficamente. Si tiene un número entero 7 que desea dividir por un número entero 3, cuyo verdadero resultado matemático sería [matemática] 2 \ frac {1} {3} ≈ 2.333 [/ matemática], ¿prefiere preservar el tipo y perder? cierta precisión al proporcionar una respuesta de un número entero 2, o prefiere preservar la precisión tanto como sea posible, pero estamos dispuestos a que el resultado sea de punto flotante (2.333 aproximadamente) a pesar de que los operandos son enteros? (Algunos lenguajes ofrecen otra alternativa de devolver un par entero que es un numerador y denominador de una fracción reducida si la división no tiene un resultado entero matemáticamente). Python le da la opción de decir lo que prefiere:
El operador de división de doble barra toma dos enteros, realiza una división de enteros con un resultado entero para el cociente, tirando el resto, por lo que 7 // 3 produce el entero 2. El mismo proceso ocurre cuando el primer operando es divisible por el segundo: 2 // 2 produce el número entero 1. El operador // también puede tomar operandos de punto flotante, y ocurre el mismo proceso, solo en el mundo de punto flotante, entonces 7.0 // 3.0 produce 2.0. El resultado debe tener un valor entero, pero puede ser una representación entera o una representación de punto flotante, según los tipos de operandos.
El operador de división de barra simple, dados dos operandos, convierte cualquier operando entero en punto flotante y luego realiza la división como punto flotante, por lo que 7/3 produce el punto flotante 2.333 (sin importar muchos dígitos de precisión, y es finito, flotante -división de puntos proporciona). El mismo proceso ocurre cuando el primer operando es divisible por el segundo: 2/2 produce el punto flotante 1.0.
Esta explicación está muy simplificada, destinada a estar al nivel de la pregunta publicada. Hay algunas advertencias, que espero que algunos expertos de Python estén preocupados:
* Hay dos tipos enteros distintos en Python, comúnmente referidos a enteros simples y enteros largos. Esto es cierto e importante para algunas discusiones, pero no esta.
* El operador / realmente no “tira el resto”, se trunca. Sí, tiene razón en que “truncar” es técnicamente una palabra más precisa. La pregunta publicada está al nivel de un novato relativo. En ese nivel, “truncar” conlleva una connotación cotidiana de tirar el resto, y es poco probable que el novato esté íntimamente familiarizado con las sutilezas de la división con un operando positivo y un operando negativo, por lo que el cociente se evalúa como el mayor entero. menor o igual que el cociente matemático, de modo que 7 // 3 rinde 2, (-7) // 3 rinde -3 y -7 // 3 rinde -2. Las expresiones en la pregunta publicada solo involucraban operandos positivos, y deseaba centrarme en el tema específico en cuestión y no complicarlo arrastrando y mezclándome con otras fuentes de confusión.