[Paul Curtis] sur au Segger a une intéressante série de messages de blog sur le calcul division. Cette habitude d’être un sujet plus chaud, mais aujourd’hui de nombreux ordinateurs ou langages informatiques ont pour support intégré la multiplication et la division. mais certains processeurs ne disposent pas des instructions et une bibliothèque pour le faire peut-être moins qu’idéal. sachant comment rouler votre propre pourrait vous permettre d’optimiser la vitesse ou de l’espace. Les couvertures en cours de versement à l’aide de l’algorithme de Newton à faire division.
Steve Martin avait un peu célèbre sur la façon d’être un millionnaire et jamais payer des impôts. Il a commencé en disant: « Tout d’abord … obtenir un million de dollars. Alors … » Cette méthode est un peu comme ça, puisque vous devez d’abord savoir comment multiplier avant de pouvoir diviser. Le principe de base est double: la méthode de Newton vous permettent d’affiner une estimation d’une réciproque par multiplications successives, puis en multipliant un nombre une réciproque est identique à la division. En d’autres termes, si nous devons diviser 34 par 6, vous pouvez réécrire à 34 * 34/6 1/6 et la réponse est la même.
l’approximation de Newton pour vous permet de prendre des inverses de deviner la réponse, puis l’affiner à travers une série de multiplications. Chaque multiplication crée une meilleure précision. Vous pouvez l’utiliser pour effectuer une vitesse classique / espace compromis. Par exemple, supposons que nous voulons trouver l’inverse d’un octet (probablement un octet de point fixe). Une table de consultation de 256 éléments fournirait une précision parfaite et serait très rapide. Plus de mathématiques est nécessaire. mais qu’en est-32 bits? maintenant la table est tout simplement trop grand. mais vous pourriez rechercher, par exemple, les 8 premiers bits du nombre 32 bits. Ou plus. Ou moins. dépend de ce qui est important pour vous.
Alors maintenant, vous avez une mauvaise estimation de votre réciproque. Sir Issac peut faire mieux. Pour certains un numéro, vous prenez votre estimation (x) et les multiplier ensemble. Soustraire ce nombre de 2 et vous avez un facteur de multiplier votre ancienne estimation par pour obtenir une nouvelle estimation. Skipping avant, il est clair si votre estimation était juste, la multiplication vous donnerait 1 qui ne changerait pas l’ancienne estimation du tout. Si l’estimation est désactivée, vous aurez un facteur d’échelle.
En tant que formule, il ressemble à ceci:
x = x * (2-a x *);
Donc, si vous décidez l’inverse de 22 pourrait être .02, le premier passage vous donnera:
0,02 * (2-22 * 0,02) = 0,0312
0,0312 * (2-22 * 0,0312) = 0,0410
0,0410 * (2-22 * 0,0410) = 0,0450
La bonne réponse est une répétition décimale 0,0454545 et si vous continuez, vous y arriverez.
Bien sûr, vous devez multiplier une fois de plus à faire la division.
Nous avons aimé que le poste a une mise en œuvre de point fixe et examine ensuite le code d’assemblage obtenu pour ARM, RISC-V et dsPIC30. Bien lu vaut un.
Nous aimons des astuces mathématiques que nous pouvons utiliser en langage assembleur. Si vous travaillez sur AVR et en virgule flottante, ne manquez pas cette méthode.