If you're seeing this message, it means we're having trouble loading external resources on our website.

Si estás detrás de un filtro de páginas web, por favor asegúrate de que los dominios *.kastatic.org y *.kasandbox.org estén desbloqueados.

Contenido principal

Límites de números, desbordamiento y redondeo

Cuando los programas de computadora almacenan números en variables, la computadora debe tener una manera de representar ese número en su memoria. Las estrategias son diferentes de acuerdo a si un número es entero o no. Debido a limitaciones en la memoria de computadoras, los programas a veces encuentran problemas con redondeo, desbordamiento, o precisión de variables numéricas.

Representación entera

Un entero es cualquier número que puede escribirse sin una parte fraccional. El mismo término se usa tanto en programación como en matemáticas, así que esperamos que esto te sea familiar.
Todos estos números son enteros: 120, 10, 0, 20.
¿Cómo puede un lenguaje de programación representar esos enteros en la memoria de la computadora? Bueno, las computadoras representan todos los datos con bits, así que al final cada uno de esos números es una secuencia de 0s y 1s.
Como un inicio simple, imaginemos una computadora que utiliza solo 4 bits para representar enteros. Puede usar el primer bit para representar el signo del entero, positivo o negativo, y los otros 3 bits para el valor absoluto.
En ese sistema, el número 1 se representa así:
0001
+/-421
signo222120
El 0 en el signo de bits representa un número positivo, y el 1 en el bit más a la derecha representa el valor en la la posición 20 (1).
¿Cuál es el número más grande que puede representarse en este sistema? Llenemos todos los bits con valor 1 y veamos:
0111
+/-421
signo222120
Ese es el número positivo 7, pues 22+21+20=(4+2+1)=7.
Comprueba tu comprensión
Considera una computadora que usa 6 bits para representar enteros: 1 bit para el signo y 5 bits para el número. ¿Cuál es el entero positivo más grande que puede representar?
  • Tu respuesta debe ser
  • un entero, como 6
  • una fracción propia simplificada, como 3/5
  • una fracción impropia simplificada, como 7/4
  • un número mixto, como 1 3/4
  • un decimal exacto, como 0.75
  • un múltiplo de pi, como 12 pi o 2/3 pi

Desbordamiento

¿Qué pasaría si ejecutáramos el siguiente programa en la computadora de 4-bits, donde el entero positivo más grande es 7?
var x = 7;
var y = x + 1;
La computadora puede almacenar la variable x sin problemas, pero y es uno más que el entero más grande que puede representarse con 4 bits. En un caso como éste, la computadora podría reportar un "error de desbordamiento" o mostrar un mensaje como "número es demasiado grande". También puede truncar el número (limitar todos los resultados a 7) o envolver el número (8 se convierte en 0).
No queremos llegar a ninguna de estas situaciones, por lo que es importante que conozcamos las limitaciones de nuestro lenguaje y entorno a la hora de escribir programas.
Comprueba tu comprensión
En una computadora que usa 6 bits para representar enteros (con 1 bit para el signo), ¿cuál de las siguientes operaciones da por resultado un desbordamiento?
Elige todas las respuestas adecuadas:

Afortunadamente, la mayoría de las computadoras modernas usan arquitecturas de 64 bits que pueden almacenar enteros increíblemente grandes. En JavaScript, el entero más grande que puede almacenarse de manera segura es 9,007,199,254,740,992, equivalente a 2521. Más allá de este, llegamos a la zona de peligro.
✏️ ¡Juega en la zona de peligro a continuación! JavaScript no muestra errores de desbordamiento, pero hace algunas otras cosas extrañas.
📝 Mira código similar en: App Lab | Snap | Python

Representación de punto flotante

Hemos visto que hay limitaciones para almacenar enteros en una computadora. Los números que no son enteros, como fracciones y números irracionales, son aún más complicados de representar en la memoria de la computadora.
Considera números como 2/5, 1.234, 9.999999 o el famoso e interminable π.
Los lenguajes de computadora suelen usar representación de punto flotante para los no-enteros (y a veces también para los enteros). Es similar a la "notación científica", una representación que quizá conoces de otras materias.
En la representación de punto flotante, un número se multiplica por una base que se eleva a un exponente:
300=3×10base2exponente
Dado que las computadoras usan el sistema binario en vez del sistema decimal, la base para números de punto flotante es 2 en vez de 10. Por eso, los números que son exactamente potencias de 2 son los más fáciles de representar:
128=1×27256=1×28
Los números entre potencias de 2 se ven así:
160=1.25×27192=1.50×27224=1.75×27
¿Qué pasa con los no-enteros? Una vez más, las potencias de 2 son las más fáciles de representar.
0.50=1×210.25=1×22
El punto flotante también puede representar fracciones entre potencias de 2:
0.750=1.5×210.375=1.5×22
Una vez que la computadora determina la representación de punto flotante para un número, lo almacena en bits. Las computadoras modernas usan un sistema de 64 bits que usa 1 bit para el signo, 11 bits para el exponente y 52 bits para el número al frente.
Aquí está 0.375 en esa representación binaria de punto flotante:
11,111,111,011,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
La traducción exacta a bits es más complicada que lo que podemos ver aquí, pero es un gran tema para quienes quieran estudiarloa más a fondo.

