Operacje arytmetyczne: Całkowite i zmiennoprzecinkowe

Kurs: Wstęp do programowania
Lekcja 2: Podstawy składni języka programowania
Temat 3: Wyrażenia w programowaniu
Podtemat 1: Operacje arytmetyczne: Całkowite i zmiennoprzecinkowe

⇓ spis treści ⇓


Operacje arytmetyczne są jednymi z najważniejszych elementów programowania, ponieważ umożliwiają wykonywanie obliczeń na danych. Programiści używają ich w niemal każdej aplikacji, niezależnie od języka programowania. W tej lekcji omówimy szczegółowo, jak wykonywać operacje na liczbach całkowitych i zmiennoprzecinkowych oraz jakie różnice istnieją między nimi. Przeanalizujemy operatory arytmetyczne, przykłady kodu, a także potencjalne pułapki i błędy, które mogą się pojawić podczas pracy z liczbami.

Czym są operacje arytmetyczne?

Operacje arytmetyczne to działania matematyczne, które można wykonywać na liczbach, takie jak dodawanie, odejmowanie, mnożenie i dzielenie. W programowaniu operacje te są realizowane za pomocą specjalnych symboli, zwanych operatorami arytmetycznymi. Do podstawowych operatorów należą:

  • + (dodawanie)
  • - (odejmowanie)
  • * (mnożenie)
  • / (dzielenie)
  • % (modulo – tylko dla liczb całkowitych)

Operatory te mogą być używane zarówno do prostych obliczeń, jak i do bardziej skomplikowanych wyrażeń, które łączą wiele operacji.

Operacje na liczbach całkowitych

Liczby całkowite to liczby bez części dziesiętnej, takie jak -5, 0, 1, 42. W programowaniu liczby całkowite są często używane w obliczeniach, które nie wymagają precyzji zmiennoprzecinkowej, na przykład w przypadku liczników, indeksów tablic czy operacji modulo.

Podstawowe operatory arytmetyczne dla liczb całkowitych
  1. Dodawanie (+): Operator dodawania sumuje dwie liczby całkowite.
int a = 5;
int b = 10;
int suma = a + b;  // suma wynosi 15

2. Odejmowanie (-): Operator odejmowania oblicza różnicę między dwiema liczbami całkowitymi.

int a = 10;
int b = 4;
int roznica = a - b;  // roznica wynosi 6

3. Mnożenie (*): Operator mnożenia oblicza iloczyn dwóch liczb całkowitych.

int a = 3;
int b = 7;
int iloczyn = a * b;  // iloczyn wynosi 21

4. Dzielenie całkowite (/): Operator dzielenia całkowitego dzieli jedną liczbę całkowitą przez drugą i zwraca wynik bez części dziesiętnej (zaokrąglony w dół do najbliższej liczby całkowitej).

int a = 10;
int b = 3;
int wynik = a / b;  // wynik wynosi 3, ponieważ 10 / 3 = 3.333, a wynik jest zaokrąglany w dół

5. Modulo (%): Operator modulo zwraca resztę z dzielenia jednej liczby całkowitej przez drugą.

int a = 10;
int b = 3;
int reszta = a % b;  // reszta wynosi 1, ponieważ 10 = 3 * 3 + 1
  1. Operacja modulo jest przydatna w różnych sytuacjach, na przykład przy określaniu, czy liczba jest parzysta lub nieparzysta (sprawdzając liczba % 2).
Zasady i pułapki w operacjach na liczbach całkowitych
  1. Zaokrąglanie w dół przy dzieleniu: Dzielenie całkowite zawsze zaokrągla wynik w dół, co może prowadzić do nieoczekiwanych rezultatów. Na przykład, 7 / 3 zwraca 2, a nie 2.33.
  2. Przepełnienie: Liczby całkowite mają ograniczony zakres, który zależy od typu danych. Na przykład w C++ typ int ma zakres od -2,147,483,648 do 2,147,483,647. Jeśli wynik operacji przekroczy ten zakres, wystąpi przepełnienie, co może prowadzić do nieprzewidywalnych wyników.
int maxInt = 2147483647;
int wynik = maxInt + 1;  // wynik może być nieprzewidywalny z powodu przepełnienia

3. Znaki liczb: Podczas wykonywania operacji arytmetycznych na liczbach ujemnych musimy być ostrożni, ponieważ wynik może zmieniać znak w zależności od operatora i wartości operantów.

Operacje na liczbach zmiennoprzecinkowych

Liczby zmiennoprzecinkowe to liczby, które mają część dziesiętną, takie jak 3.14, -0.001, 2.0. W programowaniu są używane w sytuacjach, gdy potrzebna jest precyzja zmiennoprzecinkowa, na przykład w obliczeniach naukowych, finansowych czy graficznych. Liczby zmiennoprzecinkowe są przechowywane w pamięci w formacie binarnym, co może prowadzić do ograniczeń precyzji i błędów zaokrągleń.

Podstawowe operatory arytmetyczne dla liczb zmiennoprzecinkowych
  1. Dodawanie (+): Operator dodawania sumuje dwie liczby zmiennoprzecinkowe.
double a = 5.5;
double b = 2.3;
double suma = a + b;  // suma wynosi 7.8

2. Odejmowanie (-): Operator odejmowania oblicza różnicę między dwiema liczbami zmiennoprzecinkowymi.

