Multiplier par 0.5 ou diviser par 2? - Java - Programmation
Marsh Posté le 22-05-2003 à 10:44:07
D'après mes connaissance, un ordinateur ne sais pas diviser, mais seulement multiplier. Idem pour addition/soustraction...
Donc ça change pas grand chose...
Marsh Posté le 22-05-2003 à 10:57:52
JagStang a écrit : D'après mes connaissance, un ordinateur ne sais pas diviser, mais seulement multiplier. Idem pour addition/soustraction... |
+1
remarque pour diviser par deux, tu peux encore mieux faire ...
un petit decalage a droite
Marsh Posté le 22-05-2003 à 10:59:24
bobuse a écrit : |
etant donne qu'il pense multiplié par 0.5, je présuppose qu'il travaille sur des floats, donc ton idee me parait pas super brillante, ceci dit sans vouloir te vexer
Marsh Posté le 22-05-2003 à 11:07:30
chrisbk a écrit : |
oups
on va dire que c'est l'intention qui compte ...
Marsh Posté le 22-05-2003 à 13:40:45
Je travaille sur des double (je l'ai dit non? j'ai pas oublié? pcq g plus toute ma tête ces temps ci).
C'est con je me rappelle plus des cours d'architecture, j'avais su faire des division et multiplications dans les différents modes de numérotation (complément vrai, VA + signe etc...) mais là j'ai oublié. Puis je sais pas comment marche java (déjà que je suis pas sur que les cours s'appliquent à des cas concrets).
Marsh Posté le 22-05-2003 à 16:09:36
chrisbk a écrit : |
Il n'empêche que l'idée est bonne : il suffit d'incrémenter ou de décrémenter l'exposant (selon que l'on multiplie ou que l'on divise par 2).
Mais pour répondre à la question première de cdr, il vaut mieux laisser la multiplication, car contrairement à ce que dit JagStang, le CPU sait diviser (par contre, la soustraction n'existe effectivement pas car le CPU se contente de faire des additions sur les nombres signés).
Un petit test rapide pour donner un ordre de grandeur. Sur ma machine, les instructions suivantes prennent le temps suivant :
- myDouble /= 2.0; 23 ns.
- myDouble /= 2; 86 ns.
- myDouble *= 0.5; 8 ns.
(instructions répétées un milliard de fois)
Même si les mesures ne sont pas très précises, elles donnent un irdre de grandeur significatif.
Marsh Posté le 22-05-2003 à 16:11:50
encore heureux que le cpu sait diviser, on aurait pas l'air fin avec nos entiers sinon
Marsh Posté le 22-05-2003 à 16:19:32
chrisbk a écrit : encore heureux que le cpu sait diviser, on aurait pas l'air fin avec nos entiers sinon |
Ce que JagStang semblait dire, c'est qu'une division se ramène à une multiplication par l'inverse du diviseur. Mathématiquement, c'est vrai, mais au niveau des instructions CPU, c'est faux.
Je me rends compte que je n'ai répondu qu'à une partie de la question de cdr. Il demandait si c'était plus rapide : j'ai répondu. Il demandait aussi si c'était plus précis : de ce point de vue, c'est strictement identique : la multiplication et la division par une puissance de 2 sont les seules opérations rigoureusement exactes en calcul flottant.
Marsh Posté le 22-05-2003 à 16:23:29
BifaceMcLeOD a écrit : |
vi, je disais juste que c'etait encore une chance que nos cpu sachent faire des divs, parce que 1/x avec x > 1 ca risque pas d'etre tres precis, en entier.
BifaceMcLeOD a écrit : |
(0.5 est une puissance de 2 ?)
Marsh Posté le 22-05-2003 à 16:36:22
chrisbk a ecrit : |
Oui, 0.5 = 2^-1
Marsh Posté le 22-05-2003 à 17:34:07
chrisbk a écrit : |
Si, si, le comportement du CPU est très précis dans ce cas : une exception hardware. "KABOUM !" Dommage...
Marsh Posté le 22-05-2003 à 10:40:28
Je porte un programme Fortran en Java qui doit faire quelques calculs mathématiques. J'ai une formule où la personne qui a fait le programme Fortran a multiplié par -0.5. Je me demandais si c'était mieux que de diviser par -2. Par mieux j'entend plus précis? plus rapide? Pour info je travaille sur des double.
Aussi je pose la question pour Java mais je pense que ça doit être pareil pour du C ou autre. (si c'est pas le cas, merci de contribuer à l'amélioration de ma culture générale).
---------------
CDr