Mettre en œuvre le double sqrt(double x) dans C++
Mettre en œuvre double sqrt(double x)
en C++ sans utiliser std bibliothèque.
C'est un facebook les questions de l'entrevue que j'ai vu ici. http://www.glassdoor.com/Interview/Implement-double-sqrt-double-x-in-C-QTN_87210.htm
Toute autre bonne idée à ce sujet?...
!!!Édité.!!!(sans utiliser std bibliothèque.)
#include <cmath>
[newline]double sqrt(double x) { return std::sqrt(x); }
- Je pensais
#include <cmath>
[newline]double sqrt(double x) { return std::pow(x, 0.5); }
- en.wikipedia.org/wiki/Newton%27s_method
- en.wikipedia.org/wiki/Methods_of_computing_square_roots
- Ce doit être l'un des plus idiotes les questions de l'entretien. Ils veulent quelqu'un capable de C++ ou de quelqu'un en sachant algorithmes, qui peut facilement être regardé?
- Ce n'est pas une "programmation" la question, c'est une des mathématiques de la théorie question
Vous devez vous connecter pour publier un commentaire.
Look ici. Cette CodeProject article compare 14 différentes méthodes pour le calcul de la racine carrée.
Les deux réponses évidentes sont non-bloquante (semi-lente) et de Newton-Raphson/Leibniz itération (généralement plus rapide). Pour éviter de gâcher un plaisir, je vais faire un reinterpret_cast sur la question, voici une mise en œuvre d'un entier de la racine carrée dans 8086 langage d'assemblage à l'aide de la technique de Newton-Raphson:
Il est ouvert à une certaine amélioration -- il utilise x/2, tel que son estimation initiale à la sqrt(x). 386+ instructions, vous pouvez utiliser
bsr
de trouver le bit le plus significatif c'est réglé pour obtenir une approximation de log2x, et de diviser le résultat par 2 pour obtenir votre première approximation.Otoh, que, cela ne fait sens que sur les anciens processeurs. Pour quoi que ce soit depuis le 486 (ou presque) qui a intégré dans le matériel de point flottant, il est presque certain que la
FSQRT
instruction va battre ce (ou n'importe quoi d'autre, vous pouvez écrire).Ici est l'un des plus génie sqrt implémentations qui peut être trouvé sur wikipédia. Ce n'est pas la plus précise, mais aussi extrêmement rapide.
float
?Si je suis autorisé à utiliser log (ln) et exp puis, bien sûr, exp(log(x)/2) me donnent la racine carrée.
En supposant que pas:
Si notre valeur, nous trouvons la racine carrée de x et la valeur de départ est de y, puis on itère y-> y+x/y)/2
Condition d'arrêt pourraient être à proximité de y à sa valeur précédente ou de y*y x.
Avec 385 que ma valeur de x, je reçois ces valeurs dans mon itérations (Excel)
Vous pouvez utiliser un "approximative" de la 2^(log base 2(x)/2) comme un point de départ au lieu de 1.
385 a un log quelque part entre le 8 et le 9, et si nous disons 8.5 et donc commencer avec 2^4.25. Si nous faisons cela linéaire entre 16 et 32 puis nous allons commencer avec 20.
De départ avec 20-je y arriver en seulement 4 étapes:
mais il requis précédent "itérations" pour calculer la taille approximative des journaux et exponentielle.