Newsgroup: it.comp.lang.vo-clipper
Titolo: Risultati test Round()

Ciao a tutti.
Vi comunico i primi risultati dei test ma de effettuati sulle round.
Le round testate sono:
1) Quella di Clipper
2) quella di EMG con l'EPS dinamico.
3) la mia con le stringhe ottimizzata senza l'elevamento a potenza.
4) la mia con le stringhe e l'elevamento a potenza.
5) quella di EMG con le stringhe.
5) quella di Diego Decandia.
Ho provato tutti i valori da 0 a 40 step 0.000001 arrotondati con 2
decimali.
Risultato: Tutte le round ritornano gli stessi valori nella maggior parte
dei casi. Quando questo non è vero, l'unica a sbagliare è quella originale
di Clipper.
La cosa interessante comunque non è questa.
Ho notato che quando quella di Clipper sbaglia, è sempre con un numero a 3
decimali ed il terzo è un 5 (es. 8.155, ma non 8.155001).
Ho fatto quindi qualche altra prova ed ho ciclato i numeri da 0 a 1 step
0.000001, facendo l'arrotondamento a 3 e 4 decimali.
Ho ottenuto gli stessi casi di errore: quando la funzione sbaglia, è sempre
con un numero che ha un decimale in più rispetto a quelli voluti, e questo è
un 5 , tipo round(8.155,2) , round(0.5005,3) e round (0.00015,4).
Se le cose stanno davvero così, ne consegue che la semplice round2 di EMG
che aggiunge 1 in coda al numero è necessaria e sufficiente a correggere
l'errore della round() originale in tutti i casi.
C'è qualcuno che può confermare o smentire questa ipotesi ?.
In attesa di vostre nuove continuo a macinare numeri....
Ciao.
Davide.

Ok, sono andato un po oltre ed ho ciclato tutti i numeri fino a 150 step
0.000001 . Stessi risultati.
Assumendo che la mia ipotesi precedente sia corretta, ho quindi modificato
la funzione di test in modo che setti lo step in funzione del numero di
decimali da utilizzare con la round ed ho trovato gli stessi identici casi
di prima, ma questa volta in pochi minuti.
Vi posto il test con un'altra osservazione: quando il numero di decimali è
negativo, la round di Clipper è sempre ok. (Che sia perchè il risultato
finale è sempre intero ?).
Ciao.
Davide.
Function TEST()
     LOCAL nErr := 0
     LOCAL nTot := 0
     LOCAL CRLF :=chr(13)+chr(10)
     LOCAL i,j,nUL,cr,cr2,cr3,cr4,cr5,cr6,tim1:=time()
     FOR j = -2 TO 3                  // decimali
     nUL:=fcreate("TEST.D"+ltrim(str(j)))
     If nUL==-1
       ? "Errore: Impossibile creare il file"
       quit
     Endif
     SET DECIMALS TO abs(j)+1
     FOR i = -1000 TO 1000 STEP 10^-(abs(j)+1)
         i = VAL( STR( i ) )
         ? i,j
         ? ROUND ( i, j )       // Clipper
         ? ROUND2( i, j )      // EMG EPS
         ? ROUND3( i, j )      // Mia Ultima
         ? ROUND4( i, j )      // Mia Precedente
         ? ROUND5( i, j )      // EMG Stringhe
         ? ROUND6( i, j )      // Diego Decandia
                               // ... fino a 24
         cr6:=SAVESCREEN(ROW()  ,1,ROW()  ,50)
         cr5:=SAVESCREEN(ROW()-1,1,ROW()-1,50)
         cr4:=SAVESCREEN(ROW()-2,1,ROW()-2,50)
         cr3:=SAVESCREEN(ROW()-3,1,ROW()-3,50)
         cr2:=SAVESCREEN(ROW()-4,1,ROW()-4,50)
         cr :=SAVESCREEN(ROW()-5,1,ROW()-5,50)
         IF (cr  <> cr2) .or. (cr2 <> cr3) .or. (cr3 <> cr4) .or. ;
            (cr4 <> cr5) .or. (cr5 <> cr6)
           fwrite(nUL,"Valore:"+Str(i)+" Decimali:"+Str(j)+CRLF)
           fwrite(nUL,"Round :"+cr +CRLF)
           fwrite(nUL,"Round2:"+cr2+CRLF)
           fwrite(nUL,"Round3:"+cr3+CRLF)
           fwrite(nUL,"Round4:"+cr4+CRLF)
           fwrite(nUL,"Round5:"+cr5+CRLF)
           fwrite(nUL,"Round6:"+cr6+CRLF)
           // ....
           nErr++
         ENDIF
         nTot++
     NEXT i
     fwrite(nUL,"Totale:"+Str(nErr)+Str(nTot)+" "+LTRIM( STR( nErr / nTot *
100 ) ) + "%" +CRLF)
     nErr:=0
     nTot:=0
     If ! fClose(nUL)
       ? "Errore: Impossibile chiudere il file di log"
     Endif
     NEXT j
     ? tim1,time()
     RETURN NIL

 finale è sempre intero ?).
Uhm... se ricordo bene trovai dei casi in cui la ROUND() originale
falliva anche con numeri interi. O mi sto confondendo?...
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 falliva anche con numeri interi. O mi sto confondendo?...
Ne abbiamo discusso talmente tanto che fatico a tenere assieme il tutto.
Comunque era solo una considerazione, tanto per vedere se a qualcuno faceva
scattare qualche "lampadina", ma non cambia lo stato delle cose. Sembra che
più soluzioni siano valide, e tutte queste non discriminano il fatto che il
numero sia intero o meno...
Ciao.
Davide.

> Vi posto il test ....
Dimenticavo una cosa importante: non provate a far girare il test con la
round a 4 decimali, perchè genera un file di log di 150Mb quando il numero è
ancora a -600 (dopodichè mi si è piantato il PC per mancanza di risorse
:-( ).
Ciao.
Davide.