Arrondi en delphi - Delphi/Pascal - Programmation
Marsh Posté le 20-01-2004 à 18:19:15
je me rend compte que j'ai pas été tres precis sur l'erreur :
message "Combinaison incorrecte d'instruction et de paramètres" sur la ligne qui comprend le 'fldcw' dans la fonction SetControlWord
Marsh Posté le 20-01-2004 à 20:12:43
tout simple :
n := Trunc(n + 0.5);
le Round de Delphi est la méthode "statistique", le coup de "arrondir au-dessus si .5" c'est la méthode "commerciale".
Marsh Posté le 21-01-2004 à 10:33:47
Comme je veut arrondir a 3 chiffres, j'ai ecrit cette fonction :
Code :
|
mais ca reagis un pas comme je le souhaite :
myRound(5.0004)=5
myRound(5.0005)=5 (??)
myRound(5.0006)=5.001
un truc que je ne n'explique pas :
myRound(0.0005)=0.001
myRound(1.0005)=1
myRound(2.0005)=2.001
myRound(3.0005)=3.001
myRound(4.0005)=4
myRound(5.0005)=5
myRound(6.0005)=6
myRound(7.0005)=7
myRound(8.0005)=8.001
trouvez la suite logique
Marsh Posté le 21-01-2004 à 10:40:04
les nombres flottants en Delphi et dans tous [edit: la plupart] les autres langages ne sont que des approximations
7.0005 est peut-être stocké comme 7.0004999999999999
Marsh Posté le 21-01-2004 à 10:45:09
Avec la fonction suivante, ça fonctionne comme il faut :
Code :
|
(d'ailleurs toutes les fonctions de Delphi prennent des Extended et non des Double/Real ou des Single )
Marsh Posté le 21-01-2004 à 10:57:58
X et Y etant des nombres decimaux lu dans un fichier texte et converti avec strtofloat
comment m'y prendre si je veut que X divisé par Y soit arrondit correctement ?
Marsh Posté le 21-01-2004 à 11:04:41
J'ai essayé en remplaçant Real par Extended, c'est mieux, je suppose que l'approximation est plus precise, mais il y a encore des cas ou cela marche pas :
myRound([1à7].0005)=[1à7].001 <- ok
myRound(8.0005)=8
Marsh Posté le 21-01-2004 à 12:12:49
Code :
|
en passant comme second paramètre la précision, genre 0.0000001
ça fait bidouillage mais je ne vois pas trop quoi faire d'autre (c'est le Trunc qui fait perdre la précision en fait)
Marsh Posté le 21-01-2004 à 12:16:53
Sinon en Delphi 6 & 7 (ça n'existe pas dans les précédents) tu peux faire ceci :
Code :
|
vu que le bidule avec de l'assembleur que tu as mis dans ton premier post fait partie des fonctions de Delphi
ça a l'air de mieux marcher, mais il faut voir si ça va dans tous les cas
Marsh Posté le 21-01-2004 à 14:54:22
je suis en delphi5, j'ai donc pas de SetRoundMode, le code dans mon premier commentaire etait sensé palier ce manque.
Je vais utiliser ta fonction qui fait le bidouillage (+0.00001) a defaut de trouver autre chose.
merci encore Antp
Marsh Posté le 21-01-2004 à 15:06:27
J'ai essayé de récupérer les bouts de code de Delphi 6 de ces fonctions et de les coller en Delphi 5, mais il arrondit toujours au-dessus
Marsh Posté le 20-01-2004 à 18:08:23
salut,
La fonction round de delphi ne marche pas comme je veut :
Elle arrondi au plus proche, si on est juste au milieu, elle arrondi au nombre pair le plus proche (??).
par exemple
round(1.4)=1
round(1.5)=2
round(1.6)=2
round(2.5)=2 (??)
round(2.6)=3
Moi je voudrais arrondir au plus pres, et si on est au milieu, arrondir au dessus
round(2.5)=3
ca fait 1h que je google, mais je trouve rien, ou plutot je trouve des explications tres compliqué qui font intervenir de l'assembleur.
par exemple :
delphi ne comprend pas le fldcw de la fonction setcontrolword,
help !
merci