[EX] Aritmetica floating point e media

Messaggioda feddy » 05/03/2020, 01:55

Visto che ultimamente questo argomento è in voga in questa stanza, ho trovato questo esercizietto carino :D

Dato il vettore $$[1.7 \cdot 10^{308}, 1.6 \cdot 10^{308}, 1.5 \cdot 10^{307},1.2 \cdot 10^{308}]$$ calcolarne la media aritmetica (in MatLab/Python/...)
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2646 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: [EX] Aritmetica floating point e media

Messaggioda axpgn » 05/03/2020, 12:13

In Just Basic dà il risultato esatto ma se si usano gli interi …
axpgn
Cannot live without
Cannot live without
 
Messaggio: 15072 di 40677
Iscritto il: 20/11/2013, 22:03

Re: [EX] Aritmetica floating point e media

Messaggioda feddy » 05/03/2020, 12:33

Purtroppo non conosco Just Basic, hai per caso usato una qualche funzione di tipo "media"? Perché in precisione doppia la somma di solo due di quelle componenti va in overflow, non so cosa faccia Just Basic dietro le quinte .
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2647 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: [EX] Aritmetica floating point e media

Messaggioda axpgn » 05/03/2020, 12:44

No, non so se esista un comando "Media" (non sono un programmatore, conosco giusto quattro istruzioni :-D )

Ecco il codice (si fa per dire :D )

Codice:
a=17*10^307
b=16*10^307
c=15*10^306
d=12*10^307

M=(a++b+c+d)/4

print M


Ed ecco il risultato

Codice:
116250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


Proverò a cercare se esiste un comando "Media"

Cordialmente, Alex

P.S.: Just Basic è una versione "semplice" e free di Liberty Basic; mi pare che adesso sia rimasto solo quest'ultimo e Just Basic non sia più supportato.
L'ho scoperto proprio qui sul Forum qualche anno fa.
Allora non avevo (e non ho) strumenti per gestire "grandi numeri", avevo provato anche a gestirli in Excel "spaccandoli" quando avevo la necessità di farlo (per qualcuno dei miei problemi/giochini), quando per caso un utente del forum, nel risolverne uno di questi, mi disse che aveva usato questo linguaggio.
Ed in effetti, gestisce grandissimi interi senza problemi e velocissimamente su un normale notebook. :wink:
axpgn
Cannot live without
Cannot live without
 
Messaggio: 15074 di 40677
Iscritto il: 20/11/2013, 22:03

Re: [EX] Aritmetica floating point e media

Messaggioda feddy » 05/03/2020, 13:26

Uhm, occhio che però nel codice che hai scritto hai un "+" di troppo. Cosa ti risulta scrivendolo giusto?
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2648 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: [EX] Aritmetica floating point e media

Messaggioda axpgn » 05/03/2020, 13:37

Ahah, non mi sono accorto di aver incollato qui la versione con l'errore :D
Così non girava, l'ho corretto e il risultato (giusto) è quello che vedi.
Se li scrivo nel formato tuo , va in overflow ma con gli interi non c'è problema :D
Con una piccola modifica gli faccio stampare il risultato così $1.1625e308$
axpgn
Cannot live without
Cannot live without
 
Messaggio: 15075 di 40677
Iscritto il: 20/11/2013, 22:03

Re: [EX] Aritmetica floating point e media

Messaggioda feddy » 05/03/2020, 13:54

Ok, sicuramente Just Basic usa quello che viene chiamata "Arbitrary Precision Arithmetic", in un modo o nell'altro.

Lo scopo dell'esercizio è quello di lavorare però usando lo standard in uso, quindi usando un qualche accorgimento per evitare l'overflow, ricordando che la macchina lavora in base $2$.
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2649 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: [EX] Aritmetica floating point e media

Messaggioda feddy » 05/03/2020, 18:39

Un modo per risolverlo è

Testo nascosto, fai click qui per vederlo
scrivere $M=\frac{a+b+c+d}{4}$ come $$(\frac{a}{N} + \frac{b}{N} + \frac{c}{N} + \frac{d}{N})(\frac{N}{4})$$
con $N=2^k, \quad k \in [2, U]$ con $k$ naturale e $U=1023$ su MatLab/Python.

Questo perché la divisione di un numero in floating point (binario) per 2 è esatta (come la moltiplicazione) . Se si fosse diviso per 10, ad esempio, gli arrotondamenti avrebbero portato ad un risultato errato.
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2652 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA


Torna a Analisi Numerica e Ricerca Operativa

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite