|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 832
|
[JAVA] problema massimo valore int
Mi trovo alle prese con uno stupidissimo esercizio, e il risultato non mi torna probabilmente per un errore altrettanto sciocco.
Devo calcolare il massimo valore degli int. Ho tentato due strade: La prima è un ciclo while che incrementa una variabile int di uno finché essa è maggiore o uguale a zero. Poiché con l'ultimo incremento la variabile prende valore negativo vista la circolarità del dominio del tipo int, il programma sottrae 1 prima di stamparla. QUesto sistema mi da il risultato giusto, ossia 2147483647. La seconda strada è semplicemente calcolare (2^31)-1 utilizzando il metodo pow della classe Math. Quest'ultimo sistema mi da un risultato sbagliato: 2147483646. Ecco il codice: Codice:
class MaxInt
{
public static void main(String[] args)
{
int max = 0;
while(max>=0)
max++;
System.out.println(max-1);
System.out.println((int)Math.pow(2, 31) -1);
}
}
__________________
Trattative concluse su mercatino: The_Saint, ewandeep, Wiltord, maurizioi, Compulsion, mauryxxx76 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2788
|
Hai provato a fare il cast solo dopo aver sottratto 1?
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 832
|
facendo come dici tu funziona ma non ho capito perché. è questione di precedenza ?
__________________
Trattative concluse su mercatino: The_Saint, ewandeep, Wiltord, maurizioi, Compulsion, mauryxxx76 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Il cast a (int) tronca la parte decimale del numero che si sta castando, inoltre l'operazione di cast ha una precedenza maggiore della sottrazione percui nel codice che hai postato ti fa:
1) Math.pow(2, 31) 2) il risultato lo casta a (int) 3) infine sottrae 1 Il fatto è che al punto 1) gli interi letterali che passi in input a pow vengono prima implicitamente convertiti a double dato che nella classe Math esiste solo un metodo pow così definito: Codice:
public double pow(double a, double b)
{
//...
}
Poi sottrai il letterale 1. Non so se è questo il motivo perchè in teoria tu usi interi e il calcolo della potenza di 2^31 dovrebbe essere preciso, quindi anche con i cast non ci dovrebbero essere problemi. Però provando a fare questo: Codice:
System.out.println(Math.pow(2.0, 31.0) - 1.0); Mentre così: Codice:
System.out.println((int) Math.pow(2.0, 31.0) - 1.0); Cmq per sapere i valori estremi di un int in ambiente Java potresti andare a pescare le costanti Integer.MIN_VALUE e Integer.MAX_VALUE
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 832
|
infatti la cosa strana è proprio che 2^31 dovrebbe dare un valore preciso, senza parte decimale.
__________________
Trattative concluse su mercatino: The_Saint, ewandeep, Wiltord, maurizioi, Compulsion, mauryxxx76 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Se esiste Integer.MAX_VALUE, allora forse è meglio usare quello.
Sennò ((-1) & (~(1 << 31)))? Complemento a due rulez!
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 02-07-2008 alle 20:55. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Sfortunatamente non conosco Java, ma penso che il complemento ad uno lo si faccia nello stesso modo (~), no?
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 832
|
Certamente conviene usare il max integer tuttavia era un esercizio che ci è stato dato all'inizio del primissimo corso di java, in cui informazioni come questa non ci erano ancora note.
__________________
Trattative concluse su mercatino: The_Saint, ewandeep, Wiltord, maurizioi, Compulsion, mauryxxx76 |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Capito... se esistono complementi fatti allo stesso modo, puoi usare la formula che ho scritto sopra, l'ho provata in C e mi funziona. Altrimenti puoi usare un ciclo tipo:
Codice:
int MaxInt()
{
int risultato = 0;
for (int bit = 0; bit < 31; ++bit)
{
risultato <<= 1
risultato |= 1;
}
return risultato;
}
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:12.




















