Newsgroup: it.comp.lang.visual-basic
Titolo: Stranezze di Access

Mi succede una cosa molto strana e vorrei sapere se sbaglio qualcosa o se e'
normale.
Prendete access aprite un database vuoto con una tabella
composta da due campi a precisione singola  A e B
inserite nei due campi 4,56 e 4000,25
poi uscite dalla tabella e create una query che moltiplichi i 2 campi
A mano il risultato della moltiplicazione dovrebbe essere
18241,14 mentre invece access mostra 18241,140625
Qualcuno mi sa dire xchč?
Ciao a tutti

 ha scritto nel messaggio
news:8jsr72$62l$1...@nslave1.tin.it...


 wrote in message


 Ciao a tutti
Innanzitutto non diciamo cazzate riguardo al fatto che access restituisce
piů cifre del dovuto.
Vediamo se riesco ad essere chiaro.
Supponiamo di avere come č un numero di bit a disposizione limitato per
scrivere
un numero in binario in fpu (singola precisione)
il numero 4000,25 puň essere facilmente scritto in binario com
111110100000,01
Se non capisci cerco di spiegarti a sinistra della virgola abbiamo le
potenze positive del due partendo da zero quindi da destra verso
sinistra avremo  (indicando con ^ l'elevamento a potenza)
0 * 2^0    = 0
0 * 2^1    = 0
0 * 2^2    = 0
0 * 2^3    = 0
0 * 2^4    = 0
1 * 2^5    = 32
0 * 2^6    = 0
1 * 2^7    = 128
1 * 2^8    = 256
1 * 2^9    = 512
1 * 2^10   = 1024
1 * 2^11   = 2048
------------------
totale     = 4000
Per la parte decimale invece le potenze sono negative
0 * 2^(-1) = 0
1 * 2^(-2) = 0.25
Quindi sommando il tutto avrei
  4000,25
Questo solo perchč perň 4000,25 č un numero decimale che in binario puň
essere rappresentato esattamente, ma la stragrande maggioranza
dei numeri decimali (so che č sbagliata una frase del genere)
non č rappresentabile esattamente con un numero finito di cifre binarie
lasciamo perdere la parte intera di  4,56 che č ovviamente
 100,.....
infatti 4=1*2^2+0*2^1+0*2^0 e concentriamoci sulla parte decimale.
Per ottenere la parte decimale si fa cosě
 prendo 0,56 lo moltiplico per 2
   0,56*
   2   =
   -----
   1,12   prendo 1 e lo sottraggo
   0,12*
   2   =
   -----
   0,24   prendo 0
   0,24*
   2   =
   -----
   0,48   prendo 0
   0,48*
   2   =
   -----
   0,96   prendo 0
   0,96*
   2   =
   -----
   1,92   prendo 1 e lo sottraggo
   0,92*
   2   =
   -----
   1,84   prendo 1 e lo sottraggo
   0,84*
   2   =
   -----
   1,68   prendo 1 e lo sottraggo
Non č come per 0,25 rappresentabile con un numero finito di cifre decimali
vediamo fino ad ora come č andata
ho preso:
1000111
che con il giochetto delle potenze negative del due č:
2^(-1) + 2^(-5) + 2^(-6) + 2^(-7) + 2^(-8) =
0,5+0,03125+0,015625+0,0078125+0,00390625=0,55859375
Non abbiamo 0,56
Supponiamo che
,1000111  venga approssimato con
,1001  =0,5625 (non č molto difficile approssimare cosě basta incrementare
di 2^(-8)=0,0039..
Avremo che Access moltiplica i due numeri:
4,5625*4000,25=18251,140625
Proprio quello che ottieni tu
Nono volevo essere pesante, volevo solo essere preciso e chiaro e farti
capire.
Singola precisione vuol dire che vengono utilizzati 32 Bit non vuol dire che
vengono usate meno cifre decimali, in doppia precisione i bit sono 64
quindi puoi capire che č notevolmente superiore la precisione con cui, un
numero
decimale non rappresentabile esattamente come binario, viene rappresentata.
Se vuoi ulteriori chiarimenti contattami.
Spero di esser stato chiaro
 Ciao   Danilo
 
mine...@libero.it