Parte sesta: matematica co Java I questa parte prederemo i esame la classe Math del package java.lag. Vedremo come utilizzare i vari metodi ed attributi. I questa parte cotiueremo a sviluppare il progetto visto ella parte precedete, cioè la creazioe della classe NewMath, che simuli il fuzioameto della classe Math già esistete. Alla fie di questo corso avremo u applicazioe fuzioate, ache più amplia di quella origiale.. La classe Math: ua paoramica Come abbiamo già detto, la classe Math è coteuta el package java.lag ed è ua classe fiale. No possoo quidi essere estese uove classi. Ioltre il metodo costruttore di Math è ad accesso privato (o possoo essere create istaze) e tutti i suoi metodi soo statici. Alcui metodi di questa classe soo ache ativi. Vedremo cosa soo i metodi ativi più avati el corso. Vediamo u esempio: se volessimo richiamare il metodo sqrt() per calcolare la radice quadrata di 9 scriveremmo: Math.sqrt(9); Vediamo rapidamete i metodi e gli attributi di questa classe: Metodo / attributo log abs(log l) float abs(float f) double abs(double d) it abs(it i) double acos(double d) double asi(double d) double ata(double d) double ceil(double d) double cos(double d) double ep(double d) Descrizioe Restituisce l arcocoseo del umero specificato Restituisce l arcoseo del umero specificato Restituisce l arcotagete del umero specificato Restituisce il valore itero miimo maggiore o uguale al umero specificato Restituisce il coseo del umero specificato Restituisce il umero e (umero di Nepero) elevato a d
double floor(double d) double log(double d) it ma(it i, it i) log ma(log l, log l) float ma(float f, float f) double ma(double d, double d) it mi(it i, it i) log mi(log l, log l) float mi(float f, float f) double mi(double d, double d) double pow(double d, double d) double radom() it roud(float f) log roud(double d) double si(double d) double sqrt(double d) double ta(double d) double E double PI Restituisce il valore itero massimo miore o uguale al umero specificato Restituisce il logaritmo del umero specificato Eleva a poteza, co base d ed espoete d Restituisce u umero pseudocasuale compreso fra 0 e Arrotoda il umero specificato all itero più prossimo Arrotoda il umero specificato all itero più prossimo Restituisce il seo del umero specificato Restituisce la radice quadrata del umero specificato Restituisce la tagete del umero specificato Restituisce il valore del umero di Nepero, equivalete a.78888459045 Restituisce il valore di π, equivalete a 3.459653589793 Vediamo u esempio: calcolare il quadrato del seo di u agolo α e sommarlo al quadrato del coseo dello stesso agolo α. La otazioe matematica è la seguete: si α + cos α. Suppoedo che il valore dell agolo α sia 45: si 45 + cos 45. Traduciamo l espressioe i Java: double d = Math.pow(Math.si(45), ) + Math.pow(Math.cos(45), ); Il risultato dell espressioe riportata sopra è.0.
Vediamo u altro esempio: la tagete di u agolo α è data dal rapporto fra il seo ed il coseo dello stesso agolo α. Verificare se la suddetta affermazioe corrispode al vero. Dalla si α affermazioe sopra, deduciamo che ta α =. Per verificare, proviamo a tradurre l espressioe cos α matematica i Java, utilizzado acora come valore di α 45: double d = Math.ta(45); double d = Math.si(45) / Math.cos(45); if(d == d) System.out.pritl("Affermazioe vera."); System.out.pritl("Affermazioe falsa."); Il risultato è Affermazioe vera.. Vediamo adesso come ampliare la classe NewMath.. Ampliamo la classe NewMath Per aggiugere u metodo utile alla ostra classe, cosideriamo il seguete problema: ella classe Math origiale o è defiito alcu metodo che calcoli ua radice superiore a quella quadrata. Come risolviamo questo problema? E be oto il cocetto matematico secodo il quale ogi umero è i realtà ua frazioe. Ad esempio, può essere scritto ache. La otazioe matematica per idicare u elevameto a poteza è y. Ma questa otazioe può ache essere scritta così: y. Se ivertiamo dell espoete il deomiatore co il suo umeratore, otteiamo Se proviamo, ad esempio, ad elevare 9 a ½ otteiamo che 9 è uguale a 3. Abbiamo quidi estratto la radice quadrata di 9 tramite u elevameto a poteza. Quidi affermiamo che elevado u umero y per u espoete co umeratore e co deomiatore eseguiamo l estrazioe di radice co idice e radicado y. Viceversa, estraedo radice di u radicado y co u idice frazioario avete per umeratore ed per deomiatore, eseguiamo l elevameto a poteza di u umero y co espoete. I termii matematici scriveremo: y = y. Possiamo quidi creare u metodo che calcoli queste radici servedoci dell esistete metodo pow(). y. public static double root(double d, double d) retur Math.pow(d, / d);
Adesso proveremo a creare dei metodi che simulio alcue fuzioalità della classe Math. No aalizzeremo tutti i metodi, i quato, alcui, eseguoo calcoli complessi. Elevameto a poteza: possiamo dare la seguete defiizioe matematica per l elevameto a poteza di u umero: = = d = se = 0 e 0 se = 0 e = 0 se > 0 e 0 Per risolvere questo problema potremmo utilizzare ua fuzioe ricorsiva. Esamiiamo il codice del metodo seguete: public static double power(double base, double ep) if(base!= 0 && ep == 0) retur ; if(base == 0 && ep == 0) retur power(base, ep - ) * base; Notiamo che il metodo cotrolla i valori che gli vegoo passati come parametri per distiguere i casi specifici ed il caso geerale. Valore assoluto: public static it absolute(it i) if(i == 0) if(i > 0) retur i; retur -i; public static double absolute(double d) if(d == 0) if(d > 0) retur d; retur -d;
public static float absolute(float f) if(f == 0) if(f > 0) retur f; retur -f; public static log absolute(log l) if(l == 0) if(l > 0) retur l; retur -l; Esistoo altri metodi che possoo essere aggiuti, ma, per adesso, ci fermeremo qui. Prederemo acora i cosiderazioe le fuzioi matematiche più avati el corso e ella parte dedicata alle aimazioi ed al disego e ache ella parte dedicata a Java Native Iterface (JNI). Nella prossima parte vedremo le strighe i dettaglio, utilizzado ache le classi StrigBuffer e StrigTokeizer.