Comment soustraire IEEE 754 numéros?
Comment puis-je soustraire IEEE 754 numéros?
Par exemple: 0,546875 - 32.875...
-> 0,546875 est 0 01111110 10001100000000000000000 dans la norme IEEE-754
-> -32.875 est de 1 10000111 01000101111000000000000 dans la norme IEEE-754
Alors, comment dois-je faire la soustraction? Je sais que je dois faire les deux exposants égaux, mais que dois-je faire après? 2'Complement de -32.875 mantisse et l'ajouter avec 0.546875 mantisse?
double possible de la mise en Œuvre de virgule flottante de soustraction
Pourquoi ne pas vous soustraire? Pourquoi la peine de faire les 2 en complément de l'opération vous-même?
C'est la seule façon que je sais comment soustraire en binaire -.-'
Quoi tu veux dire "binaire"? Voulez-vous dire que vous voulez faire cette opération à la main? Comme avec un stylo & papier?
Pourquoi ne pas vous soustraire? Pourquoi la peine de faire les 2 en complément de l'opération vous-même?
C'est la seule façon que je sais comment soustraire en binaire -.-'
Quoi tu veux dire "binaire"? Voulez-vous dire que vous voulez faire cette opération à la main? Comme avec un stylo & papier?
OriginalL'auteur Tiago Costa | 2012-01-07
Vous devez vous connecter pour publier un commentaire.
Pas vraiment différente de ce que vous faites avec un crayon et du papier. Bon d'accord un peu différent
le plus grand nombre domine, le changement le plus petit nombre de la mantisse de pied dans le seau bits jusqu'à ce que les exposants match
puis effectuer la soustraction avec le mantissas
Puis normaliser (ce qui dans ce cas est)
Qui était avec la base 10 des nombres.
Dans la norme IEEE float, simple précision
normaliser que nous devons déplacer la décimale 16 places à gauche, de sorte
L'exposant est biaisée si on l'ajoute 127 à 16 et obtenir 143 = 0x8F. C'est un nombre positif, donc le bit de signe est 0, nous avons commencer à construire l'IEEE nombre à virgule flottante, le premier
1 avant la virgule est implicite et n'est pas utilisé en simple précision, pour nous en débarrasser et de garder la fraction
bit de signe, exposant mantisse
Et si vous écrivez un programme pour voir ce qu'est un ordinateur de choses 123400 est que vous obtenez la même chose:
Donc, nous savons que l'exposant et la mantisse pour la première opérande'
Maintenant le deuxième opérande
Normaliser, décalage décimal 12 bits à gauche
L'exposant est biaisée ajouter 127 et obtenir 139 = 0x8B = 0b10001011
Mettre tout cela ensemble
Et un programme d'ordinateur/compilateur donne le même
Maintenant pour répondre à votre question. En utilisant les composants de nombres en virgule flottante, j'ai restauré l'implicite 1 ici, car nous en avons besoin
Nous devons aligner nos décimales comme à l'école primaire, avant de nous soustraire donc dans ce contexte que vous avez à déplacer le plus petit exposant de numéro de droit, en remuant de bits de la mantisse, à la fin jusqu'à ce que les exposants match
Maintenant, nous pouvons soustraire le mantissas. Si le signe bits match, alors nous allons en fait de soustraire s'ils ne correspondent pas alors nous ajouter. Ils correspondent à ce sera une soustraction.
ordinateurs effectuer une soustraction en utilisant plus logique, l'inversion de la deuxième opérateur sur le chemin de l'additionneur et d'affirmation de la transporter à peu, comme ceci:
Et maintenant, tout comme avec un crayon et du papier permet d'effectuer l'ajout
ou de le faire avec hex sur votre calculatrice
Un peu comment le matériel fonctionne, car c'était vraiment une soustraction à l'aide de l'additionneur nous avons également inverser les bits (ou sur certains ordinateurs, ils l'auront). Afin de réaliser de 1 est une bonne chose que nous avons fondamentalement jeter. S'il avait été un report de zéro, nous aurions besoin de plus de travail. Nous n'avons pas a prendre donc notre réponse est vraiment 0xE66800.
Très vite permet de voir qu'une autre manière, au lieu de l'inversion et de l'ajout de l'un permet l'utilisation d'une calculatrice
En essayant de visualiser j'ai peut-être fait qu'empirer les choses. Le résultat de la mantisse soustrayant est 111001100110100000000000 (0xE66800), il n'y a pas de mouvement dans le bit le plus significatif nous nous retrouvons avec un 24 nombre de bits dans ce cas avec le msbit de 1. Pas de normalisation. Pour normaliser vous avez besoin de passer la mantisse la gauche ou la droite jusqu'à 24 bits lignes de en hausse la plus importante d'1 en la plus à gauche de la position, le réglage de l'exposant pour chaque décalage de bits.
Maintenant le décapage de la 1. peu de la réponse, nous mettre les pièces ensemble
Si vous avez suivi le long par l'écriture d'un programme pour ce faire, j'ai fait ainsi. Ce programme viole le C standard en utilisant une union de façon incorrecte. Je suis parti avec mon compilateur sur mon ordinateur, ne vous attendez pas à travailler tout le temps.
Et notre résultat correspond à la sortie du programme ci-dessus, nous avons obtenu un 0x47E66800 de le faire à la main
Si vous écrivez un programme pour synthétiser le calcul en virgule flottante votre programme peut effectuer la soustraction, vous n'avez pas à faire l'inverser et ajouter plus d'une chose, plus complique comme nous l'avons vu ci-dessus. Si vous obtenez un résultat négatif si vous avez besoin de jouer avec le bit de signe, inverser le résultat, puis normaliser.
Donc:
1) extraire les parties, signe, exposant mantisse.
2) Aligner les décimales en sacrifiant les bits de la mantisse du nombre par le plus petit exposant, changement qui mantisse vers la droite jusqu'à ce que les exposants match
3) soustraire l'opération si le signe de bits sont les mêmes, alors vous effectuer une soustraction, si le signe bits sont différents de vous effectuer un complément de la mantissas.
4) si le résultat est zéro, alors votre réponse est zéro, encoder de la norme IEEE valeur de zéro comme résultat, sinon:
5) normaliser le nombre, le décalage de la réponse à la droite ou vers la gauche (La réponse peut être de 25 bits à partir d'un 24 bits à additionner/soustraire, ajouter/soustraire peut avoir un changement radical de normaliser, soit un droit ou nombre de bits vers la gauche) jusqu'à ce que vous avez un 24 bits en nombre avec le plus significatif justifié à gauche. 24 bits est pour la simple précision float. La plus bonne façon de définir la normalisation est de faire passer la gauche ou la droite jusqu'à ce que le nombre ressemble à 1.quelque chose. si vous aviez 0.001 vous maj gauche 3, si vous aviez 11.10 vous serait décalage à droite 1. une maj gauche pour augmenter votre puissance, un décalage à droite, elle diminue. Pas différent que lorsque nous nous sommes convertis à partir de entier flotter au-dessus.
6) pour la simple précision retirer le premier 1. à partir de la mantisse, si l'exposant a débordé, puis vous obtenez dans la construction d'une signalisation nan. Si le signe de bits sont différents, et vous avez effectué un complément, alors vous avez à traiter avec de trouver le résultat bit de signe. Si, comme au-dessus de tout fine, il vous suffit de placer le bit de signe, l'exposant et la mantisse du résultat
De multiplier et de diviser est différent, vous avez demandé à propos de subract, donc, c'est tout, j'ai couvert.
OriginalL'auteur old_timer