Newsgroup: it.comp.lang.vo-clipper
Titolo: Yet another Round() !

Dai test che ho fatto finora pare che possa funzionare...
// (forse)Arrotonda un numero
func MayRound(n, dec)
  local neg := (n < 0)
  local r := iif(neg, -n, n)
  local err, tmp
  if (dec == 0)
    r := int(r + 0.5)
  elseif (dec < 0)
    dec := 10 ^ -dec
    r := int((r + dec / 2) / dec) * dec
  else
    dec := 10 ^ dec
    err := 1 / (dec ^ 2)
    tmp := r * dec
    if (abs(int(tmp) - tmp) > err)
      r := int(tmp + 0.5 + err) / dec
    end
  end
return iif(neg, -r, r)
E' possibile ottimizzarla, di fatto tutte le elevazioni a potenza
possono essere tolte, pero' la posto cosi' perche' mi sembra piu'
leggibile.
Ne ho fatto anche una versione (piu' ottimizzata) in C, tanto per
testarne le prestazioni.
Mi pare abbastanza chiaro che il sistema utilizzato cambia a seconda
si debba arrotondare all'unita' o al decimale o ad una qualsiasi
potenza di 10, pertanto fornisco i risultati per ogni tipo di
operazione, i tempi (in microsecondi) sono stati rilevati su di un
Athlon 800 (Clipper 5.2e, RTLink) :
Arrotondamento al terzo decimale:
Round originale:	3.32 us
MayRound:	40.98 us
MayRound (C):	6.70 us
Arrotondamento all'unita'
Round originale:	3.16 us
MayRound:	8.32 us
MayRound (C):	2.60 us
Arrotondamento alle migliaia:
Round originale:	3.44 us
MayRound:	22.97 us
MayRound (C):	4.21 us
ciao, acc.   
a...@libero.it

 Dai test che ho fatto finora pare che possa funzionare...
Scusami tanto ma non ho più voglia di affrontare l'argomento. Mi
sembrava che fossimo ormai arrivati ad una conclusione accettabile. E
comunque nella tua funzione mi sembra ci siano troppe operazioni che
potrebbero dare problemi. Magari Davide potrebbe sottoporla al suo
solito test...
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

 Dai test che ho fatto finora pare che possa funzionare...
Comunque, per giustizia, ho misurato anche la velocità della tua. Sembra
la più lenta di tutte, mi dispiace... :-(


la più lenta di tutte, mi dispiace... :-(
Ueeee ueee'    :~-(
ciao, acc.   
a...@libero.it

 Dai test che ho fatto finora pare che possa funzionare...
ti consiglio di testarla con l'ultimo test che ho postato alcuni giorni fa.
Io non l'ho fatto perchè penso che più di una soluzione discussa allora sia
sufficientemente affidabile.
Resto comunque in attesa di qualcuno che possa sviluppare una round che ci
dia la certezza del funzionamento al 100%.
Se ti può servire per continuare le tue prove comunque, sappi che avevamo
accertato problemi nei risultati dell'operazione di elevamento a potenza.
Ciao.
Davide.

...<megacut>
Ma funziona solo nel mese di Maggio ??
(scusa ma non ho resistito -:)))
Ciao
Paolo R.

 func MayRound(n, dec)


 accertato problemi nei risultati dell'operazione di elevamento a potenza.
Dici? Non me lo ricordo. Potresti rinfrescarmi le idee al riguardo,
magari con un piccolo test che dimostri tali problemi?


 magari con un piccolo test che dimostri tali problemi?
Non ricordo con esattezza i termini della questione, perň non dovrebbe
essere un problema replicarlo. Stavo cercando di risolvere la round
moltiplicando il numero * 10^nDec , poi facevo INT(numero + 0.5), poi
dividevo nuovamente * 10^nDec.
Mi sono accorto quindi che il risultato della INT() era sbagliato. In un
primo tempo ho dato la colpa ad INT(), poi mi sono accorto che alcune
combinazioni di numeri che finivano con .5 (forse anche 1.265), una volta
elevati diventavano .49999999999 , quindi anche aggiungendo .5 il numero non
veniva arrotondato correttamente. Ne ho dedotto quindi che non č la INT()
che non funziona bene, bensě l'elevamento a potenza.
Ciao.
Davide.

 che non funziona bene, bensì l'elevamento a potenza.
Probabilmente più che un difetto dell'elevazione a potenza in sé siamo
in presenza dei soliti problemi di approssimazione dei floating-point.
