Trouver la racine carrée d'un entier sur MIPS de l'assemblée
hey exactement comment puis-je trouver la racine carrée d'un nombre entier à l'aide de MIPS assemblée?
Avez-vous regardé par exemple ici?
Vous ne pouvez pas en général à trouver la racine carrée exactement.
Demandez-vous si il y a une racine carrée de l'enseignement? Il n'y a pas. Vous aurez besoin d'écrire un programme.
Je n'aurais qu'à faire l'assemblage de la fonction qui donne les racines de l'équation x^2 - S = 0, où S est le nombre entier vous souhaitez trouver la racine carrée d'? Mais que serait un look compliqué à droite avec toute la division et la multiplication? plus le vous devez prendre la racine carrée du discriminant de trop!
Ouais j'ai fait dire de programme, j'ai besoin d'une idée générale de la façon d'écrire le programme
Vous ne pouvez pas en général à trouver la racine carrée exactement.
Demandez-vous si il y a une racine carrée de l'enseignement? Il n'y a pas. Vous aurez besoin d'écrire un programme.
Je n'aurais qu'à faire l'assemblage de la fonction qui donne les racines de l'équation x^2 - S = 0, où S est le nombre entier vous souhaitez trouver la racine carrée d'? Mais que serait un look compliqué à droite avec toute la division et la multiplication? plus le vous devez prendre la racine carrée du discriminant de trop!
Ouais j'ai fait dire de programme, j'ai besoin d'une idée générale de la façon d'écrire le programme
OriginalL'auteur Sly Cooper | 2013-07-25
Vous devez vous connecter pour publier un commentaire.
On peut utiliser un algorithme semblable à celle présentée pour cette question et de l'adapter en tant que de besoin. Avant d'entrer dans le MIPS, permet de regarder une implémentation en C:
La
sqroot(n)
fonction de calcul et entier équivalent à l'étage de la racine carrée den
. Donc, si vous étiez à l'appelsqroot(225)
vous obtenez 15 comme prévu, maissqroot(15)
serait de retour 3 au lieu de 3.87298.À partir du code C, nous pouvons décrire ce que l'MIPS code ressemblera à:
Veuillez Noter:
OriginalL'auteur NULL
J'ai trouvé la méthode de Newton
x = (x + n/x) /2
insatisfaisante en cas de fonctionnement avec seulement entiers, parce que la condition d'arrêt est difficile à calculer avec précision.n/2
est juste une supposition, et est presque toujours plus d'itérations que nécessaire. La méthode de Newton converge quadratiquement, et n'est pas proportionnelle àn
, mais plutôtsqrt(n)
. La suggestion de l'autre, "répéter jusqu'à ce que x de cesse de changer" ne fonctionne pas non plus, parce que pour les non-carrés parfaitsx
va alterner entre le plancher et le plafond de la racine — entier en raison de mathématiques, le termen/x
alternent lorsquex
est légèrement plus petit ou légèrement plus grand quesqrt(n)
.J'ai pris un chiffre par chiffre de la racine de la méthode de calcul de wikipédia, et a créé une version MIPS. Il ne souffre pas de l'inefficacité (
n/2
) ou d'ambiguïté (floor(sqrt(n))
ouceil(sqrt(n))
). La table de méthodes peut retourner des résultats de manière plus efficace, mais en supposant une table de recherche n'est pas disponible, c'est une bonne méthode fiable et.Tout d'abord, j'ai traduit le C exemple d'utilisation seulement moins (
<
) les comparaisons, car MIPS seulement fournit un ensemble moins deslt
comparaison de l'instruction.Ici est celle du MIPS code:
Vous l'appelez comme n'importe quel autre MIPS procédure:
Cette procédure toujours retourne
$v0 = floor(sqrt($a0))
pour arguments positifs.Méfiez-vous: le code entre dans une boucle infinie pour arguments négatifs. Désinfecter votre entrée avant l'appel de cette procédure.
OriginalL'auteur whitehat101
Il n'est pas en MIPS, mais l'assemblée néanmoins. L'algorithme de base que j'ai trouvé était basée sur le fait que les n premiers nombres impairs additionnés = n^2.
Donc, si vous prenez avantage de qui, en inversant le processus et en soustrayant le nombre que vous voulez prendre la racine carrée de l', vous pouvez faire une boucle pour obtenir la réponse exacte, ou une approximation. Je crois que c'est la racine + 1 pour les non-carrés parfaits.
L'idée étant que le nombre de fois que vous parcourez est n, qui est votre racine carrée.
Espère que cette aide.
OriginalL'auteur okstory
Vous pouvez essayer cet algorithme, ce qui donne le plus petit entier supérieur ou égal à la racine carrée de votre numéro.
Supposons que vous voulez la racine carrée de
n
. Alors continuez à répéter les calculs suivants:x = (x + n/x) /2
Choisir
x = n
de départ et répétez jusqu'à ce que x de cesse de changer.OriginalL'auteur Patrik
Voici un simple à comprendre algorithme pour le calcul de la chaussée de la racine carrée d'un nombre entier positif, dans C:
Il repose sur le même principe que okstory de répondre, d'une manière légèrement différente.
Théorie: une augmentation progressive des nombres impairs sont ajoutés à une partialSum, aussi longtemps que le partialSum est inférieur à l'opérande. Le résultat est égal au nombre de numéros impairs additionnées pour produire de l'partialSum.
OriginalL'auteur Alexander
Les gars, vous tous mauvais.
Vous pouvez utiliser sqrt.s ou sqrt.d de l'assemblée de code!
ex) sqrt.s $f12, $f13
Ne perdez pas votre temps à la mise en œuvre de ces fonctions.
double
et à l'arrière, et de dire quelque chose à propos de tronquer vs d'arrondi au plus près de la conversion en entier. En général,float
ne peut pas représenter avec exactitude chaque entier de 32 bits, vous devrez peut-êtredouble
si le nombre peut être supérieur à 2^24. La lenteur estsqrt.s
ousqrt.d
sur une véritable MIPS matériel contre ces entier boucles? Sur moderne x86, de convertir à la FP et à l'arrière pour le matériel sqrt est mieux qu'une boucle entier pour tout, mais les cas les plus simples.OriginalL'auteur Jaehyeon Park