¿Cómo ocurre la división en nuestras computadoras?

17

¿Cómo ocurre la división dentro de las computadoras digitales? ¿Cuál es el algoritmo para ello?

He buscado mucho en google pero no he obtenido resultados satisfactorios. Proporcione un algoritmo / diagrama de flujo muy claro para el algoritmo de división con una ilustración de muestra.

programa-o-steve
fuente
1
@ program-o-steve Division en una ALU es una operación compleja. No obtendrá un diagrama de flujo "simple".
Majenko
55
@ Leon Heller ¡Oh! No lo dice. Esta es una pregunta pura de hardware
program-o-steve
2
@ Leon Heller, supongo que no es ..., que incluye electrónica, informática física ...
program-o-steve
2
La división en microcontroladores no es sencilla. Hay formas rápidas y lentas de hacerlo. Las formas lentas son más fáciles de entender, pero las formas más rápidas se utilizan en las CPU modernas, ¿qué es lo que quieres saber específicamente? ¿Desea una comprensión básica de los principios o un análisis detallado de las CPU modernas?
Konsalik
44
@LeonHeller Generalmente estoy de acuerdo con las preguntas que desea cerrar, pero el diseño de la CPU es en gran medida una pregunta de ingeniería eléctrica. Esta pregunta podría usar algo de ayuda para aclarar mucho más lo que se quiere (como lo que pregunta Konsalik), pero eso no lo hace fuera de tema.
Kellenjb

Respuestas:

17

Los algoritmos de división en diseños digitales se pueden dividir en dos categorías principales. División lenta y división rápida.

Le sugiero que lea sobre cómo funcionan la suma y resta binarias si aún no está familiarizado con estos conceptos.

División lenta

Los métodos lentos más simples funcionan de la siguiente manera: reste el denominador del numerador. Haga esto de forma recursiva con el resultado de cada resta hasta que el resto sea menor que el denominador. La cantidad de iteraciones es el cociente entero, y la cantidad restante es el resto.

Ejemplo:

7/3:

  1. 73=4
  2. 43=1
  3. 1<3

Por lo tanto, la respuesta es 2 con un resto de 1. Para hacer que esta respuesta sea un poco más relevante, aquí hay algunos antecedentes. La sustracción binaria mediante la suma del negativo se realiza, por ejemplo: 7 - 3 = 7 + (-3). Esto se logra utilizando el complemento de sus dos. Cada número binario se agrega usando una serie de sumadores completos:

ingrese la descripción de la imagen aquí

Donde cada sumador completo de 1 bit se implementa de la siguiente manera:

ingrese la descripción de la imagen aquí

División rápida

Si bien el método de división más lento es fácil de entender, requiere iteraciones repetitivas. Existen varios algoritmos "rápidos", pero todos se basan en la estimación.

Considere el método Goldschmidt:

Q=Nre

Este método funciona de la siguiente manera:

  1. Multiplique N y D con una fracción F de tal manera que D se acerque a 1.
  2. Cuando D se acerca a 1, N se acerca a Q

Este método usa la multiplicación binaria mediante la suma iterativa, que también se usa en las CPU AMD modernas.

Konsalik
fuente
1
Algunos diagramas de flujo para variaciones en el método 'lento' (implementado en ensamblado en micros sin división de hardware, pero aún útil) se encuentran en la nota AVR200 de Atmel .
Kevin Vermeer
¿Puede dar una ilustración sobre el método de división Goldschmidt? ¿También el diagrama de flujo dado aquí es un ejemplo de división lenta?
program-o-steve
¿Cuál es ese método en el que tenemos que cambiar repetidamente el dividendo a la izquierda?
program-o-steve
@ program-o-steve Aquí hay una ilustración rápida: encuentre 22/7 (aproximación pi). Primero, multiplique arriba y abajo por 0.1 para obtener: 2.2 / 0.7 Multiplique nuevamente, usando 1.3, dando: 2.86 / 0.91 Usando 1.09 da: 3.1174 / 0.9919 1.008 da: 3.1423393 / 0.9998352 Continúe, pronto llegará a RESPUESTA FINAL 3.1428571 / 1.000000 ...
Alan Campbell
¿Cómo se "multiplica por una fracción"? Las fracciones no son representables en coma flotante. Una fracción por definición es un numerador dividido por el denominador, por lo que te queda un argumento circular de que aún tienes que dividir. ¿Y cómo se estima esa fracción en primer lugar?
CogitoErgoCogitoSum
4

