background image

java 
/liczby 

1

 

Liczby 

 
 
 

TYP WBUDOWANY 

OBIEKT 

WIELKO

 (BAJTY) 

byte 

Byte 

short 

Short 

int 

Integer 

long 

Long 

float 

Float 

double 

Double 

char 

Character 

 
 
 

• 

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"); 

background image

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) 

 

background image

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() 

background image

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); 
 

background image

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) 

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 

 
 
 

background image

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;  }   }   } 

background image

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()); 
 
 
 

background image

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;