
public class Esempio03 {
	// Variabili di tipo non intero
	static int x;
	static String y;
	static boolean b;
	static double w1,w2,w3;
		
	public static void main(String[] args) {
		// Assegnamento
		x=5; 
		y="Ciao";
		
		x = 3*x - 4;
		System.out.println("x vale " + x);

		// La somma tra String è la concatenazione
		y = y + " mondo! "; 
		System.out.println(y);			 // Ciao mondo!
		
		// String e interi si possono sommare, convertendo implicitamente l'intero in String
		System.out.println(y + x);       // Ciao mondo! 11
		
		// Nota: non vale l'associativa!
		System.out.println((y + x) + x); // Ciao mondo! 1111
		System.out.println(y + (x + x)); // Ciao mondo! 22
		
		// Un booleano vale o true o false
		b = true;
		System.out.println(b);	 // true
		x=5;
		// Confronto maggiore
		b = (x > 4);			 // true
		// Confronto maggiore o uguale
		b = (x >= 5);			 // true
		// Confronto uguaglianza: operatore ==
		b = (x == 6);			 // false
		// Confronto diversità: opeatore !=
		b = (x != 6);            // true
		// Operatore AND: &&
		b = (x > 4) && (x < 10); // true AND true == true
		// Operatore OR: ||
		b = (x > 4) || (x < -10); // true OR false == true
		// Operatore NOT: !
		b = !(x == 5);	          // false
		
		// In un if è possibile usare qualunque espressione di tipo boolean.
		if (x>0 && !b && !(x==6)) {
			System.out.println("Ecco!"); // Viene stampato
		}
		
		// Le variabili di tipo "double" contengono "numeri con la virgola".
		w1 = 3.14 ;
		// Notate che vengono memorizzate solo un certo numero di cifre, non tutte.
		// Di conseguenza le variabili double non rappresentano i numeri reali in
		// modo esatto, ma contengono un errore di rappresentazione intrinseco.
		
		// A volte questo può portare a conseguenze paradossali.
		// Per esempio la somma non è associativa (!!), come si vede qui sotto.
		w1 = 1000.0 * 1000.0 * 1000.0 * 1000.0 * 1000.0 * 1000.0; // numero enorme
		w2 = -w1;
		w3 = 1.0; // numero piccolo
		System.out.println("w1 = " + w1); // 1.0E18 cioè 1.0 * (10 alla 18esima)
		// Questo if sotto dovrebbe controllare se 1 == 1, e sembrerebbe vero...
		// ... ma non lo è!
		if ( (w1 + w2) + w3 == w1 + (w2 + w3) ) {
			System.out.println("Vale la associativa!");
		} else {
			System.out.println("NON vale la associativa?!?");
			System.out.println("(w1+w2)+w3 = " + ((w1+w2)+w3)); // 1.0
			System.out.println("w1+(w2+w3) = " + (w1+(w2+w3))); // 0.0
		}
		// Il problema è che w1 ha molte cifre (18 decimali) e quindi aggiungere w2=1
		// andrebbe a modificare la 18esima cifra, che in realtà non viene memorizzata.
		// Quindi w1+1 è uguale a w1 (!) e questo fa violare l'associatività.
		// In generale, le equazioni che valgono sui reali NON valgono sui double
		// a causa del troncamento delle cifre. In genere, salvo casi patologici
		// di "instabilità numerica", valgono a meno di un errore "piccolo",
		// dove "piccolo" va rapportato alle grandezze su cui facciamo i conti.
		// Quindi 1.0 è "piccolo" rispetto a w1=10^18.
	}

}
