Nargzul
Messages postés438Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention26 juillet 2007
-
14 mars 2006 à 16:53
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDerniè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...
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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>
Nargzul
Messages postés438Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention26 juillet 20074 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)
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 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;