¿Se puede implementar la división de puntos fijos utilizando un divisor que genere cociente y resto?

0

Por lo que he visto, la división es una operación muy costosa en términos de tiempo o área (compensación). Generalmente se implementa como una operación de resta continua de un número de otro número para obtener los bits de cociente.

Si bien entiendo cómo se implementan la suma, la resta y la multiplicación, existe cierta confusión en torno a la división. Tengo 3 preguntas interrelacionadas.

P1: Si la división es simplemente una recursión de restas hasta que nos quede el resto, ¿cómo se obtendría una salida de punto fijo, es decir, una salida con partes enteras y fracciones; ya que un cociente de enteros representa cuántas veces hicimos la resta en un bucle.

P2: ¿Cómo se lidiaría con los números decimales recurrentes como cociente? Supongo que a través del redondeo, es decir, no nos importa si el resultado es un decimal recurrente o no, solo calculamos el resultado a ciertos dígitos de la parte fraccionaria.

P3: siempre que tenga un IP divisor que genere el resto y el cociente, ¿cómo obtendré la parte fraccionaria de la salida ya que el resto no es realmente igual a la parte fraccionaria?

    
pregunta quantum231

1 respuesta

1

No sé nada acerca de ese bloqueo de IP. Pero como aún no tienes una mejor respuesta (la mía no será tan buena), te ofreceré algunos consejos generales. Me basaré en algunas suposiciones vagas que haré:

  • Puede definir el ancho del numerador y el denominador, por separado.
  • Puede definir el ancho del cociente y el resto, por separado.

Por lo general, normalizo tanto el numerador como el denominador usando una palanca de cambios antes de cualquier división. Esto cuenta la cantidad de turnos requeridos y los guardo a un lado. Como resultado de este paso: \ $ 2 \ cdot denominator > numerador \ ge \ tfrac {1} {2} \ cdot denominador \ $.

Suponga que los bits significativos de su numerador son del mismo tamaño que el denominador. Pero también considere un ancho de numerador para el bloque de IP que es el doble del tamaño del denominador. El numerador normalizado anterior se coloca en la mitad superior del bus de doble ancho. Usted hace una comparación. Si el denominador es más grande, desplace el numerador ampliado un bit hacia abajo. Esto garantizará que su cociente se ajuste al mismo ancho que el denominador.

El resultado de lo anterior es que el ancho del bus del numerador es el doble que el de los otros tres. Un numerador entrante se coloca en la mitad superior, pero puede desplazarse hacia abajo un bit. Tanto el numerador como el denominador están normalizados, antes de la división.

Pero digamos que no usa una palanca de cambios de barril y no le importa normalizarse. Luego considere establecer el ancho del numerador del bloque de IP al doble del ancho de los otros tres. Su numerador externo luego pasa a la mitad superior de ese ancho (cambio de carril) y los ceros siempre van a la mitad inferior (optimice la lógica para ese caso).

Luego, la parte fraccionaria simplemente usa el mismo divisor, pero ahora toma el resto resultante y divídelo por el divisor original que usaste anteriormente.

Realmente no has proporcionado suficiente información Y también soy ignorante de tu bloqueo de IP. Así que eso es lo mejor que puedo ofrecer. Con suerte, alguien más lo hará mejor.

    
respondido por el jonk

Lea otras preguntas en las etiquetas