12
votes

Quel est le résultat de la division par zéro?

Pour être clair, je ne cherche pas NaN ou Infinity, ni demander quelle est la réponse à x / 0 devrait être. Ce que je cherche, c'est ce:

Basé sur la manière dont la division est effectuée dans le matériel (je ne sais pas comment cela est fait), si la division devait être effectuée avec un diviseur de 0, et le processeur vient de déchirer avec bonheur grâce à l'opération, que sortirait de ça?

Je me rends compte que cela dépend fortement du dividende, donc pour une réponse concrète, je pose cette question: Qu'est-ce qu'un ordinateur cracherait-il s'il suivait son fonctionnement de division standard sur 42/0 ?

mise à jour:

Je vais essayer d'être un peu plus clair. Je pose des questions sur les opérations réelles effectuées avec les chiffres au niveau du bit pour atteindre une solution. Le résultat de l'opération est juste des bits. Nan et erreurs / exceptions entrent en jeu lorsque le diviseur est découvert pour être zéro. Si la division s'est effectivement arrivée, quels bits sortiraient?


6 commentaires

Off-sujets: appartient à math.stackexchange.com


Nan sortirait. Quoi, es-tu pensé que les ordinateurs cachaient le réel résultat de notre part?


@Alastairpitts êtes-vous sûr? Comme il s'agit de la manière dont un processeur gérerait l'opération, il semble plus adapté à un site purement mathématique.


Les instructions de puce sont des portes logiques codées dures, constituées de matières premières gravées dans le silicium, dont la disposition réelle est probablement unique à chaque architecture. Je pense que nous spéculons tous ici. Nous devrions connaître le schéma IC interne pour un processeur particulier - et ce qui se passerait si une partie de ce schéma a été supprimée afin de répondre à cela avec précision. Mais oui, ils sont codés dur dans le chèque de 0-diviseurs. Ce qui pourrait vous obtenir quelque part, c'est apprendre à quel point les architectures informatiques plus récentes implémentent leur logique de division.


Voter ot. De la FAQ - "Vous ne devriez demander que des questions pratiques et responsables en fonction de problèmes réels que vous rencontrez"


@JIM: Mon erreur, j'ai mal compris la portée de la question. Toujours pas sûr qu'il soit sur le sujet pour cela (même à travers cela a été répondu avec succès)


8 Réponses :


8
votes

Pour les processeurs qui ont une instruction "Diviser" interne, telle que le X86 avec div , la CPU provoque une interruption logicielle si on tente de diviser par zéro. Cette interruption logicielle est généralement capturée par la langue d'exécution de la langue et traduite dans une exception "division par zéro" appropriée.


2 commentaires

Cela ne répond pas à la question comme demandé.


Oui, la question a été modifiée depuis ma réponse. J'ai + 1'd le vôtre.



2
votes

Cela dépend de la mise en œuvre. IEE Standard 754 Point flottant [1] Définit les valeurs infini signées, donc en théorie qui devrait être le résultat de la division par zéro. Le matériel définit simplement un drapeau si le démoninateur est zéro sur une opération de division. Il n'y a pas de magie à elle.

Certaines architectures erronées (Lis X86) jettent un piège s'ils ont touché une fracture par zéro qui est en théorie, d'un point de vue mathématique, d'un flic sur.

[1] http://fr.wikipedia.org/wiki/eeee_754-2008


1 commentaires

Non, "d'un point de vue mathématique", vous ne pouvez pas diviser par 0. Jamais. Il n'est tout simplement pas défini. Ce que nous appelons "infini" est un symbole de représenter un grand nombre arbitraire qui résulte de la division de "quelque chose" de presque 0 (mais pas 0)



1
votes

Ce serait une boucle infinie. En règle générale, la division se fait par la soustraction continue, tout comme la multiplication est effectuée via une addition continue.

Donc, zéro est une boîte spéciale car nous savons tous ce que la réponse est de toute façon.


1 commentaires

Ah bon? La multiplication et la division sont des opérations de temps linéaire?



12
votes

Cela pourrait juste pas arrêter . La division entière peut être effectuée en temps linéaire via la soustraction répétée: pour 7/2, vous pouvez soustraire 2 à partir de 7 à 3 reprises de 7 fois, c'est donc le quotient et le reste (modulus) est 1. Si vous deviez fournir un Dividende de 0 à un algorithme comme celui-là, sauf s'il y avait un mécanisme en place pour l'empêcher, l'algorithme n'arriverait pas: vous pouvez soustraire 0 de 42 un nombre infini de fois sans jamais obtenir nulle part.

