2011-11-06 12 views
11

Para ser claros, no estoy buscando NaN o infinito, o preguntando cuál debería ser la respuesta a x/0. Lo que estoy buscando es esto:¿Cuál es el resultado de dividir por cero?

Según cómo se realiza la división en el hardware (no sé cómo se hace), si la división se realiza con un divisor de 0, y el procesador simplemente se arrastra a lo largo felizmente a través de la operación, ¿qué saldría de ello?

Me doy cuenta de que esto es altamente dependiente del dividendo, entonces para una respuesta concreta, pregunto esto: ¿Qué escupiría una computadora si siguiera su operación de división estándar en 42/0?

Actualización:

Voy a tratar de ser un poco más claro. Pregunto sobre las operaciones reales hechas con los números en el nivel de bit para llegar a una solución. El resultado de la operación es solo bits. NaN y errores/excepciones entran en juego cuando se descubre que el divisor es cero. Si la división realmente sucediera, ¿qué partes saldrían?

+0

Fuera de tema: pertenece a http://math.stackexchange.com/ –

+5

NaN saldría.¿Creías que las computadoras ocultaban el resultado real de nosotros? – ceejayoz

+4

@AlastairPitts ¿Estás seguro? Dado que se trata de cómo manejaría un procesador la operación, parece más adecuado aquí que un sitio puramente matemático. – yoozer8

Respuesta

11

Podría no detener. La división de enteros puede llevarse a cabo en tiempo lineal mediante la resta repetida: durante 7/2, puede restar 2 de 7 un total de 3 veces, de modo que ese es el cociente, y el resto (módulo) es 1. Si tuviera que suministrar un dividendo de 0 a un algoritmo como ese, a menos que hubiera un mecanismo para prevenirlo, el algoritmo no se detendría: puede restar 0 a 42 un número infinito de veces sin llegar a ninguna parte.

Desde una perspectiva tipo, esto debería ser intuitivo. El resultado de un cálculo indefinido o uno que no se detiene es ⊥ ("abajo"), el valor indefinido que habita en cada tipo. La división por cero no está definida en los enteros, por lo que debería producir correctamente ⊥ al generar un error o al no finalizar. El primero es probablemente preferible. ;)

Otros algoritmos de división más eficientes (tiempo logarítmico) se basan en series que convergen al cociente; para un dividendo de 0, por lo que puedo decir, estos no convergerán (es decir, no terminarán) o producirán 0. Ver Division en Wikipedia.

La división de coma flotante también necesita un caso especial: dividir dos flotadores, restar sus exponentes y dividir enteros sus significands. El mismo algoritmo subyacente, el mismo problema. Es por eso que hay representaciones en IEEE-754 para infinito positivo y negativo, así como cero firmado y NaN (para 0/0).

+5

* Podría * llevarse a cabo mediante restas repetidas, pero no es en la práctica ... –

+0

@OliCharlesworth: Correcto. Estaba editando para agregar una nota sobre otros algoritmos. –

+0

Incluso con una división larga, el hardware terminará. Realizará un número fijo de etapas. –

8

Para los procesadores que tienen una instrucción "dividir" interna, como el x86 con div, la CPU realmente causa una interrupción del software si se intenta dividir por cero. Esta interrupción del software generalmente es capturada por el tiempo de ejecución del idioma y traducida en una excepción apropiada de "divide por cero".

+0

Esto no responde la pregunta como se le preguntó. –

+0

Sí, la pregunta ha sido editada desde mi respuesta. He hecho +1 en la tuya. –

2

Depende de la implementación. El punto flotante IEE estándar 754 [1] define los valores de infinito con signo, por lo que en teoría ese debería ser el resultado de dividir por cero. El hardware simplemente establece una bandera si el demoninador es cero en una operación de división. No hay magia para eso.

Algunas arquitecturas erróneas (leer x86) arrojan una trampa si alcanzan una división por cero que, en teoría, desde un punto de vista matemático, es una salida de cop.

[1] http://en.wikipedia.org/wiki/IEEE_754-2008

+0