Errores de redondeo

Sin embargo, la representación de punto flotante no puede representar por completo todos los números. Considera la fracción 1/3 y su representación de punto flotante:
1/3=1.3×22
En binario, .3 sigue siendo una secuencia de repetición infinita:
101,010,101…
¡No podemos almacenar una secuencia infinita en una computadora! En algún momento la computadora debe terminar el número de alguna manera, ya sea cortándolo o redondeándolo al número de punto flotante más cercano. Las computadoras tienen que hacer ésto con frecuencia, ya que aún fracciones exactas como 1/10 (que es 0.1 corto en decimal) terminan como secuencias repetidas infinitas al convertirse a binario.
Con frecuencia no notamos la precisión reducida de la representación de un número hasta que lo usamos en cálculos. Ahí es cuando podemos experimentar un error de redondeo en los resultados.
✏️ Aquí tienes un programa que intenta sumar 0.1+0.1+0.1. Fuera del mundo de las computadoras, sabemos que ésto da 0.3. Pero en la computadora, cada uno de los valores 0.1 se almacena como una fracción binaria redondeada, y cuando las sumas, no es igual a lo que esperábamos…
📝 Mira código similar en: App Lab | Snap | Python
Entre mas bits podamos usar, más precisos serán nuestros números y cálculos. Los sistemas modernos de 64 bits ofrecen una precisión suficientemente alta para cálculos de bajo riesgo.
Tal vez en algún momento de tu vida, te escribirás un programa que calcule resultados de votaciones, controle un auto que se maneja a sí mismo, o incluso que lance un cohete. Cuando lo que está en juego es muy importante, la precisión importa.

🙋🏽🙋🏻‍♀️🙋🏿‍♂️¿Tienes alguna pregunta sobre este tópico? Nos encantaría contestarte; ¡simplemente pregunta en el area de preguntas abajo!

¿Quieres unirte a la conversación?

  • Avatar sneak peak purple style para el usuario J.
    Nota: Los entero; son números son aquellos que en la recta numérica no son representados con fracciones. En el código binario los limites se encuentran en potencias de 2, como lo vimos antes, pero cuando se sobrepasa este limite, el ordenador tiende a tener problemas leyéndolo, por eso es importante tener en cuenta los limites. En las fracciones y redondeos las cosas se complican un poco, ya que el ordenador no puede almacenar secuencias infinitas, para esto se redondea al numero mas cercano del decimal para ello y para las fracciones en binario hay ciertas maneras para hacer que aparezcan siendo esta la multiplicación de decimales por potencias de 2.
    (3 votos)
    Avatar Default Khan Academy avatar para el usuario
  • Avatar blobby green style para el usuario Hugo Ariel Hernandez
    Dado que las fracciones son más exactas no hay una forma para que las computadoras hagan cálculos con fracciones en lugar de punto flotante?
    (1 voto)
    Avatar Default Khan Academy avatar para el usuario
  • Avatar blobby green style para el usuario Mactus
    Hay alguna forma en la que le indiquemos a la computadora que redondee algunos numeros y otros no? por ejemplo que redondee 1|3 pero no 0.1, para que la suma sea mâs precisa
    (1 voto)
    Avatar Default Khan Academy avatar para el usuario
  • Avatar starky seedling style para el usuario anuelguzmancr7
    ¿Podemos eliminar la precisión de alguna forma? o sea, si en un programa hacemos una operación, tal que nos dé un número exacto, podemos eliminar esa imprecisión haciendo que la precisión sea con menos cifras significativas?
    (1 voto)
    Avatar Default Khan Academy avatar para el usuario
  • Avatar blobby green style para el usuario marcermora
    me gustaria saber porque, esto 0.375 se representa asi 11,111,111,011,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
    (1 voto)
    Avatar Default Khan Academy avatar para el usuario
¿Sabes inglés? Haz clic aquí para ver más discusiones en el sitio en inglés de Khan Academy.