Intro

Dzień dobry, dzień dobry.

Dzisiaj przejdziemy do świata z nielubianego, przez większość uczniów i studentów. Czyli do świata matematyki buuu.

Zapraszam. :)

Po cholerę mi matematyka?

Nie będę się rozwodził nad tym, jak znajomość matematyki może usprawnić różne algorytmy.

Uznajmy po prostu arbitralnie, że jest przydatna.

A to, co przydatne wypada znać :)

No dobra, to jak się za to zabrać?

W BASHU mamy kilka operacji matematycznych:

  • id++ id– postinkrementacja and postdekrementacja zmiennej
  • ++id –id preinkrementacja and predekrementacja zmiennej
      • dodawanie, odejmowanie
    • / % mnożenie, dzielenie, modulo (reszta z dzielenia)
  • ** potęgowanie
  • « » lewe i prawe przesunięcie bitowe (inaczej pomnożenie lub podzielenie przez 2)
  • ~ negacja bitowa
  • & bitowy AND
  • ^ bitowy XOR
  • bitowy OR

Niestety mamy tu mały zgrzyt, ponieważ wykonanie działania np. 2+2 zwróci nam:

zdj1

To może w cudzysłowie?

zdj2

To jak tu robić obliczenia?

Teoretycznie jest 5 sposobów, by wykonać obliczenia, ale opowiem tylko o 4, ponieważ 5 jest podobna do jednej z przedstawianych, ale nie jest zgodna z POSIX, a złych nawyków wam przekazywać nie chcę :)

4 Ścieżki.

Droga POSIX

$((2+2)) zdj3

Droga BASH’a

let var=2+2 zdj4

Droga shella

expr 2 + 2 zdj5

Droga C

echo 2+2 | bc zdj6

A co te wyniki takie dziwne?

Dochodzimy tutaj do największej tajemnicy matematyki w BASH’u oraz całym shellu.

Smutna prawda jest taka, że shell może operować wyłącznie na liczbach całkowitych, jak widać na wcześniejszych obrazkach.

No dobrze… a co jeśli naprawdę potrzebujemy wyniku z wartością po przecinku, bo np. piszemy skrypt, który będzie okalał jakąś aplikację i będzie nakładał ograniczenia, bo chcemy podzielić moc po równo?

Tutaj mamy do dyspozycji program bc a dokładniej bc -l. Program wtedy korzysta z biblioteki matematycznej, która domyślnie zwraca liczbę zmiennoprzecinkową.

I tak działanie 5/3 będzie miało wynik:

zdj7

Jak widać, jesteśmy uratowani i w tej kwestii :)

Epilog

Podstawy matematyki warto znać oraz to jak wykonać obliczenia w zadanym środowisku.

Ja się dziś z Wami żegnam. Zachęcam do zabawy z matematyką nie tylko w bash’u, ale także na papierze :)

Życzę miłego dnia/nocy i smacznej kawusi/herbatki.