J'utilise beaucoup de System.Math récemment et l'autre jour, je me demandais, comment Microsoft aurait implémenté la méthode SQRT dans la bibliothèque. Alors j'ai ouvert mon meilleur réflecteur compagnon et j'ai essayé de démonter la méthode dans la bibliothèque, mais il a montré: ce jour-là pour la première fois, j'ai réalisé à quel point mes enfants sont dépendants sur le cadre, manger. p> blagues à part, mais je me demandais quel type d'algorithme paroles aurait utilisé pour mettre en œuvre cette méthode ou en d'autres termes, comment écrivez-vous votre propre implémentation de MATH.SQRT en C # si vous n'avait pas de support de bibliothèque. P> p>
5 Réponses :
La fonction sera traduite dans les instructions de l'assembleur. Tels que l'instruction Vous pouvez mettre en œuvre des numéros de points flottants dans des logiciels, mais cela sera probablement beaucoup plus lent. Je pense que pour SQRT un algorithme itératif la mise en œuvre typique. P> fsqrt code> du X87. P>
Google.com vous donnera plus de réponses que Stackoverflow.com P>
Regardez cette page: http://fr.wikipedia.org/wiki/Methods_of_computing_square_roots Un algorithme peut être trouvé sous le titre "Système de numéraire binaire (base 2)" dans la page wiki ci-dessus. P>
Mais, les implémentations logicielles ne seront pas efficaces. Les CPU modernes ont des implémentations matérielles pour les fonctions mathématiques en FPU. Il vous suffit d'invoquer les instructions correctes du processeur (en montage ou la langue de la machine) p>
C'est toujours un logiciel même s'il est stocké dans le matériel et appelé un micro-programme.
public double Sqrt(int number) { double x = number / 2; for (int i = 0; i < 100; i++) x = (x + number / x) / 2d; return x; } Very crude method but if I used something more elaborate such as log method, you could ask "and how can I implement the log method?"
Je ne sais pas si cela obtiendra le ou les bits les moins importants corrects.
Oui bien sur. C'est pourquoi j'ai indiqué que c'est très brut code>, bien sûr, vous pouvez itérer beaucoup plus de fois pour atteindre une marge d'erreur suffisante, mais cela rendrait l'algorithme moins lisible.
2d code> est
2 code> comme
double code>.
L'une des méthodes que vous retrouvez avec le réflecteur ou la source de référence dont l'attribut MethodImPloptionS.InternalCall est en réalité implémentée en C ++ à l'intérieur du CLR. Vous pouvez obtenir le code source pour ceux-ci de la distribution SSCLI20. Le fichier correspondant est CLR / SRC / VM / ECALL.CPPP, il contient une table de noms de méthodes avec des pointeurs de fonction, utilisés par le compilateur JIT pour intégrer directement l'adresse d'appel dans le code de la machine généré. La section de table correspondante est qui vous amène à CLR / src / classlibnatif / float / comfloat.cpp p> Ça appelle simplement le Fonction CRT. Mais ce n'est pas ce qui se passe dans la gigue X86, notez le «intrinsèque» dans la déclaration de la table. Vous ne trouverez pas que dans la version SSLI20 de la gigue, c'est un simple sans encombré par des brevets. L'expédition est toutefois la transformer en intrinsèque: p> traduit par p> en d'autres termes, math.sqrt () Traduit sur une seule instruction de code machine flottante. Check Cette réponse pour plus de détails sur la manière dont cela bat le code natif à la main . p> p>
HSNS, merci beaucoup pour la réponse approfondie.
Recréer la fonction system.math.sqrt code>, faites-le simplement:
public static double Sqrt(double n) => Math.Pow(n, 1 / 2);
Par intérêt, notre meilleur compagnon va coûter 35 $ à partir de mars ...