|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2005
Città: Livorno
Messaggi: 442
|
logaritmi
allora, io faccio la seconda liceo scientifico PNI, ma vorrei sapere qualcosa di più sui logaritmi. in particolare il problema che devo risolvere, e scrivere in java, è un programma che dato un numero mi restituisce il numero di byte necessari a memorizzarlo. in 1 byte ci stanno 256 combinazioni (2^8), in 2 byte 256*256, e così via. ora, se io conosco un numero, come faccio a risalire al numero di byte necessari? so che ci vogliono i logaritmi... booooh
ciao! |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Feb 2002
Città: Sanremo, Italy
Messaggi: 1941
|
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Oct 2005
Città: Livorno
Messaggi: 442
|
Quote:
![]() ciao! |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Apr 2002
Città: Sondrio
Messaggi: 701
|
Quote:
Il ragionamento sottostante è questo: se il numeo è compreso tra 0 e 256, quanto spazio ti serve? Uno e la formula data ritorna un valore tra 0 e 1. Se il numero è compreso tra 256 e 256^2? Due, e la funzione ritorna un valore tra 1 e 2. Spero di essere stato chiaro. Poi, nel caso non lo sapessi, il logaritmo in base 256 lo puoi ottere con il logaritmo in base qualsiasi in questo modo: logaritmo di x in base 256= log in base qualsiasi di X / log in base qualsiasi di 256 Le basi a destra dell'uguale devono essere le stesse. Spero di non aver detto minchiate, ma spero e credo proprio di no. Ciao. ![]()
__________________
Non ti curar di loro, ma guarda e passa. |
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Oct 2002
Città: Vicino Fermo Mercatino:più di 100 trattative tutte OK
Messaggi: 4651
|
dai, la soluzione e' semplice
![]() non serve logaritimi o che.... basta che dato un numero(es 10) lo trasformi in binario(es 1010). poi allochi un numero di bit equivalente pari al numero di cifre del numero in binario. ed hai fatto ![]() |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Oct 2005
Città: Livorno
Messaggi: 442
|
Quote:
ciao! |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
chiamiamo log10(x) il logaritmo in base 10 di x e log2(x) il logaritmo in base 2 di x.
per una nota proprietà dei logaritmi log2(x) = log10(x) / log10(2) per trovare il numero di bit necessari a rappresentare un numero x si ha che NBIT = eccesso( log2(x) ) = eccesso ( log10(x) / log10(2) ) dove con eccesso ho indicato l'operazione di arrotondamento per eccesso. per trovare il numero di byte puoi dividere il numero di bit per 8 e arrotondare nuovamente, oppure come giustamente detto prima puoi fare il logaritmo in base 256 NBYTE= eccesso( log10(x) / log10(256) ) per Java non so che dirti ...
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Oct 2005
Città: Livorno
Messaggi: 442
|
ho risolto con poche righe di codice, scrivo anche uno pseudo codice per i meno pratici.
public int bytes (int num) { String bynary = Integer.toBinaryString(num); int bits = bynary.length(); int bytes = 0; if (bits > 8) { bytes = bits/8; } bytes++; return bytes; } allora metodo pubblico restituisce un intero "byte" e prende un intero "num" { stringa "bynary" = valore binario di num; *fulcro del problema ![]() intero "bits" = lunghezza di bynary; intero bytes = 0; se bits > 8 allora { bytes = bytes/8; } bytes = bytes+1; restituisci bytes; } ciao a tutti e grazie sopratutto a Wing_Zero, che mi ha dato l'imbroccata per fare qualcosa di carino... ![]() ciao! |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Quote:
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
|
![]() |
![]() |
![]() |
#10 | |
Bannato
Iscritto dal: Oct 2002
Città: Vicino Fermo Mercatino:più di 100 trattative tutte OK
Messaggi: 4651
|
Quote:
![]() io programmo in C, il java non lo conosco... pero' se ti posso essere utile, ekkime qua ![]() |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Oct 2005
Città: Livorno
Messaggi: 442
|
allora il mio obbiettivo è ricever un numero intero e restituire i byte necessari a memorizzarlo, quindi invece di usare logaritmi e compagnia, visto che non ho la più pallida idea di cosa siano, se in java già ci sono e se no come implementarli, allora converto il numero in binario, che poi è come lo memorizza il pc, e guardo quanto è lunga la stringa. faccio la divisone per 8, e aggiungo 1 visto che con gli int se x/8=0,qualcosa lui mi da 0. mi sorge ora un dubbio, anzi vari:
la stringa che mi restituisce la funzione toBynaryString, è priva di spazi? e la misurazione della lunghezza, parte da 0 o da 1? boooooh... ciao! |
![]() |
![]() |
![]() |
#12 | |
Bannato
Iscritto dal: Oct 2002
Città: Vicino Fermo Mercatino:più di 100 trattative tutte OK
Messaggi: 4651
|
Quote:
penso che vada bene quella funzione, pero' il java non lo conosco :P |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Nov 2002
Città: Singularity
Messaggi: 894
|
Quote:
http://java.sun.com/j2se/1.5.0/docs/...naryString(int) Direi che la stringa ha come lunghezza il numero di bit. Come detto da Mixmar, il numero che puoi ottenere va da 1 a 4. Considera che con 32 bit hai già 4294967296 valori codificabili; in genere con grossi numeri si preferisce fare delle valutazioni "spannometriche" (usando le proprietà degli esponenziali e dei fattoriali ad esempio).
__________________
echo 'main(k){float r,i,j,x,y=-15;while(puts(""),y++<16)for(x=-39;x++<40;putchar(" .:-;!/>"[k&7])) for(k=0,r=x/20,i=y/8;j=r*r-i*i+.1, i=2*r*i+.6,j*j+i*i<11&&k++<111;r=j);}'&>jul.c;gcc -o jul jul.c;./jul |Only Connect| "To understand is to perceive patterns" Isaiah Berlin "People often speak of their faith, but act according to their instincts." Nietzsche - Bayesian Empirimancer - wizardry |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
ma gli int nn sono mica memorizzati sempre in 4 byte, riempiendo i bit prima del numero di zeri?
cmq venendo al punto, spieghiamo cos'è un logaritmo. il logaritmo è composto da una base e da un argomento(log a (b) = logaritmo in base a(a si scrive come pedice di log) di b). se ho che a^x=b, allora x = log a (b). in parole il logaritmo in base a di b è l'esponente da dare ad a per avere b.
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
Quote:
Non è possibile che Java(o qualsiasi altro linguaggio ad alto livello) non li abbia, per cui leggi il manuale ![]() poi come per tutti i problemi di informatica ci sono n-mila modi per risolverli, alcuni puù brevi ed altri più lunghi, sia in termini di istruzioni che di cicli macchina! ad esempio guarda questo modo che NON usa i logaritmi x = numero da convertire il codice è in C, ma ti ho evidenziato in rosso la parte fondamentale, che non dovrebbe essere difficile da convertire ad altri linguaggi Codice:
#include <stdio.h> #include <stdlib.h> int main(void) { int x,nbit,nbyte; x=1000; nbit=0; nbyte=0; while (x>=1) { x=x/2; nbit=nbit+1; } nbyte=1+nbit/8; printf("nbit = %d * nbyte = %d\n",nbit,nbyte); return 0; } in questo programma è fondamentale che le variabili siano INTERI
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” Ultima modifica di gurutech : 29-10-2005 alle 18:07. |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Oct 2005
Città: Livorno
Messaggi: 442
|
io i logaritmi non li ho ancora fatti a scuola... comunque ecco i risultati con vari numeri:
1-------->1 255------>1 256------>2 65535---->3 ?? oh oh... c'è qualcosa che non quadra... ![]() |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2894
|
Quote:
con 255 ce ne vuole ancora 1 : 11111111 con 256 invece ce ne vogliono 2 : 00000001 00000000 con 65535 ce ne vogliono 2 nn tre : 11111111 11111111 l'ultimo devi aver sbagliato qualcosa perchè anche facendolo coi logaritmi viene 2^x=65535 ==> x=log2 (65535) = log 65535 / log 2 (la base in questo caso è quella dei logaritmi naturali, e, detto numero di nepero e pari a 2,718) quindi viene 4.81/0.3 = 16 bit infatti 2^17 = 65536 (1 00000000 00000000) quindi 65535 è il più grande numero possibile con 16 bit ((2^x)-1)
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu Ultima modifica di Guts : 29-10-2005 alle 19:08. |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Oct 2005
Città: Livorno
Messaggi: 442
|
infatti, ho provato proprio 65535 per vedere se faceva bene il cambio... comunque, ecco la nuova versione (che non ha nulla a che fare con la precedente):
public int bytes(long num) { int bits = 0; while (num > 1) { num = num / 2; bits++; } int bytes = 1 + (bits / 8); return bytes; } la variabile long è sempre intera, ma quando la inizializza alloca uno spazio maggiore... non so quanto però. fattostà che ho qualche problema... ora vedo eh. ciaoooo! |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
ciao, effettivamente la versione che ti ho postato prima ha qualche problema ...
puoi correggere così: Codice:
#include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { double x,nbit,nbyte; x=256; nbit=0; nbyte=0; while (x>=1) { x=x/2; nbit=nbit+1; } /* ceil fa l'arrotondamento per eccesso */ nbyte=ceil(nbit/8); printf("nbit = %d * nbyte = %d\n",(int)nbit,(int)nbyte); return 0; } Codice:
#include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { int x,nbyte; x=65536; nbyte=0; while (x>=1) { x=x/256; nbyte=nbyte+1; } printf("nbyte = %d\n",nbyte); return 0; } edit se non vuoi usare ceil puoi fare anche così: Codice:
#include <stdio.h> #include <stdlib.h> int main(void) { int x,nbit,nbyte; x=65536; nbit=0; nbyte=0; while (x>=1) { x=x/2; nbit=nbit+1; } nbyte=nbit/8; /* nbit % 8 è il resto della divisione tra nbit e 8 */ if (nbit % 8) nbyte=nbyte+1; printf("nbit = %d * nbyte = %d\n",nbit,nbyte); return 0; }
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” Ultima modifica di gurutech : 30-10-2005 alle 09:08. |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
oppure se ti va puoi sempre usare una versione ridotta per tirar fuori il numero di bit
(questa però non te la spiego perchè stamattina mi sento un po' 'stardo) Codice:
#include <stdio.h> #include <stdlib.h> int main(void) { int x,b; x=1000; for (b=0;x;b++) x=x>>1; printf("%d\n",b); return 0; }
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:55.