A n'en plus rien comprendre. Deux même valeurs qui lors du test indique false

Résolu
Nargzul Messages postés 438 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 26 juillet 2007 - 14 mars 2006 à 16:53
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 - 15 mars 2006 à 10:29
Bonjour,

J'ai un tableau, dans lequel je dois tester si les chiffre du tableau sauf le dernier sont égaux au dernier chiffre de ce même tableau. C'est pour répérer une éventuelle périodicité dans un programme destiné à transformer les chiffre à virgule en chiffre à virgule binaire.

Donc lors du test rien ne marche.. après 1 petite heure de recherche d'erreur, j'ai trouvé ou se situe l'erreur. seulement j'y comprend plus rien.

C'est au moment du test:
x:=0;
while(x<i)do begin
if(tab[0][x]=tab[0][i])then finish:=true;
x=x+1;
end;

le i est le dernier chiffre du tableau employé, et le x est la valeur qui est incrémentée à chaque fois.

et lorsque c'était sensé passer true, cela continuait à chercher.

ne comprenant pas, j'ai mis des points de suivis sur tab[0][x] et sur tab[0][i] ainsi qu'un sur l'expression tab[0][x]=tab[0][i]

Et c'est de la que vient mon imcompréhension: tab[0][i] affiche 0,4 tab[0][x] fait de même, par contre l'expression me met false.

je me suis dis que c'était peut-etre comme sous java ou il faut faire des equals, mais même pas, car la c'est carrément le même objet qui est analysé les deux fois, mais bon dans le doute, j'ai transformé ma ligne de comparaison en: if(floattostr(tab[0][x])=floattostr(tab[0][i]))then finish:=true;
comme ca je compare bel et bien uniquement du texte. mais même résultat à la fin. je suis désespéré, et je sais franchement pas ou chercher...

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
15 mars 2006 à 04:29
unité Math :

function CompareValue(constA,B:Integer):TValueRelationship; overload;
function CompareValue(constA,B:Int64):TValueRelationship; overload;
function CompareValue(constA,B:Single;Epsilon:Single =0):TValueRelationship; overload;
function CompareValue(constA,B:Double;Epsilon:Double =0):TValueRelationship; overload;
function CompareValue(constA,B:Extended;Epsilon:Extended =0):TValueRelationship; overload;

<hr size="2" width="100%">

Finish := false;
i := high(Tab[0]);
while not finish do begin Finish :(CompareValue(tab[0,x], tab[0,i], 0.0002) EqualsValue);
inc(x);
end;

Epsilon definit pour les comparaisons sur réel l'aproximation d'egaltiée entre les deux nombres.

A < B +Ê (A est inferieur a au moins B ou B - Epsilon)

A = B +/-Ê (A est egale a B ou au moins B+ ou - Epsilon)
A > B +Ê (A est superieur a au moins B ou B + Epsilon)

CompareValue renvois respectivement
LessThanValue = -1 :: (A < B)ÊEqualsValue 0 :: (A B)Ê
GreaterThanValue = 1 :: (A > B)Ê

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
3
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
14 mars 2006 à 20:46
Si c'est un tableau 2D, déja l'acces à une case du tableau ca s'ecrit : tab[0,x]
ensuite ton bout de code là c'est pas propre:

x:=0;
while(xtab[0,x] = tab[0,i] then finish:=true; avec les espaces

Deuxio ton while bidule est inutile
for x:=0 to i-1 dofinish:tab[0,x] tab[0,i];

Troisio un test = avec des nombres a virgules, euh bof .

Et pour finir en beauté, t'es obligé de convertir tes nombres en string pour pouvoir accéder au niéme chiffre apres la virgule !
0
Nargzul Messages postés 438 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 26 juillet 2007 4
15 mars 2006 à 07:35
Bon, déjà merci pour vos réponse.

@DeltaFX:
-Pour les tableau je savais pas, j'ai toujours utilisé cela en delphi, et ca avait toujours marché jusqu'a ce que tu me dise que c'est po le cas ^^
-Pour la lisibilité, j'y penserai à l'avenir
-développe ce que tu veux dire avec mon égal? mon chiffre à virgule n'en contient que 3 ou 4 maximum, donc c'est pas si grand... et c'est jamais un nombre infini, car c'est l'utilisateur qui les rentre, et les seules opération qu'on fait dessus, c'est des *2.
-Vu la réponse après toi, ya plus simple(et pour rappel, j'ai déjà essayé de transformer mes valeurs en string)

@Foxi
-c'est exactement ce qu'il me faut, maintenant le test marche!!! Merci mille fois!(j'avais vu cette fonction, mais je savais pas ce qu'était EqualsValue)
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
15 mars 2006 à 10:29
Facile : le point 3, le test = sur des nombres à virgule c'est pilpoil ce qu'a dit Foxi juste apres, il faut passer par les CompareValue et leur donner un epsilon. Ignorant moi aussi l'existance de CompareValue, pour faire des test je passais par :

J'ai besoin de 5 chiffres significatifs donc je multiplie les trucs a comparer par 100000, un coup de "trunc", je cast en integer et apres je teste.

D'ailleurs pour ta recherche de périodicité dans les décimale, tu peux essayer :
si x est ton nombre a tester

for i =1 to 10 do {test sur 10 decimales}
begin
e:= power(10,i)*X - X
if e < 0.000001 then {un truc tres petit}
begin
finish:= true;
break;
end;
end;
0
Rejoignez-nous