Liste des Groupes | Revenir à fcsm programmation |
pehache <pehache.7@gmail.com> wrote:Il n'est pas dérangeant à partir du moment où on a conscience de ce qui se passe à bas niveau en machine pour les calculs sur des flottants, et qu'on en tient compte quand on écrit du code.
Il n'y a pas forcément de défaut, calculer des restes en arithmétiqueTon argument serait recevable, encore que très dérangeant dans les
flottante est forcément casse-gueule quand le résultat de la division
est censé être une valeur entière. Quand tu écris "2,54" (ou n'importe
quelle autre valeur) la représentation en machine est une approximation
de cette valeur, ce n'est pas la valeur exacte (sauf coup de chance).
calculs pratiques, pour (254 mod 25.4) ==> 1.4210854715202E-14
Là où il n'est plus soutenable c'est pour (254 mod 2.54) ==> 2.54Si, car comme l'a expliqué OM c'est exactement le même problème. Suivant que le résultat de la division flottante tombe juste au-dessus ou juste au-dessous de la valeur entière à cause des approximations inhérentes au calculs en précision limitée, ça va changer le résultat du tout au tout.
Si le copro-arithmétique du Mac n'a pas été écrit pour retourner laJe ne suis pas certain qu'il existe une telle fonction câblée en hardware dans le processeur pour les flottants. Elle doit être logicielle.
valeur correcte (± epsilon d'après ton argument) de la FONCTION "RESTE"
d'une divison, il y a un GROS SOUCI !!
Pour preuve, toujours dans l'éditeur de script si j'essaie cette fois enDans ce cas utilise cette fonction écrite par tes soins si tu estimes qu'elle se comporte mieux que la fonction proposée par le langage. Ceci étant ça reste de l'arithmétique flottante, et *rien* ne peut garantir que le résultat sera *toujours* conforme à ce que tu attends.
javascript
254 % 2.54 ==> 2.5399999999999965
ou
7412 % 74.12 ==> 74.11999999999955
résultats totalement inacceptables, et je ne me satisfais pas vraiment
que
7412 % 7.412 ==> 7.815970093361102e-14
tende vers zéro
d'ailleurs, voici en dessous une fonction Modulo() écrite en
AppleScript, qui fort heureusement retourne "ZÉRO" comme reste de (par
exemple…)
254 par 2.54 ou
789452.18 par 789.45218
ou toutes autres valeurs du domaine de précison du copro.
on Modulo(dividende, diviseur)
set partieEntiere to (dividende div diviseur)
set reste to (dividende - (partieEntiere * diviseur))
return reste
end Modulo
Les messages affichés proviennent d'usenet.