El hardware para la división de punto flotante es parte de una unidad lógica que también multiplica; Hay un módulo de hardware multiplicador disponible. Los números de coma flotante, digamos A y B, se dividen (formando A / B) por

  1. descomponer los números de coma flotante en signos (+1 o -1), mantisa ("a" y "b", y exponentes (tipo entero binario)
  2. el signo del resultado es (+1) si ambos signos son iguales, de lo contrario (-1)
  3. los exponentes se restan (el exponente de B se resta del exponente de A) para formar el exponente del resultado
  4. Las mantisas (los dígitos binarios de los números) son un número binario de punto fijo entre 1/2 y 1; eso significa que el primer dígito después del punto binario es '1', seguido de ceros y unos ... como primer paso, una tabla de búsqueda encuentra el recíproco exacto a seis bits (solo hay 32 posibilidades, es una tabla pequeña)

  5. ab=areciprocal(b)breciprocal(b)
    y tenga en cuenta que la precisión de seis bits implica que el denominador del resultado está muy cerca de 1 (a cinco o más lugares binarios).

  6. re==1+ϵ
    re(2-re)=(1+ϵ)×(1-ϵ)=1-ϵ2
    Esto implica que nuestro 'uno' exacto de cinco bits en el denominador será exacto a diez bits después de un par más de multiplicaciones, exacto a veinte bits después de dos y exacto a cuarenta bits después de tres. Haga tantas iteraciones de multiplicar numerador y denominador por (2 - denominador) como lo requiera la precisión de su resultado.
  7. El numerador, ahora que el denominador es exactamente '1', es la mantisa del resultado y se puede combinar con el signo y exponente previamente calculado.
  8. El punto flotante IEEE permite algunas excepciones (números desnormalizados, NAN; esos deben ser manejados por otras operaciones lógicas.

Curiosamente, el viejo error de división Pentium (muy interesante en 1994) fue causado por un error de impresión que hizo que los valores de la tabla recíproca fueran incorrectos para el paso (4). Un artículo temprano, "Un método de división usando un multiplicador paralelo", Domenico Ferrari, IEEE Trans. Electrón. Comput EC-16 / 224-228 (1967), describe el método, al igual que "El Sistema IBM / 360 Modelo 91: Unidad de Ejecución de Punto Flotante" IBM J. Res. Dev. 11 : 34-53 (1967).

Whit3rd
fuente
1

Existen métodos muy diferentes para la división, dependiendo de los números a manejar. Para enteros, el método shift-and-sustract dado por otros funcionará bien. Sin embargo, para los números de coma flotante, puede ser más rápido calcular primero el recíproco del denominador y luego multiplicarlo por su numerador.

El cálculo del recíproco del denominador no es tan malo; Se realiza mediante el refinamiento de aproximaciones sucesivas. Deje que g sea su suposición para 1 / d. Para una suposición mejorada, use g '= g (2-gd). Esto converge cuadráticamente, por lo que duplica los dígitos de precisión en cada mejora.

Ejemplo: calcular el recíproco de 3.5.

Su conjetura inicial es 0.3. Calcula 0.3 * 3.5 = 1.15. Su conjetura ajustada es 0.3 * (2 - 1.15) = 0.285. Ya muy cerca! Repita el proceso y obtendrá 0.2857125, y un tercer intento obtendrá 0.2857142857.

Hay algunos atajos. En coma flotante, puede extraer potencias de diez o potencias de dos, dependiendo de la base numérica de su máquina. Y, para la velocidad a expensas de un mayor uso de memoria, puede usar una tabla precalculada para números en el rango de 1 a b (donde b es su base de números) para obtener una suposición que esté inmediatamente cerca del recíproco requerido y guardar uno o dos pasos de refinamiento.

Tenga en cuenta que, al igual que con la multiplicación y la vergüenza de Kolmogorov en 1960 por su alumno Anatoly Karatsuba, nunca se sabe cuándo se encontrará un método más rápido o mejor. Nunca rindas tu curiosidad.

richard1941
fuente
-1

Las computadoras no hacen una suma iterativa para multiplicar números, sería realmente lento. En cambio, hay algunos algoritmos de multiplicación rápida. Echa un vistazo: http://en.wikipedia.org/wiki/Karatsuba_algorithm

usuario59608
fuente
Bienvenido a EESE. Se desaconsejan las respuestas de solo enlace. Resume la información en el enlace.
Nulo
Ellas hacen. Toneladas de CPU aún no tienen multiplicadores de ciclo único y utilizan la multiplicación de software.
user3528438