Accélérer les calculs avec un float

Fermé
Xavier59 - 18 oct. 2014 à 21:08
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 21 oct. 2014 à 09:55
Bonjour,

J'utilise une machine qui galère pas mal mais ou on peut coder en C.
Le problème, c'est qu'elle est assez lente, et encore plus lors du calcul flottant.
J'aimerais donc accélérer tous ça. J'ai cru comprendre que les fixed le permettez, mais je n'ai pas vraiment compris le fonctionnement malgré mes recherches sur Internet.
Pouvez-vous m'éclaircir sur ce sujet ?

Merci d'avance :)
Xavier

1 réponse

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 18/10/2014 à 21:51
Bonjour,

Hé bien, les variables à virgule flottante tiennent leur nom du fait que la virgule est placée de manière à optimiser la précision selon que l'on stocke un nombre élevé ou non, c'est à dire que plus le nombre est faible, plus on garde d'espace pour la précision après la virgule, et donc la virgule est flottante afin d'opter pour le meilleur compromis à chaque évolution de la valeur.
Une variable à virgule fixe est bien plus simple finalement, puisqu'on se contente d'aménager un espace fixe permettant d'accueillir une certaine précision après la virgule.
Et pour ça il suffit de multiplier par un nombre choisi en fonction de certains compromis, par 256 par exemple. Ainsi, on perd 8 bits dans la possibilité de grandeur du nombre, mais on aménage une virgule sur 8bits...
Par exemple 1.25*256 donne 320, ensuite on peut faire des opérations sur cette valeur, tout en conservant le 0.25 dans les 8 bits de la virgule, et il suffit de diviser par 256 pour retrouver la partie entière du nombre...

L'intérêt de fonctionner avec un exposant 2 (256), plutôt que 1000 par exemple, c'est que le programme sera bien plus efficace ainsi, puisque les instructions permettant de multiplier ou diviser par des exposants 2 sont infiniment plus rapides qu'en décimal. De plus, on peut récupérer la virgule simplement en lisant les 8 premiers bits de la valeur, tandis qu'en décimal le modulo est obligatoire.

Et je m'interroge sur le matériel dont tu disposes! Ou bien, il faut que tu saches qu'il existe différentes tailles de variables à virgule flottante, plus ou moins longues à la tâche! Parce que si mes souvenirs sont bons, dès la sortie des premiers pentium, il est devenu plus rapide de traiter une division (par exemple) en virgule flottante 32 bits via le fpu, que sur un registre 32 bits traité par le cpu!

Le chêne aussi était un gland, avant d'être un chêne
0
Le temps que j'essai de comprendre tout, je possèdes une calculatrice graphique programmable. Seulement, celle-ci est programmable en C, et on peut faire beaucoup plus de choses qu'elles ne laissent le paraître.
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 18/10/2014 à 22:26
Ha oui, je comprend mieux pourquoi c'est aussi lent!
Et si les virgules flottantes sont si péniblement traitées, c'est sans doute que le proc n'intègre pas d'unité de traitement spécialisée, et qu'une fonction du C se charge du calcul, ce qui est horriblement lent!
Dans ce cas la virgule fixe peut réellement t'aider oui.
Par contre les registres sont probablement de faible taille, genre 16 bits... ce serait beau qu'il fassent 32 bits!
Et pour bien cerner le fonctionnement de la virgule fixe hé bien, c'est simple: Mettons qu'on a le nombre 124.455 et qu'on ne veuille pas s'embarrasser de calculs compliqués avec la virgule; en ce cas on le multiplie par 1000, et voilà, plus de virgule! Pour bien interpréter le résultat, il suffira de le diviser par mille et le tour est joué!
C'est le principe même de la virgule fixe.
0
J'ai bien essayé, mais ça ne marche pas. Voilà mon code :

x[Sommet]=Rayon*cos((theta+Sommet*90+1)*3.1415/180) + CentreAbscisseCarre;

Mais si je fais x[Sommet]=Rayon*cos((theta+Sommet*90+1)*31415/180)/10000 + CentreAbscisseCarre;

Et bien, ça ne me donne pas du tout le résultat attendu !
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
21 oct. 2014 à 09:55
Hé bien dans ce cas c'est que tu dois avoir un problème de débordement de variable, puisqu'on travaille avec une valeur 10000 fois supérieure... Alors, tu peux essayer de limiter la précision dans un premier temps, à 1000 ou 100, et aussi -si la calculatrice ne le fais pas- d'échanger 31415/180 par son résultat, 175. Ça évitera peut-être de déborder!

Et surtout le problème, c'est le cosinus! Dans tous les cas il va être obtenu sous forme de virgule flottante, donc le ralentissement sera inévitable à partir de là!

En fait, si le rayon bouge peu, il faudrait que tu créés un tableau avec des valeurs (Rayon*Cos) précalculées et stockées en virgule fixe pour conserver une certaine précision, ce sera sans doute le seul moyen d'obtenir des calculs vraiment rapides. La taille du tableau déterminera la précision obtenue en fonction de (theta+sommet*90+1).
Au pire tu pourrais aussi faire un tableau de cosinus seul précalculé, là aussi en virgule fixe...
0