Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460

    [Java] domanda semplice sul casting

    per comprendere meglio come operare del casting in java e come questo viene gestito ho scritto 4 semplicissime righe

    codice:
    public class test {
    	public static void main ( String[] args )
    	{
    		System.out.println((short)(1/3));
    		System.out.println((int)(1/3));
    		System.out.println((float)(1/3));
    		System.out.println((double)(1/3));
    	}
    }
    che da come output

    codice:
    0
    0
    0.0
    0.0
    non mi spiego perché negli ultimi 2 casi l'output è 0.0 anziché qualcosa di simile a 0.3 con 3 periodico, perché non mi esegue un casting corretto ( ovvero che mi salvi il risultato convertendolo in virgola mobile ) ?

  2. #2

    Re: [Java] domanda semplice sul casting

    Originariamente inviato da Freax
    non mi spiego perché negli ultimi 2 casi l'output è 0.0 anziché qualcosa di simile a 0.3 con 3 periodico, perché non mi esegue un casting corretto ( ovvero che mi salvi il risultato convertendolo in virgola mobile ) ?
    Perchè il cast viene eseguito su 0, quindi l'effetto di dei due cast è 0.0

    Devi trattare entrambi gli operandi come float (risp. double):
    codice:
    		System.out.println((float)1/(float)3);
    		System.out.println((double)1/(double)3);

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: Re: [Java] domanda semplice sul casting

    Originariamente inviato da VincenzoTheBest
    Devi trattare entrambi gli operandi come float (risp. double):
    O almeno uno dei due.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460

    Re: Re: [Java] domanda semplice sul casting

    Originariamente inviato da VincenzoTheBest
    Perchè il cast viene eseguito su 0, quindi l'effetto di dei due cast è 0.0

    Devi trattare entrambi gli operandi come float (risp. double):
    codice:
    		System.out.println((float)1/(float)3);
    		System.out.println((double)1/(double)3);
    ti ringrazio, il problema è che non arrivo a concepire come possa uscire 0 da 1/3 se gli dico che voglio un double o un float in output.

    io ragiono così per "debuggare" questo codice: se programmo è per far fare qualcosa e per ricevere qualcosa, giusto? se gli dico di fare 1/3 lui cosa fa realmente? da quanto mi dici devo assumere che Java approssimi per default ad un int quando c'è da operare e che non sia possibile istruire java su un casting "al volo" su una operazione.

    Perché se faccio come scrivi io opero sui termini oggetto dell'operazione, in pratica faccio un casting sugli operatori che ha molta meno praticità anche se risolve il problema; se la mia operazione avesse 100 termini io dovrei fare 100 cast singoli?

    Quando io vado a compilare Java sa che a runtime io voglio che da li esca fuori un double o un float, quindi non mi spiego come il parser e il compilatore non agiscano di conseguenza creando un file .class che mi dia a runtime il risultato aspettato.

    ovvio che se faccio 1.0/3.0 risolvo, anche perché gli do in pasto numeri che hanno "la faccia" dei float e quindi lui adatta anche il risultato a float ( o double che sia ), ma siccome la matematica è piena di ostacoli e imprevisti, da due int possono anche uscire fuori dei numeri reali: e a questo punto come si fa? lui vede che sono int e rimane tutto ad int? possibile che Java non abbia studiato bene la matematica e si basi solo sulla "faccia" dei numeri?

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: Re: Re: [Java] domanda semplice sul casting

    Originariamente inviato da Freax
    ti ringrazio, il problema è che non arrivo a concepire come possa uscire 0 da 1/3 se gli dico che voglio un double o un float in output.
    Perchè non glielo stai dicendo nel modo giusto.
    1 è una costante intera.
    3 è una costante intera.

    La divisione fra due numeri interi è un numero intero. 1 / 3 = 0.333. Ma 0.333 non è un valore intero. Quindi viene presa solo la parte intera di quel numero... che è 0. Solo dopo tu vai ad effettuare il cast... che a questo punto è del tutto inutile.

    Tu devi far capire all'esecutore che quella non è una divisione fra interi, ma una divisione fra valori di tipo float (o double). Per questo devi castare uno dei due operandi... se uno dei due operandi non è intero, il risultato della divisione non sarà più considerato intero.

    Il gioco funziona così: prima viene fatta la divisione e viene valutato il risultato. Dopo viene preso in considerazione il tuo cast.

    Quindi, se vuoi ottenere un risultato float da una divisione, devi assicurarti che almeno uno dei due operandi sia float.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6

    Re: Re: Re: [Java] domanda semplice sul casting

    Originariamente inviato da Freax
    se la mia operazione avesse 100 termini io dovrei fare 100 cast singoli?
    No, come ha aggiunto LeleFT puoi castare un solo termine:
    codice:
    System.out.println((double)1/3);
    questo è possibile grazie alla coercizione.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: Re: Re: Re: [Java] domanda semplice sul casting

    Originariamente inviato da VincenzoTheBest
    questo è possibile grazie alla coercizione.
    e al fatto che il cast ha la precedenza sulla divisione.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460

    Re: Re: Re: Re: [Java] domanda semplice sul casting

    Originariamente inviato da LeleFT
    Perchè non glielo stai dicendo nel modo giusto.
    1 è una costante intera.
    3 è una costante intera.

    La divisione fra due numeri interi è un numero intero. 1 / 3 = 0.333. Ma 0.333 non è un valore intero. Quindi viene presa solo la parte intera di quel numero... che è 0. Solo dopo tu vai ad effettuare il cast... che a questo punto è del tutto inutile.

    Tu devi far capire all'esecutore che quella non è una divisione fra interi, ma una divisione fra valori di tipo float (o double). Per questo devi castare uno dei due operandi... se uno dei due operandi non è intero, il risultato della divisione non sarà più considerato intero.

    Il gioco funziona così: prima viene fatta la divisione e viene valutato il risultato. Dopo viene preso in considerazione il tuo cast.

    Quindi, se vuoi ottenere un risultato float da una divisione, devi assicurarti che almeno uno dei due operandi sia float.

    Ciao.
    vedi, io capisco quello che vuoi dirmi, ma questo riguarda una anomalia del Java, se io andassi da un prof di matematica a dire che da una operazione tra int esce fuori un int, mi manderebbe fuori a pedate anche se stessi frequentando le elementari, la mia domanda è tutta qui: cosa ha spinto i creatori del Java a prendere una decisione del genere, o se volete, cosa vieta al compilatore di produrre un bytecode con le giuste istruzioni dopo che lui vede anche una divisione tra interi, che in matematica quasi mai da un risultato intero a meno di trattare frazioni da scuola elementare ( qui ad esempio un float è quasi sempre d'obbligo e il java addirittura mi casta ad int! dov'è l'ingegneria del software a questo punto? )

    cioé io solo come inizio mi pappo un libro di pagine e pagine, con dentro praticamente solo e soltanto scelte su comportamenti di default fatte da chi ha creato il linguaggio, tutto ad alto livello, un bla bla bla sulla vicinanza al linguaggio umano e al fatto che sia vicino al nostro modo di pensare, e poi mi vengono fuori questi obrobri? Tanto vale usare il C se devo castare tutto e stare attento a tutto visto che neanche quando esplicito la forma questa viene rispettata ...

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: Re: Re: Re: Re: [Java] domanda semplice sul casting

    Originariamente inviato da Freax
    vedi, io capisco quello che vuoi dirmi, ma questo riguarda una anomalia del Java, se io andassi da un prof di matematica a dire che da una operazione tra int esce fuori un int, mi manderebbe fuori a pedate anche se stessi frequentando le elementari, la mia domanda è tutta qui: cosa ha spinto i creatori del Java a prendere una decisione del genere, o se volete, cosa vieta al compilatore di produrre un bytecode con le giuste istruzioni dopo che lui vede anche una divisione tra interi, che in matematica quasi mai da un risultato intero a meno di trattare frazioni da scuola elementare ( qui ad esempio un float è quasi sempre d'obbligo e il java addirittura mi casta ad int! dov'è l'ingegneria del software a questo punto? )
    Non credo proprio.
    L'aritmetica intera dovrebbe essere una delle basi di qualunque studente di qualunque ramo.
    La divisione intera fra interi produce sempre un intero.
    Questo per qualunque branchia della matematica.

    Non viene fatto proprio alcun cast. La divisione fra due costanti intere (perchè, come già detto, 1 e 3 sono due costanti intere) è ambito dell'aritmetica fra interi. Ora, non so come l'abbiano spiegata a te alle elementari, ma nel mondo degli interi (l'insieme Z, per capirci), 1 / 3 fa 0. Punto.

    E Java non fa differenza.


    cioé io solo come inizio mi pappo un libro di pagine e pagine, con dentro praticamente solo e soltanto scelte su comportamenti di default fatte da chi ha creato il linguaggio, tutto ad alto livello, un bla bla bla sulla vicinanza al linguaggio umano e al fatto che sia vicino al nostro modo di pensare, e poi mi vengono fuori questi obrobri? Tanto vale usare il C se devo castare tutto e stare attento a tutto visto che neanche quando esplicito la forma questa viene rispettata ...
    Evidentemente è a te che mancano delle basi di matematica... o forse continui a non vedere le cose per come stanno.

    Prova con questo codice:

    codice:
    System.out.println( 1.0 / 3.0 );
    e vedrai che le cose cambiano di molto... perchè quelle non sono più due costanti intere, ma reali, quindi cambia completamente il dominio su cui viene eseguita la divisione e, di conseguenza, il dominio del risultato.

    Consiglio, a tal proposito, di studiare bene la definizione di divisione intera. Questi due documenti potrebbero tornare utili:

    http://it.wikipedia.org/wiki/Divisione_intera_in_N
    http://it.wikipedia.org/wiki/Divisione_%28matematica%29 (Divisione tra interi, punto 4).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.