java
/liczby
1
Liczby
TYP WBUDOWANY
OBIEKT
WIELKO
(BAJTY)
byte
Byte
1
short
Short
2
int
Integer
4
long
Long
8
float
Float
4
double
Double
8
char
Character
2
•
liczby zawieraj ce cz
dziesi tn s domy lnie traktowane jako double
float f=3.0;
// to da bł d kompilacji
float f=3f;
float f=3.0f;
// trzy ró ne sposoby, eby było dobrze
float f=(float)3.0;
te same problemy pojawiaj si w przypadku zapisywania int w zmiennych
short, byte lub char trzeba zrobi rzutowanie
•
problemy z ułamkami
double d=2/3*5;
// ==0 bo 2/3 == 0
double d= 2d/3d * 5;
// ==3.33333333333333 tak jest OK
•
dzielenie liczby całkowitej przez zero (5/0) powoduje rzucenie wyj tku
ArithmeticException
•
dzielenie liczby rzeczywistej przez zero nie powoduje bł du, ale daje
Double.POSITIVE_INFINITY/Double.NEGATIVE_INFINITY
double d=123, e=0;
if (d/e == Double.POSITIVE_INFINITY)
System.out.println("nieskonczonosc");
•
stała Double.NaN (Not A Number) reprezentuje wynik operacji np. 0.0/0.0
do sprawdzania czy wynik operacji jest NaN powinna by wykorzystywana
metoda isNan() z klasy Double, a nie porównanie z NaN (bo NaN!=NaN)
double s = Math.sqrt(-1);
if (s == Double.NaN)
System.out.println("tego nie wypisze");
if (Double.isNaN(s))
System.out.println("to wypisze");
java
/liczby
2
•
zaokr glanie
int k=(int)3.999;
// ==3 przez rzutowanie
int k=(int)Math.round(3.999);
// ==4 tak lepiej
int k=(int)Math.floor(3.999);
// ==3
class java.lang.Math
•
metody statyczne
double abs(double a)
float abs(float a)
int abs(int a)
long abs(long a)
warto
bezwzgl dna
double acos(double a)
arccos cosinus w zakresie [0,Pi]
double asin(double a)
arcsin w zakresie [–Pi/2,Pi/2]
double atan(double a)
arctan w zakresie [–Pi/2,Pi/2]
double atan2(double a, double b) pzekształca współrz dne prostok tne (a,b)
na biegunowe (r,theta)
double ceil(double a)
zwraca kres górny lub najmniejsz ze
wszystkich liczb wi kszych lub równych a
double cos(double a)
zwraca cos k ta
double exp(double a)
eksponenta
double floor(double a)
zwraca kres dolny lub najwi ksz z
wszystkich liczb mniejszych lub równych a
double IEEEremainder(double f1 ,
double f2)
reszta z dzielenia f1 przez f2
(zgodnie z norm IEEE 754)
double log(double a)
ln(a)
double max(double a, double b)
double max(float a, float b)
int max(int a, int b)
long max(long a, long b)
zwraca warto
wi kszej z dwóch liczb
double min(double a, double b)
double min(float a, float b)
int min(int a, int b)
long min(long a, long b)
zwraca warto
mniejszej z dwóch liczb
double pow(double a, double b)
zwraca warto
liczby a podniesionej do
pot gi b
double rint(double b)
przekształca liczb typu double w liczb
całkowit tak e typu double
long round(double a)
int round(float a)
zaokr gla liczb przez dodanie 0.5 do
liczby zaokr glonej, a nast pnie wybranie
najwi kszej liczby całkowitej, która jest
wi ksza lub równa nowej liczbie
double sin(double a)
zwraca sin k ta
double sqrt(double a)
pierwiastek kwadratowy
double tan(double a)
zwraca tan k ta
•
stałe
Math.cos(Math.PI);
Math.log(Math.E);
//log(e)
java
/liczby
3
class java.lang.StrictMath
•
je li planujemy uruchamia program na wielu paltformach to ta klasa jest
lepsza od Math, poniewa reprezentuje liczby dokładniej, zatem przy
operacjach matematycznych ró nice oblicze (je li s ) s minimalne
class java.util.BitSet
•
do operacji na nieci głym zbiorze liczb całkowitych
BitSet b=new BitSet();
b.set(0);
b.set(3);
String data[]={”ala”,”bela”,”cela”,”adela”};
for (i=0; i<20; i++)
if (b.get(i))
// p tla po zbiorze nieci głym
System.out.println(data[i]); // “ala” “adela”
KONWERSJE
•
konwersja pomi dzy systemami zapisu liczb całkowitych metody
statyczne z odpowiedniej klasy (typu) liczby (np. Integer)
String toBinaryString()
String toOctalString()
String toHexString()
int i=42;
System.out.println(i + „w postaci binarnej to ” +
Integer.toBinaryString(i)
);
String bin=”101010”;
System.out.println(bin + „w postaci dziesi tnej to ” +
Integer.
valueOf
(bin,2));
// drugi argument okre la jak zapisano liczb :
// 2-binarnie, 8-ósemkowo, 10-dziesi tnie,
// 16-szesnastkowo
// valueOf() zwraca String
•
konwersja obiektów klas opakowuj cych typy proste do typów prostych
typ typ
Value()
int intValue()
double doubleValue()
float floatValue()
long longValue()
short shortValue()
byte byteValue()
java
/liczby
4
Integer in=new Integer("8");
// Integer ze Stringu
Integer in2=new Integer(6);
// Integer z int
int kk = in.intValue()+in2.intValue();
System.out.println(kk);
// 14
Double dd=new Double("2.3e2");
Double dd2=new Double(4.5);
double dk = dd.doubleValue()+dd2.intValue();
// 230+4
System.out.println(dk);
// 234
•
zamiana napisu na liczb metoda z klasy, której typu ma by liczba
int Integer.parseInt(String)
double Double.parseDouble(String)
Integer Integer.valueOf(String)
Double Double.valueOf(String)
// konwersja ła cucha znaków na liczb oraz okre lenie, czy dany napis to
// liczba zmiennoprzecinkowa (tzn. zawiera „.”, „e”, „d”) czy całkowita
String s=argv[0]; // pierwszy parametr z lini polece , zakładamy, e liczba
double d;
int i;
if (s.indexOf(‘.’) >0 || s.indexOf(‘d’) >0 || s.indexOf(‘e’) >0)
try {
d = Double.parseDouble(s);
System.out.println("Liczba zmiennoprzecinkowa: " + d);
return;
}
catch (NumberFormatException e) {
System.out.println("Nieprawidłowa liczba zmiennoprzecinkowa: " + s);
return;
}
else
try {
i = Integer.parseInt(s);
System.out.println("Liczba całkowita: " + i);
return;
}
catch (NumberFormatException e2) {
System.out.println("Dane wej ciowe nie s liczb :" + s);
}
•
zamiana liczby na napis metody z klasy
String
static String valueOf(int)
static String valueOf(double)
int a =12;
String napis;
napis =String.valueOf(a);
System.out.println(napis);
java
/liczby
5
FORMATOWANIE LICZB
import java.text.*;
final double a=100.2345678;
final double b=3.14;
final double c=1024.25;
NumberFormat form = NumberFormat.getInstance(); //dostosowanie do ustawie
//lokalnych
// definiujemy format o postaci 999.99[99]
form.setMinimumIntegerDigits(3);
form.setMinimumFractionDigits(2);
form.setMaximumFractionDigits(4);
System.out.println("Liczba " + a + "\t zostaje sformatowana do postaci " +
form.format(a)); // 100,2346
System.out.println("Liczba " + b + "\t zostaje sformatowana do postaci " +
form.format(b)); // 003,14
NumberFormat f1 = NumberFormat.getInstance();
// metoda
toPattern()
zawraca kombinacj znaków specjalnych
// (patrz tabelka) wykorzystywan przez ustawienia
// lokalne jako wzorzec do formatowania liczb
System.out.println("Wzorzec domy lny: " + ((DecimalFormat)f1).toPattern());
// #,##0.###
NumberFormat f2 = new DecimalFormat("##0.##");
System.out.println("Wzorzec ustawiony: "+((DecimalFormat)f2).toPattern());
System.out.println("Liczba " + c + " zostaje sformatowana do postaci " +
f1.format(c)); // 1 024,25
System.out.println("Liczba " + a " zostaje sformatowana do postaci " +
f2.format(a)); // 100,23
System.out.println("Liczba " + a + " zostaje sformatowana do postaci " +
f1.format(a) + " przy wykorzystaniu domy lnego wzorca"); // 100,235
ZNAK ZNACZENIE
#
cyfra (zera na pocz tku pomijane)
0
cyfra (zera na pocz tku wy wietlane)
.
separator cz
ci dziesi tnej – zale y od ustawie lokalnych
,
separator grupuj cy – zale y od ustawie lokalnych
-
oznaczenie liczby ujemnej – zale ne od ustawie lokalnych
%
wy wietlenie liczby jako warto ci procentowej
;
rozdziela dwa formaty liczby – pierwszy do prezentacji
warto ci dodatnich, a drugi warto ci ujemnych
‘
wy wietlenie jednego z powy szych znaków
inne wy wietlane w takiej postaci jak zostały wpisane
java
/liczby
6
DU E LICZBY
•
pakiet java.math
•
obsługa liczb przekraczaj cych Long.MAX_VALUE lub Double.MAX_VALUE
•
obiekty poni szych klas s niezmienne wobec tego istniej metody
zwracaj ce nowe obiekty zawieraj ce zmodyfikowan warto
obiektu
oryginalnego:
negate()
,
add()
,
compareTo()
,
equals()
i inne
java.math.BigInteger
BigInteger bInt = new BigInteger("3419229223372036854775807");
System.out.println("bardzo du a liczba całkowita: " + bInt);
System.out.println("ta sama liczba w formie zmiennoprzecinkowej: " +
bInt.doubleValue());
•
klasa BigInteger jest wykorzystywana głównie w kryptografii np. metoda
isProbablyPrime() – zwraca pary liczb pierwszych
java.math.BigDecimal
•
porównywanie wyników operacji na liczbach rzeczywistych jest tylko
przybli one (ró nica mniejsza ni epsilon) wi c je li chcemy pełn
dokładno
to trzeba działa na obiektach klasy
BigDecimal
(dokładno
jest tu ograniczona tylko pami ci )
// kalkulator operuj cy na bardzo du ych liczbach
import java.util.Stack;
public static Object[] input = {
new BigDecimal("3419229223372036854775807.23343"),
new BigDecimal("2.0"),
"*", "=", };
Stack s = new Stack();
for (int i = 0; i < input.length; i++) {
Object o = input[i];
if (o instanceof BigDecimal) s.push(o);
else if (o instanceof String) {
switch (((String)o).charAt(0)) {
case '+': s.push(((BigDecimal)s.pop()).add((BigDecimal)s.pop()));
break;
case ‘-‘: s.push(((BigDecimal)s.pop()).subtract((BigDecimal)s.pop()));
break;
case ‘*’: s.push(((BigDecimal)s.pop()).multiply((BigDecimal)s.pop()));
break;
case ‘/’: s.push(((BigDecimal)s.pop()).divide((BigDecimal)s.pop(),
BigDecimal.ROUND_UP)); break;
case ‘=’: System.out.println(s.pop());
break; } } }
java
/liczby
7
LICZBY LOSOWE
class java.lang.Math
•
metoda: static double random(): daje dodatni liczb losow podwójnej
precycji z przedziału [0,1)
System.out.println(“liczba losowa “+ Math.random()); // 0-1
class java.util.Random
•
daje lepsze liczby losowe ni Math
•
inicjalizacja generatora
import java.util.Random;
. . .
Random r = new Random();
// inicjuje generator na podstawie aktualnego
// czasu w mse
lub
Random r = new Random(long seed);
// inicjuje generator na podstawie
// liczby
•
metody zwracaj odpowiednie liczby pseudolosowe typów wbudowanych
boolean nextBoolean()
zwraca losowo true albo false
double nextDouble() podwójnej precyzji [0,1]
float nextFloat()
liczb rzeczywist [0,1]
int nextInt()
zwraca pseudolosow liczb losow int z pełnego zakresu
long nextLong() zwraca pseudolosow liczb losow long z pełnego zakresu
int nextInt(int n);
zwraca pseudolosow liczb całkowit [0,n]
System.out.println(“całkowita liczba losowa 1-10 „+ 1+ r.nextInt(10));
// nextInt(10) 0-9
•
powy sze metody generuj liczby pseudolosowe o rozkładzie jednorodnym
double nextGaussian();
zwraca pseudolosow liczb podwójnej precyzji
o rozkładzie Gaussa
System.out.println(“jednorodny: “+r.nextDouble()+
”Gauss: “+r.nextGaussian());
java
/liczby
8
OPERACJE NA BITACH
•
bit najbardziej znacz cy (najstarszy) jest najbardziej po lewej,
najmłodszy – po prawej
•
dla typów
byte
,
short
,
int
,
long
najstarszy bit jest bitem znaku
=1
liczba ujemna
=0
liczba dodatnia
(np. byte: od –128 =10000000 do 127 =01111111)
•
typ
char
: najstarszy bit nie jest traktowany jak znak st d (przy 2
bajtach na znak) 0-65536 znaków
•
~
uzupełnienie do jedynki
•
^
XOR
•
operatory przesuni
bitowych: >> i <<
byte b=1; // 00000001 =1
b<<1; // 00000010 =2
b<<4; // 00010000 =16
o przy przesuwaniu w lewo << : młodsze (zwalniane) bity s
zapełniane zerami
o przy przesuwaniu w prawo >> : zwalniane bity s zapełniane bitem
znaku (propagacja bitu znakowego)
o przy przesuwaniu >>> niezale nie od warto ci bitu znaku zwalniane
bity s zapełniane zerami
b=-1;
// 11111111 = -1
b>>4;
// 11111111 = -1
o je li przy przesuni ciu nie ma miejsca na promocj nast puje
zmiana znaku
int i=Integer.MAX_VALUE;
// 2147483647
i<<1;
// -2
byte b=Byte.MAX_VALUE;
// 127
(byte)(b<<1)
// -2
o przy przesuni ciu w lewo bitów najwi kszej liczby w danym typie
nast puje promocja do int (z byte, short, char) lub long (z int,
long)
o operacja a>>n to a/2^n
•
wyzerowanie najmłodszego bitu całkowitej zmiennej x niezale nie od jej
typu
x = x & ~0x1;