Bug dans Foxpro ?????

Résolu
Datadis Messages postés 8 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 1 décembre 2004 - 18 oct. 2004 à 16:25
FredArmoni Messages postés 153 Date d'inscription vendredi 2 mai 2003 Statut Modérateur Dernière intervention 2 avril 2010 - 6 mai 2005 à 12:50
Bonjour à vous tous...

Peut-être quelqu'un va t'il trouver une réponse à ce bug lié aux décimales dans Foxpro (testé en version 7, 8 et 9).

par exemple
?63.2250000000000000000 affiche 63.2250000000000000000

?64.2250000000000000000 affiche 64.2259999999999990000

Foxpro fait la même "erreur" entre 64 et 81... allez comprendre pourquoi !!!!

De ce fait, la fonction round() pose aussi problème, en effet
? round(63.2250000000000000000,2) donne 63.23
? round(64.2250000000000000000,2) donne 64.22

par contre, si on limite les décimales à 10, aucun problèmes
? round(round(64.2250000000000000000,10),2) donne 64.23

J'ai remarqué ce phénomène uniquement entre 64 et 81. Les tests peuvent sembler tordu, mais dans mon domaine, on a souvent besoin de pus de 10 décimales pour travailler.

Toute réponse est bienvenue

Thierry

14 réponses

FredArmoni Messages postés 153 Date d'inscription vendredi 2 mai 2003 Statut Modérateur Dernière intervention 2 avril 2010
28 oct. 2004 à 21:36
J'ai rapporté ce bug (je fais partie de la beta test), il m'a été confirmé à l'instant. Le correctif devrait être dans la version finale de VFP9.

et donc, pour la VFP Team, Merci .

[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox
MS MVP VFP
3
FredArmoni Messages postés 153 Date d'inscription vendredi 2 mai 2003 Statut Modérateur Dernière intervention 2 avril 2010
18 oct. 2004 à 18:09
tu peux faire ce test dans n'importe quel langage, tu auras le même résultat. C'est le défaut des valeurs numériques à virgule flottante... le double :
double 15 digits représentatifs.
double long 19 digits représentatifs.

[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox
MS MVP VFP
0
FredArmoni Messages postés 153 Date d'inscription vendredi 2 mai 2003 Statut Modérateur Dernière intervention 2 avril 2010
18 oct. 2004 à 18:20
pour info la limite :

? round(64.225000000000+0.00000000000001,2)

[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox
MS MVP VFP
0
Datadis Messages postés 8 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 1 décembre 2004
18 oct. 2004 à 18:23
oui, mais pourquoi seulement avec 4, entre 64 et 81, entre 1024 et 1310, et enore plus loin (je n'ai testé qu'avec les valeurs entre 1 et 10000 ?

Les autres valeur, même en virgule flottante sont correctes.

En passant, si dans l'analyseur de requete de SQL tu tapes
PRINT ROUND(64.2250000000000000000,2) il affiche la bonne valeur, soit... 64.230000000000000000
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
FredArmoni Messages postés 153 Date d'inscription vendredi 2 mai 2003 Statut Modérateur Dernière intervention 2 avril 2010
18 oct. 2004 à 18:39
Effectivement,...

J'enquête...

@+

[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox
MS MVP VFP
0
Datadis Messages postés 8 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 1 décembre 2004
18 oct. 2004 à 18:46
ok... bonne enquête :-)

moi j'ai essayé jusqu'au binaire des parties entières... tout ce que j'ai remarqué comme point commun, c'est que ...

4 -> 0101
64 -> 0101 0000
1024 -> 0101 0000 0000
16384 -> 0101 0000 0000 0000
etc....

pour les chiffres 81 et 1310, je vois pas de point commun ...
0
FredArmoni Messages postés 153 Date d'inscription vendredi 2 mai 2003 Statut Modérateur Dernière intervention 2 avril 2010
22 oct. 2004 à 14:15
Datadis,

aurez tu un bout de code qui met en valeur ce pb ?
comment as tu testé les valeurs 1 à 10000

dans mon test, seul la valeur 4.22500000 pose problème alors qu'en ligne de commande 64.22500000 aussi...

[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox
MS MVP VFP
0
Datadis Messages postés 8 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 1 décembre 2004
22 oct. 2004 à 14:41
oui, le bout de code est assez simple...

LOCAL i,y,z

CLEAR
STRTOFILE("","c:\test.txt",0)

FOR i = 1 TO 100000
y = i + .225000000000000
z = i + .23
IF ROUND(y,2)<>z THEN
STRTOFILE(STR(i)+CHR(13)+CHR(10),"c:\test.txt",1)
ENDIF
NEXT

Il suffit ensuite d'aller lire le fichier résultat... ce sont les chiffres avec erreur d'arrondis
0
FredArmoni Messages postés 153 Date d'inscription vendredi 2 mai 2003 Statut Modérateur Dernière intervention 2 avril 2010
28 oct. 2004 à 21:27
MS confirme ton bug
Le correctif devrait arriver dans la prochaine

Merci

[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox
MS MVP VFP
0
Datadis Messages postés 8 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 1 décembre 2004
28 oct. 2004 à 21:30
comment as tu eu la confirmation de MS?

J'ai testé avec la version 9 (beta) de Foxpro... le bug est toujours là. Va t'il disparaître avec la version finale?
0
Datadis Messages postés 8 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 1 décembre 2004
28 oct. 2004 à 21:47
Est ce grâce à nous autre que ça va être corrigé? :-)
0
FredArmoni Messages postés 153 Date d'inscription vendredi 2 mai 2003 Statut Modérateur Dernière intervention 2 avril 2010
29 oct. 2004 à 08:46
Oui. Ca sert à ça la remontée de bug ;)

[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox
MS MVP VFP
0
Datadis Messages postés 8 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 1 décembre 2004
29 oct. 2004 à 14:18
Coooooollll :-))

J'vais demander une tite récompense à Bill !!!
0
FredArmoni Messages postés 153 Date d'inscription vendredi 2 mai 2003 Statut Modérateur Dernière intervention 2 avril 2010
6 mai 2005 à 12:50
Un peu tard mais, l'explication est là :

il faudrait que tu ailles faire un tour sur le blog de Calvin (vfpteam)
http://blogs.msdn.com/calvin_hsia/archive/2005/04/13/407902.aspx

* EXPLAIN
* you can look that the value stored is a approximation of I.225,
* when the value is < I.225, the direct round fail

LOCAL i,y,z
CLEAR
SET DECIMALS TO 0
FOR i = 1 TO 4
y = i + .2250000000000
z = i + .23
?i,ROUND(Y,12),(y-I)*10000000000000,ROUND(y,2)<>z,ROUND(ROUND(y,12),2)<>z
NEXT

* then the solution is simple if you known the left zero position,
* otherwise you have to found it !!!!!
LOCAL i,y,z
CLEAR
STRTOFILE("","c:\test.txt",0)
FOR i = 1 TO 100000
y = i + .225000000000000
z = i + .23
IF ROUND(ROUND(y,3),2)<>z THEN
STRTOFILE(STR(i)+CHR(13)+CHR(10),"c:\test.txt",1)
ENDIF
NEXT
MODIFY FILE "c:\test.txt"

[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox
MS MVP VFP
0
Rejoignez-nous