Oppure

Loading
08/12/10 3:53
Giarados
Il titolo non descrive assolutamente la domanda. Ma è l'unica cosa che mi viene in mente alle 4:40 del mattino :rofl:

Sto cercando di approssimare π alle prime 67 cifre decimali.

Non so quanto impiegherà il mio pc a terminare l'elaborazione, però nel frattempo mi è venuto un dubbio.
long unsigned int a,b;
while(a+b<=8589934590)
{
 [...]
}


Si può scrivere? Il compilatore mi avverte con un:
test.cpp:8: warning: integer constant is too large for ‘long’ type
Ultima modifica effettuata da Giarados 08/12/10 4:03
aaa
08/12/10 10:03
Pitagora
prova con un
long long unsigned int
Ultima modifica effettuata da Pitagora 08/12/10 10:03
aaa
08/12/10 11:01
Giarados
Con un bel po' di warnings me lo ha fatto passare ;)

Si ripropone per lo stesso problema: si può scrivere ciò che segue
if(a+b == 36893488147419103230)
{
 [...]
}


??
aaa
08/12/10 11:14
Pitagora
presumo che il codice sia questo

long unsigned int a,b;
while(a+b<=8589934590) { if(a+b == 36893488147419103230) { [...] } }


Il programma non entrerà mai nelle istruzioni associate a quell'if perchè 36893488147419103230 è maggiore di 8589934590 e quindi quando a+b sono maggiori di uno a 8589934590 (8589934591) il programma esce dal ciclo. Cmq non penso che ci sia un dato che riesca a contenere tutto questo numero: 36893488147419103230 Troppo grande. Ho persino problemi a leggerlo :rofl:

Ma che ci devi fare?
aaa
08/12/10 11:25
Giarados
No, il codice sarebbe questo:
long long unsigned int a,b;
while((a<=18446744073709551613) && (b<=18446744073709551613))
{
	if(a+b == 36893488147419103226)
	{
		[...]
	}

	a++;
	b++;
}


Il problema è che non ho modo di fare test! Ci starebbe giorni il mio pc ad incrementare a e b sino a quei valori.

Devo approssimare PI GRECO alle prime 67 cifre decimali :rofl:

Nota:
ho fatto un "esperimento" con due variabili char (tenendo conto degli opportuni range) e il tutto funge. Ora non so se lo stesso discorso sia valido per 36893488147419103226 e non ho modo di verificarlo ma se così fosse, su una macchina molto più potente di quella che uso, si potrebbe calcolare PI GRECO con una maggiore approssimazione utilizzando due contatori separati tali che (a+b)%2==1 (sempre).
Ultima modifica effettuata da Giarados 08/12/10 11:38
aaa
09/12/10 21:34
lumo
sapere il range di un tipo di dato è semplice, sapendo quanti byte occupa.
Fai un piccolo programma dove stampi sizeof( tipo_di_dato )
facciamo finta che il tuo ulong valga 4 byte
trasformiamo i byte in bit: 32 bit.
il range non è altro che 0-2^32-1. Non ne sono sicuro, ma penso che si possa dimostrare attraverso la serie geometrica.
nel caso sia signed, allora diventa -2^32/2 - 2^32/2-1
più semplicemente però, puoi includere <limits.h>
nel tuo caso avresto potuto fare
printf("range: [%d;%d]", 0, ULONG_MAX );
in C++ ancora più semplicemente numeric_limits< tipo >::max o ::min
aaa
10/12/10 0:33
Giarados
Non ci capiamo :rotfl:

Quello mi avete detto voi già lo so. Cerco di formulare meglio la domanda.

Avendo due variabili di tipo unsigned long long, mettiamo a e b:
unsigned long long a,b;


Io so che 0<=a>=18.446.744.073.709.551.615 e che b appartiene allo stesso intervallo di valori.

Poniamo K=18.446.744.073.709.551.615.

Posso valutare se
a+b==2*K;

???

Posso utilizzare la somma di a e b come operando nei calcoli?

Oppure essendo tale numero fuori dal massimo range gestibile si genera qualche genere di errore?!

Io dai miei "esperimenti" ho desunto che è possibile farlo.

Applicazione pratica:
Devo calcolare le prime 68 cifre di pi_greco, so che:
pi_greco==4-(4/3)+(4/5)-(4/7)+(4/11)-(4/13)...
Per avere la migliore approssimazione possibile sulla mia macchina devo cercare di utilizzare tutte le cifre che il tipo dato con il più largo range (long double) per far ciò devo portare il 3 di 3.14159265[...] il più a sinistra possibile.
Ponendo dunque:
m=10000000000000000000000000000000000000000000000000000
ottengo che
m*pi_greco==m*4-(m*4/3)+(m*4/5)-(m*4/7)+(m*4/11)-(m*4/13)...

Avevo pensato, per ottenere una migliore approssimazione, di utilizzare due contatori separati ma non sapevo se era possibile effettuare una divisione per quei numeracci anche perchè fuori range. Adesso ho capito che si può fare.

Ma non ho concluso egualmente nulla: dividendo 4*m per 2*k ottengo un numero con più di venti cifre. :rotfl:

Anche se non mi alletta l'idea mi sa che dovrò dichiarare i due contatori come long double. :(
Ultima modifica effettuata da Giarados 10/12/10 0:34
aaa