No, "desde un punto de vista matemático" no puede dividir entre 0. NUNCA. Simplemente no está definido. Lo que llamamos "infinito" es un símbolo para representar un gran número arbitrario que es el resultado de dividir "algo" por casi 0 (pero no 0) – Alvaro

1

Sería un bucle infinito. Por lo general, la división se realiza a través de la resta continua, al igual que la multiplicación se realiza a través de la adición continua.

Por lo tanto, el cero es especial porque todos sabemos cuál es la respuesta.

+2

¿En serio? ¿Multiplicación y división son operaciones de tiempo lineal? –

1

Realmente escupiría una excepción. Matemáticamente, 42/0, no está definido, por lo que las computadoras no escupirán un valor específico a estas entradas. Sé que la división se puede hacer en hardware, pero el hardware bien diseñado tendrá algún tipo de indicador o interrupción para decirle que cualquier valor contenido en los registros que se supone que contienen el resultado no es válido. Muchas computadoras hacen una excepción de esto.

+2

Además, estoy escribiendo este comentario para evitar que alguien diga que 42/0 es realmente infinito. ¡BLASFEMIA! 42/X tiende a infinito cuando X tiende a 0, pero 42/0 no está definido. Gran diferencia. –

+0

Totalmente cierto, 42/x = oo es solo un símbolo para representar un gran número arbitrario: "El resultado crece a medida que x se acerca a 0" – Alvaro

5

Los divisores de hardware generalmente usan una estructura con tubería long division.

Suponiendo que estamos hablando de división de enteros por el momento (en lugar de coma flotante); el primer paso en la división larga es alinear los más significativos (antes de intentar restar el divisor del dividendo). Claramente, esto no está definido en el caso de 0, así que quién sabe qué haría el hardware. Si suponemos que hace algo sensato, el siguiente paso es realizar las restas de log (n) (donde n es el número de posiciones de los bits). Por cada resta que resulte en un resultado positivo, se establece un 1 en la palabra de salida. Entonces el resultado de este paso sería una palabra all-1s.

división de punto flotante requiere tres pasos:

  • tomando la diferencia de los exponentes
  • división de punto fijo de las mantisas
  • el manejo de casos especiales

0 está representado por todos-0 (tanto la mantisa como el exponente). Sin embargo, siempre hay una implícita 1 en la mantisa, por lo que si no tratamos esta representación como un caso especial, se vería y actuaría como una potencia extremadamente pequeña de 2.

+0

No me sorprendería que hubiera algunas máquinas donde una instrucción dividir por cero congelar la unidad de ejecución hasta que un circuito de temporizador de supervisión reconozca una falla. Agregar hardware para "limpiar" evitar que un intento de dividir por cero se atasque haría que una computadora sea más costosa, por lo que no me sorprendería si algunas máquinas no se molestaran. – supercat

-1

X/0 Donde X es un elemento de números reales y es mayor o igual a 1, por lo tanto la respuesta de X/0 = infinito.

método División (C#)

Int Counter = 0; /* used to keep track of the division */ 
Int X = 42;  /* number */ 
Int Y = 0;  /* divisor */ 
While (x > 0) { 
    X = X - Y; 
    Counter++; 
} 
Int answer = Counter; 
+0

"Estoy preguntando sobre las operaciones reales hechas con los números en el nivel de bits para llegar a una solución". -OP. – Nenotlep

1

en x86, interrumpir 0 se produce y los registros de salida son sin cambios

Minimal 16-bit ejemplo el modo real (que se añaden a un cargador de arranque, por ejemplo,):

movw $handler, 0x00 
    movw %cs, 0x02 
    mov $0, %ax 
    div %ax 
    /* After iret, we come here. */ 
    hlt 
handler: 
    /* After div, we come here. * 
    iret 

How to run this code in detail || 32-bit version.

La documentación de Intel para la instrucción DIV no dice que los registros de salida regulares (ax == resultado, dx == módulo) se modifican, por lo que creo que esto implica que no cambian.

Linux manejaría esa interrupción para enviar un SIGFPE al proceso que lo hizo, lo que es matarlo si no se maneja.

Cuestiones relacionadas