Division par un entier erronée

Résolu
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 10 mai 2007 à 15:33
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 10 mai 2007 à 16:53
Salut a tous, je viens de remarquer quelque chose d'etrange, et je voudrai savoir si quelqun a deja rencontré ce probleme, et sait d'ou cela peut venir.
voila le petit bout de code dont le resultat est assez etrange.

var
    txt : string;
    i, n: integer;
    e: extended;
begin
  txt := '';
  n := 1;
  for i := 1 to 30 do
  begin
    txt := txt + inttostr(i)+'='+FloatToStrF(1/n, ffFixed, 18, 20)+#10+#13;
    n := n*10;
  end;
  ShowMessage(txt);
end;

je calcule les differentes valeurs de 10^-n, et jusqu'a 10^-10 ca va, ensuite les resultats sont tout bidon.

par contre, en faisant "n :extended;", tout fonctionne correctement. Il semblerait que la division par un entier donne un resultat faux...
quelqu'un a t'il deja rencontré ce probleme?

4 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
10 mai 2007 à 16:41
Normal, puisque N vas aller de 1e+0 a 1e+29 alors comme le maximum est :
2,1e+9 pour integer, 4,3e+9 pour cardinal et 9,2e+18 pour int64
tu ne peu donc pas utiliser de type entier pour N ...
sois Single, Double ou Extended (le plus precis)

var
  i : integer;
  n : extended;
begin
  with TStringList.Create do
  try
    BeginUpdate;
    n := 0.1;
    for i := 1 to 30 do
    begin
      n := n*10;
      Add( format('%d = %.0e',[i, 1/n]) );
    end;
  finally
    EndUpdate;
    ShowMessage(Text);
    Free;
  end;
end;

<hr size="2" width="100%" />Croc (click me)
3
dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
10 mai 2007 à 15:49
Est-ce lié au paramètre de precision ?

Dom
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
10 mai 2007 à 16:18
Non je ne pense pas, un FloatToStr basique entraine la meme erreur!
je pense plus que ca vient de la division par un entier, mais je ne sais pas par quelle unité elle est effectuée, et je suppose que c'est en assembleur ...

PS: je suis sous delphi 7 .1 (=delphi 7 build 8.1)
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
10 mai 2007 à 16:53
houlala j'suis fatigué moi !!!
effectivement, si je puis me permettre, je suis vraiment trop con ...

merci de m'avoir remis sur le droit chemin foxi :p
0
Rejoignez-nous