BakaSora
Messages postés4Date d'inscriptionjeudi 15 mai 2003StatutMembreDernière intervention10 mai 2005
-
8 mai 2005 à 21:37
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 avril 2010
-
9 sept. 2006 à 21:58
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 9 mai 2005 à 19:22
Merci WhiteHippo d'avoir attiré mon attention sur le fait que Round n'était pas très "mathématique".
Je n'y ai pas cru tout d'abord, et pourtant...
Extrait de l'aide de Delphi concernant Round :
"La fonction Round arrondit une valeur de type réel en valeur de type entier.
X est une expression réelle. Round renvoie une valeur Int64 qui
correspond à la valeur de X arrondie au nombre entier le plus proche. Si X se trouve exactement à mi-chemin entre deux nombres entiers, le résultat est toujours le nombre pair."
Ah ben ça alors !
Si je comprends bien, on est obligé de se la créer, notre fonction...
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 avril 2010 9 sept. 2006 à 21:58
Bonjour à tous,
Eh bien, la prochaine fois que j'ai un problème je regarderai l'aide Delphi avant de crier au bug.
Donc, en fait, Round( 29 / 2 ) = 14, ce n'est pas un bug...
Pour ceux qui se posent la question le problème vient de la représentation machine des flottants (qui sait représenter de manière exacte 1/3, mais pas 1/2).
J'ai écrit une fonction qui corrige le problème (ah non, pardon, ce n'est pas un bug) :
function Round2(f : Extended) : Int64
begin
Result := System.Round(f + 1e-9)
end;
Rigoureusement, ça ne corrige pas le problème dans tous les cas :
en effet, au delà d'un certaine valeur, le flottant ne sera pas affecté par 1e-9
(autrement dit : il faut creuser...)