bonjour/bonsoir à tous (suivant l'heure à laquelle vous allez me lire)
ce sujet m'a inspiré
à mon tour je vous propose un ''défi'', comme on pouvait en trouver au cours des années '80 dans les pages de l'Ordinateur de Poche (p.t..n de nostalgie pour ceux qui ont connu !)
je précise d'emblée qu'il n'est ici aucunement question de concurrencer la fonction sqrt() de la bibli math.h fournie avec le langage C/C++ et ses divers compilateurs : elle est, au vu des tests que j'ai déjà effectués, tellement efficace qu'il me semble inutile d'essayer de la surpasser.
non, ce que j'attends de vous (c'est pompeux cette formulation, je sais, mais je n'ai rien d'autre sous la main, je manque de vocabulaire) c'est de calculer une racine carrée sur un entier (et non un nombre à virgule : ça peut sembler plus simple ... et rapide ?) en n'utilisant que les ''4 opérations'' de base, à savoir + - * /, plus bien sûr les décalages de bits (rapides) et éventuellement d'autres fioritures, mais seulement des instructions ''de base''.
le but du jeu est ici de créer la fonction (ou les fonctions, suivant la taille du nombre fourni en paramètre, le langage C étant capable de différencier les différentes fonctions suivant le cas) qui permettra de calculer la valeur le plus rapidement possible.
pour vous aider dans vos recherches de solutions, l'une de mes préférées est basée sur une méthode perso (même si inspirée par d'autres, mais je ne vous dirai pas qui ... avant d'avoir vos solutions) mais ne me donne pas entière satisfaction ... et pourtant elle me permet de calculer une racine carrée à la main, juste avec un crayon et du papier, même sans calculette ! (mais avec du temps !)
EDIT:
au vu des incompréhensions (l'expression de l'énoncé n'était pas assez claire) j'apporte après certaines réponses quelques précisions :
-
pour commencer, et pour mettre toutes les solutions sur un même pied d'égalité, la fonction doit être compilée pour un classique cœur AVR, c'est-à-dire un ATMega (328 ou 2560, par exemple) ;
-
on cherche à calculer la racine carrée d'un nombre entier, sous la forme d'un entier également (pas de partie décimale, donc) mais tous les chiffres calculés doivent être exacts, ou à la rigueur représenter un arrondi exact : xxx5,6 peut éventuellement donner xxx6 ;
-
la fonction doit, sur la même machine (Uno, Nano, Mega ...), s'exécuter le plus rapidement possible ... mais prenez vous-même le temps nécessaire à sa mise au point ; j'utilise pour mes chronométrages un timer avec un prescaler de 1/1, ce qui me donne des durées d'exécution mesurées en cycles de 62,5ns pour une horloge à 16MHz.
mon but est de permettre une compilation des différentes méthodes (connues, moins connues, voire carrément nouvelles) et d'amener à une discussion sur l'efficacité de l'une ou l'autre.
(merci, déjà, à ceux qui ont commencé à participer)