double a = 10.0;
double b = 4.5;
double roznica = a - b;  // roznica wynosi 5.5

3. Mnożenie (*): Operator mnożenia oblicza iloczyn dwóch liczb zmiennoprzecinkowych.

double a = 3.2;
double b = 2.0;
double iloczyn = a * b;  // iloczyn wynosi 6.4

4. Dzielenie (/): Operator dzielenia dzieli jedną liczbę zmiennoprzecinkową przez drugą i zwraca wynik z częścią dziesiętną.

double a = 7.0;
double b = 2.0;
double wynik = a / b;  // wynik wynosi 3.5
Błędy zaokrągleń i ograniczenia precyzji

Liczby zmiennoprzecinkowe nie zawsze mogą być reprezentowane dokładnie w pamięci komputera, co prowadzi do błędów zaokrągleń. Na przykład wynik 0.1 + 0.2 może nie być dokładnie równy 0.3 ze względu na sposób, w jaki liczby są przechowywane w systemie binarnym.

Przykład błędu zaokrąglenia:

double a = 0.1;
double b = 0.2;
double suma = a + b;  // suma może wynosić 0.30000000000000004 zamiast 0.3
Metody minimalizowania błędów zaokrągleń
  1. Zaokrąglanie wyników: W przypadku, gdy wymagana jest wysoka precyzja (np. w aplikacjach finansowych), można zaokrąglać wyniki do określonej liczby miejsc po przecinku.
#include <iomanip>
#include <iostream>

double a = 0.1;
double b = 0.2;
double suma = a + b;
std::cout << std::fixed << std::setprecision(2) << suma;  // Wypisze: 0.30

2. Używanie bibliotek matematycznych: W niektórych przypadkach, aby zwiększyć precyzję, można skorzystać z bibliotek matematycznych oferujących większą dokładność, takich jak biblioteki do liczb zmiennoprzecinkowych o podwójnej precyzji.

Różnice między operacjami na liczbach całkowitych i zmiennoprzecinkowych

  1. Precyzja: Liczby całkowite są dokładne, ale nie nadają się do reprezentowania wartości z częścią dziesiętną. Liczby zmiennoprzecinkowe mogą reprezentować liczby dziesiętne, ale mogą zawierać błędy zaokrągleń.
  2. Zakres: Liczby całkowite mają ograniczony zakres, który zależy od typu danych, np. int czy long. Liczby zmiennoprzecinkowe mają szerszy zakres, ale ich dokładność zmniejsza się wraz ze wzrostem liczby.
  3. Zastosowanie: Liczby całkowite są używane do operacji, które wymagają dokładności (np. indeksowanie tablic, liczniki w pętlach), podczas gdy liczby zmiennoprzecinkowe są używane w obliczeniach wymagających precyzji dziesiętnej (np. obliczenia finansowe, naukowe).

Praktyczne zastosowania operacji arytmetycznych

  1. Obliczenia finansowe: W aplikacjach finansowych często stosuje się liczby zmiennoprzecinkowe, ale należy uważać na błędy zaokrągleń. Często stosuje się także typy danych specjalnie zaprojektowane do obliczeń finansowych, aby uniknąć tych problemów.
  2. Fizyka i symulacje: W symulacjach fizycznych operacje arytmetyczne na liczbach zmiennoprzecinkowych są niezbędne, ale wymagana jest ostrożność przy obliczeniach, które mogą prowadzić do utraty precyzji.
  3. Grafika komputerowa: W grafice komputerowej operacje zmiennoprzecinkowe są używane do obliczeń związanych z pozycjonowaniem i ruchem obiektów, a także do obliczeń kolorów i cieniowania.

Podsumowanie

Operacje arytmetyczne na liczbach całkowitych i zmiennoprzecinkowych są podstawą niemal każdego programu. Zrozumienie, jak działają te operacje, oraz świadomość ich ograniczeń i pułapek (takich jak błędy zaokrągleń i przepełnienia) są kluczowe dla każdego programisty. W tej lekcji nauczyłeś się, jak wykonywać podstawowe operacje arytmetyczne, jakie są różnice między liczbami całkowitymi a zmiennoprzecinkowymi, oraz jakie techniki stosować, aby minimalizować błędy w obliczeniach.

Następny podtemat ==> Wyrażenia logiczne: Prawda i fałsz



Spis Treści - Wstęp do programowania

Lekcja 3: Rozwiązywanie problemów i poprawność programów Lekcja 4: Praca z różnymi typami danych Lekcja 5: Obsługa plików i pamięci Lekcja 6: Zaawansowane techniki programistyczne Lekcja 7: Wskaźniki i pamięć dynamiczna Lekcja 8: Struktura kodu i abstrakcja Lekcja 9: Rekurencja i jej zastosowania Lekcja 10: Analiza wydajności algorytmów Lekcja 11: Technika "dziel i zwyciężaj" Lekcja 12: Struktury danych o dynamicznej budowie Lekcja 13: Struktury hierarchiczne: Drzewa Lekcja 14: Struktury danych z bibliotek Lekcja 15: Algorytmy z nawrotami Lekcja 16: Programowanie dynamiczne Lekcja 17: Programowanie zachłanne Lekcja 18: Praca z grafami

Jeśli chciałbyś być poinformowany o następnych kursach to zapisz się do naszego newslettera: