Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Strange and dangerous behaviour
Message
From
19/10/2004 09:29:32
 
 
To
19/10/2004 06:40:42
General information
Forum:
Visual FoxPro
Category:
Other
Miscellaneous
Thread ID:
00952515
Message ID:
00952583
Views:
6
Alessio, ti scrivo in italiano perchè ho poco tempo.

Su UT vi sono decine di membri che pensano di conoscere VFP solo perchè lo usano da 10 o 20 anni.

molti di questi ti diranno che io vedo solo bugs, ma è un fatto:
molti bugs sistemati in VFP8SP1 e VFP9 sono il risultato di un mio duro lavoro personale per controllare questa schifezza.
Sfortunatamente il mercato non offre molto, e se uno vuole fare qualcosa di esatto, o usa C++ oppure si spara in bocca.
VFP ha una porta sul C, e se non passo a NET 2005 probabilmente lo cannibalizzo dentro a un processo C.

Comunque per quanto riguarda i calcoli, la storia è molto lunga, ma il succo è questo:
se vuoi fare delle somme esatte devi usare i currency, non hai altra via perchè ogni altro numero è trattato come un double.
Il risultato è che se usi MSSQL e fai delle somme su MSSQL con dei decimal, oppure scarichi i decimal dentro a dei
numeric di VFP e rifai le somme in VFP, puoi ottenere risultati diversi.
Molti ti diranno di usare ROUND(), ma questa funzione non è sempre corretta ( la stessa MS lo ha ammesso ).
Lo stesso INT() in VFP8 ha un bug, corretto in VFP9, ma non è detto che non ve ne siano altri.
Ma, per quanti sforzi possano fare, è impossibile garantire la somma esatta usando i double.

Puoi trovare qualcosa in Message #871747
Dedicandoci del tempo, penso si possa trovare un esempio molto più semplice
CLEAR
s= 0.000000
v= 0.100000
FOR I=1 TO 1000000
	s = m.s + m.v
NEXT
? m.s, ROUND(m.s,6)
s= 0.000000
v= 0.100000
FOR I=1 TO 1000000
	s = ROUND(m.s + m.v,6)
NEXT
? m.s, ROUND(m.s,6)
s= 0.000000
v= 0.100000
FOR I=1 TO 1000000
	s = ROUND(m.s,6) + ROUND(m.v,6)
NEXT
? m.s, ROUND(m.s,6)
Quindi dovresti tappezzare il tuo programma di Round(), ma sono certo che esiste un controesempio
dove round non funzione.
Per rinforzare la cosa:
? round(3.9 * 55.15,2) - round(3.900000000 * 55.15,2)
Qualcuno ti dirà che il mondo non è perfetto, certamente VFP riporta ( come output ! ) dei risultati corretti nel 99.999%
dei casi, e ovviamente, finchè fai 3 somme e due moltiplicazioni con numeri banali il tutto è ok.

Ma, vai da un cliente, magari una banca, e quando gli proponi il pacch(o)etto gli dici:
"il programma qualche rara volta ti darà dei risultati leggermente sbagliati,
ma devi essere realista, il mondo non è perfetto!"
( a parte che a me sembra che il mondo sia fatto sufficientemente bene, e che non vi sono errori sistematici e quelli casuali
sono governati dalla costante di Planck, un numero piuttosto piccolo)

Io uso MS SQL, e questo non è perfetto ma certamente ha un livello professionale, e finora sui calcoli non ha mai ceduto.
Tutti i calcoli li faccio fare a MSSQL, VFP lo uso solo come interfaccia.

Spero di non averti rovinato la giornata.
Ciao.