du point de vue de type, cela devrait être intuitif. Le résultat d'un calcul indéfini ou un non-halling est ⊥ ("inférieur"), la valeur indéfinie habitant de chaque type. La division par zéro n'est pas définie sur les entiers, elle devrait donc produire à juste titre ⊥ en soulevant une erreur ou en défaillant de se terminer. Le premier est probablement préférable. ;)

Autre algorithme de division (heure logarithmique plus efficace) repose sur des séries qui convergent vers le quotient; Pour un dividende de 0, autant que je sache, ceux-ci ne parviendront pas à converger (c.-à-d. Ne pas terminer) ou de produire 0. Voir Division sur Wikipedia.

La Division du point flottant a besoin d'un cas particulier: diviser deux flotteurs, soustrayez leurs exposants et entier, divisez leurs significaires. Même algorithme sous-jacent, même problème. C'est pourquoi il existe des représentations dans l'IEEE-754 pour une infini positive et négative, ainsi que la signature de zéro et de nan (pour 0/0).


3 commentaires

Il pourrait être effectué par la soustraction répétée, mais ce n'est pas en pratique ...


@Olicharlesworth: Droite. J'avais édition pour ajouter une note sur les autres algorithmes.


Même avec une longue division, le matériel se terminera. Il effectuera un nombre fixe d'étapes.



1
votes

Cela cracherait réellement une exception. Mathématiquement, 42/0, est indéfini. Les ordinateurs ne craignent donc pas une valeur spécifique à ces entrées. Je sais que la division peut être effectuée dans du matériel, mais le matériel bien conçu aura une sorte de drapeau ou une interruption pour vous dire que toute valeur contenue dans les registres censé contenir le résultat n'est pas valide. De nombreux ordinateurs en font une exception.


2 commentaires

En outre, j'écris ce commentaire pour empêcher toute personne de dire que 42/0 est réellement infini. BLASPHÈME! 42 / x tend à l'infini lorsque X a tendance à 0, mais 42/0 est juste indéfini. Grande différence.


Totalement vrai, 42 / x = oo est juste un symbole pour représenter un grand nombre arbitraire: "Le résultat augmente comme x se rapproche de 0"



5
votes

Les diviseurs matériels utilisent généralement une pipelined Division longue structure.

En supposant que nous parlons de la division entière pour l'instant (par opposition au point flottant); La première étape de la Division longue consiste à aligner les plus significatives (avant de tenter de soustraire le diviseur du dividende). Clairement, cela n'est pas défini dans le cas de 0, de sorte qui sait ce que le matériel ferait. Si nous supposons que cela fait quelque chose d'Esprit, l'étape suivante consiste à effectuer des soustractions de journal (n) (où n est le nombre de positions de bits). Pour chaque soustraction qui entraîne un résultat positif, un 1 est défini dans le mot de sortie. Donc, la sortie de cette étape serait un mot All-1S.

Division à point flottant nécessite trois étapes:

  • Prendre la différence des exponents
  • Division à point fixe des Mantissas
  • Manipulation des cas spéciaux

    0 est représenté par tous les 0s (la mantissa et l'exposant). Cependant, il y a toujours un premier meneur implicite dans la Mantissa, donc si nous ne traitions pas cette représentation comme cas particulier, il ressemblerait à une puissance extrêmement petite de 2.


1 commentaires

Je ne serais pas surpris s'il y avait des machines où une instruction de division par zéro gèlerait l'unité d'exécution jusqu'à ce qu'un circuit de minuterie de supervision ait reconnu une erreur. Ajout de matériel à "proprement" Évitez de tenter de diviser par zéro Get Stuck créerait un ordinateur plus cher, alors je ne serais donc pas surpris si certaines machines ne se sont pas dérangées.



-1
votes

x / 0 où x est un élément de realnumbers et est supérieur ou égal à 1, Vers la réponse de x / 0 = Infinity.

Méthode de division (C #) P>

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;


1 commentaires

"Je pose des questions sur les opérations réelles effectuées avec les chiffres au niveau du bit pour atteindre une solution." -Opp.



1
votes

sur x86, l'interruption 0 se produit et les registres de sortie sont inchangés fort>

MODE minimal de mode réel 16 bits (à ajouter à un chargeur de démarrage par exemple): P>

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


0 commentaires