Newsgroup: it.comp.os.linux.sys
Titolo: xcalc non funziona

Ho scoperto un giorno fa che xcalc, la calcolatrice "di serie"
presente su Linux, fa alcuni calcoli errati.
 
Nello specifico, in alcuni casi arrotonda all'intero. Cosě a
tradimento.
 
Non so esattamente quali siano le condizioni. Forse oltre una certa
cifra... non ho trovato niente nella documentazione, e
nell'interfaccia non c'č niente che riguardi l'arrotondamento.
 
Ecco, non usatela per verificare l'allineamento delle partizioni.
 
-- 
Ci sono 10 tipi di persone al mondo: quelle che capiscono il sistema binario
e quelle che non lo capiscono.

>>>>  
http://www.bb2002.it
 :)  <<<<<
........... [ al lavoro ] ...........

non li vuoi rendere noti al pubblico? ;)
 
Ma no dai, a cosa servirebbe dividere il codice del bancomat? Già ci
sono pochi soldi così... :-)
 
Prova a dividere 133146719 per 8. Anche senza fare la controprova,
potrà un numero dispari essere divisibile per 8?


 
 
confermo
16,643,339.875 è il risultato che mi da un programma diverso
 
ho provato anche a moltiplicare per l'inverso di 8 ma si ottiene lo stesso 
risultato
 
a proposito, nel xcalc che ho usato manca il tasto della divisione /, però 
lo accetta da tastiera
 
gcalc funziona correttamente


 
 
c'è! c'è!
il tasto mostra una , invece di una /


 gcalc funziona correttamente
 
 
Il mio vecio KCalc dice che fa 16643339.875
 
 
-- 
AIOE °¿°  

Il mio vecio KCalc dice che fa 16643339.875
 
Anche il mio.
E' solo xcalc che dà i numeri.


 
 
;)


>> tradimento.
 
Precision limits on integer values
Integers in [ − 16777216 , 16777216 ]  can be exactly represented
Integers in [-33554432,-16777217] or in [ 16777217 , 33554432 ] round to a multiple of 2
 
 
Probabilmente utilizza i float a 32bit.
Qualche strano residuo del passato visto che sono 20 anni che gli x86 hanno il coprocessore(dal primo pentium) e quindi l'aritmetica
a doppia precisione(che comunque in una calcolatrice la fai tranquillamente via software).
 
 
Giulia
 
 

 E' solo xcalc che dà i numeri.
 
Confermo.
Peró credo che la cosa sia dovuto ad un errore ancestrale che si ripete nel
temp.
Mi spiego.
Il problema di errori di calcolo (moltiplicazioni e divisioni) si ripete (a mia
conoscenza) dal mitico apple //, nelle routines di applesoft basic.
Nella calcolatrice sinclair scentific (quella di Sir Sinclair)
Poi lo stesso errore fu riscontrato in alcune versioni di excel.
A memoria, ricordo che era dovuto ad un mancato riporto tra 2 bytes in una
specifica posizione nell'algoritmo di calcolo.
Tale errore si verificava solo su alcuni numeri che provocavano il riporto in
quella posizione.
Sono analisi che lessi una ventina (e forse piú) di anni fa...
 
 
-- 
+---------------------------------------------------------------------------+
|                 Se vai a letto con il culo che prude,                     |
|           ti svegli con il dito che puzza!! (proverbio cinese)            |
+-----#37--------------------Campagna contro le pubblicita` idiote.---------+

>>> tradimento.
 
non a tradimento, glielo hanno ordinato (sbagliando) i programmatori
 
con
 
sprintf(dispstr,"%.8g",dnum);
 
ma essendo dnum un double e' concettualmente sbagliato
e dovrenne essere
 
sprintf(dispstr,"%.16g",dnum);
 
visto che in un double le cifre decimali significative sono circa 16.
 
Se avete volglia  provate a fare una segnalazione del bug al maintainer.
 
Comunque internamente invece funziona giusto e non perde precisione ne arrotonda.
 
 
Giulia
 
 
 
sotto il pezzo di codice:
 
 
void
equf(void)
{
   flagINV=0;
   if (!entered)
     return;
 
   clrdisp=CLR=1;
   Dpoint=exponent=0;
 
   if (entered==1)
     parse_double(dispstr,"%lf",&dnum);
   entered=2;
 
   PushNum(dnum);
 
   while (!isopempty()) {  /* do all pending ops */
     dnum=PopNum();
     acc=PopNum();
     lastop=PopOp();
     switch (lastop) {
     case kADD:  acc += dnum;
		break;
     case kSUB:  acc -= dnum;
		break;
     case kMUL:  acc *= dnum;
		break;
     case kDIV:{  printf("Divisione %f : %f \n",acc,dnum);
					acc /= dnum;
                  printf("Risultato %f\n",acc);
			  }
		break;
     case kPOW:  acc = pow(acc,dnum);
		break;
     case kLPAR:	flagPAREN--;
		PushNum(acc);
		break;
     }
     dnum=acc;
     PushNum(dnum);
   }
 
   sprintf(dispstr,"%.8g",dnum);
   DrawDisplay();
}
 

 specifica posizione nell'algoritmo di calcolo.
Si probabilmente ai tempi del 386, dal 486 (1989) in poi tutta la matematica e' effettuata in hardware!!!
 
Giulia
 
 

 precisione ne arrotonda.
 
 
Quindi l'errore è nella presentazione sullo schermo.
 
 
case kDIV:{  printf("Divisione %f : %f \n",acc,dnum);
                                   acc /= dnum;
             printf("Risultato %f\n",acc);
                     }
           break;
 
 
Ma è scritto in italiano?
 
 
-- 
AIOE °¿°  


Scusa quello e' debug aggiunto da me !!
 
Volevo essere sicura che non ci fossero magagne sulle "librerie" e non volevo spulciarmi l'assembler generato!
 
Giulia
 
 
Giulia