>Fabio told me that VCX and SCX object are just vfp tables that can be edited with a simple browse command, he also told me that you cannot trust abiut VFP calculation and i asked him to tell me more about this "bug"
>
>E ora te speri di cavartela così ?
>più che una pulce mi hai piazzato un cammello nell'orecchio.... che è 'sta storia dei calcoli ?
>Comunque sapevo che le classi sono nient'altro che tabelle, ma conitnuo a non capire, ammesso che esista, il metodo per ovviare al piccolo inconveniente di cui all'oggetto :-)
>Comunque una cosa l'ho capita... è un gran bel casino !
>Alla luce di tutto ciò...secondo te conviene continuare a programmare in VFP o conviene passare ad un altro linguaggio (ammesso che ne esista uno affidabile) ?
>Tu cosa usi ? e soprattutto dormi sonno tranquilli ? :-)
>
>
>
>>Nonchalance, mi fai sorridere, se questo fosse il peggio, sarei ben felice.
>>( lo sai che non puoi fidarti di come fa i calcoli ?)
>>
>>Comunque, soprassediamo.
>>
>>VCX e SCX sono tabelle VFP. Se le apri con USE puoi facilmente vederlo.
>>Rapidamente,
>>Apri una classe, chiudi, sul command ti resta MODIFI .... OF ...,
>>riprendi la riga e cambia MODIFY ... OF con USE, enter.
>>BROWSE.
>>
>>Non è semplice ed intuitivo, ma cerco di spiegartelo:
>>VFP mette il codice ( p-code ) compilato in un campo memo dei VCX/SCX di nome ObjCode ( è il codice degli fxp),
>>quando tu apri una Classe/Form, VFP non analizza il codice ASCII ( come qualunque essere pensante farebbe ),
>>no!, lui prende il p-code, lo analizza, estrae i puntatori al codice sorgente che ha generato il p-code
>>e usa questi per estrarre le procedure dal campo methods ( dove c'è il programma ASCII ).
>>
>>Quindi, se per qualche motivo le due cose non vanno d'accordo,
>>oppure ( come penso ) la cosa è inutilmente complessa e VFP ha un bug che si può presentare ARANDOM,
>>i puntatori vanno per conto loro e ti estraggono o routine diverse ( come ti è capitato )
>>oppure ( come è capitato a me ) pezzi sparsi di routine diverse.
>>
>>Un vero gusto!
>>
>>Ciao.
>>Fabio
>>>Cavolo.... e me lo dici con questa nonchalance o..come diavolo si scrive ?
>>>'to fatto mi ha fatto usire pazzo per mesi e mesi... anni ormai ma come ho scritto interessava solo gli eventi close e open del dataenvironment, così mi risultava piuttosto semplice mterci una "pezza manuale".
>>>Cosa intendo per ObjCode... spiegami melio ch non ho capito bne cosa intendi dire.
>>>Grazie comunque
>>>Alessio
>>>
>>>
>>>What do you mean with the method code of ObjCode ?
>>>Thank you anyway
>>>Alessio
>>>
>>>
>>>>>Sometimes happens, and it happened since the VFP6 version that the code i put inside a method migrate in another one.
>>>>>Till today it happened only in the Dataenvironment. After some ununderstandable errors i go to see the code and what I wrote inside the open table event went inside the close table.. till today it was a little bit nasty but it was limited o these two events.
>>>>>Today the same thing happened in two method of a textbox object.
>>>>>Anyone knows anything about this ? how can i get rid of this problem ?
>>>>>Thank you
>>>>>Alessio
>>>>
>>>>Confermo, sia su VCX che SCX.
>>>>Quello che ho osservato è che il codice si scambia a coppie due metodi.
>>>>
>>>>Il problema nasce dal fatto che VFP usa sia il codice del campo Methods che il codice ObjCode
>>>>( se cambi il codice di Methods e ricompili senza prima cancellare ObjCode, non ottieni alcun effetto ).
>>>>Penso che ci sia un bug nei codice che correla Methods con ObjCode ( objCode è una sequenza di link a 16 bits )
>>>>Impossibile da riprodurre.
>>>>
>>>>I confirm, is on VCX that SCX.
>>>>What I have observed is that the code exchanges to braces two methods.
>>>>
>>>>I think, that the problem is born from the fact that VFP uses is the code of the Methods field that the ObjCode code
>>>>(if changes the code of Methods and compile without before to cancel ObjCode, does not obtain some effect).
>>>>Probably there is a bug in the code that correlates Methods with ObjCode (objCode is one sequence of link to 16 bits)
>>>>Impossible to reproduce.
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform