Dane typu całkowitego (int
, integer
)
Typ danych dostępny praktycznie w każdym języku programowania. Współcześnie, podstawowa dana typu int
zapisywana jest na 32 bitach (4 bajty) w kodzie uzupełnieniowym do dwóch. Z trzydziestu dwu bitów jeden (najbardziej znaczący1) wykorzystywany jest do zapamiętania znaku (zawsze 1 oznacza liczbę ujemną, a 0 — dodatnią), pozostałe służą do zapisu liczby. Dowolną liczbę całkowitą
Ogólnie, gdy do zapisu liczby wykorzystujemy
W ten sposób mogą być reprezentowane liczby z zakresu
typ (C) | zakres | |
---|---|---|
7 | char | |
15 | short int | |
31 | int | |
63 | long int |
Plik nagłówkowy limits.h
zawiera definicje kilku stałych, które pozwalają zawsze sprawdzić, jakie graniczne wartości mogą przyjmować zmienne określonego typu. Definiują one stałe nazywajace się: SCHAR_MIN
i SCHAR_MAX
(minimalna i maksymalna wartość zmiennej signed char
) SHRT_MIN
i SHRT_MAX
, INT_MIN
i INT_MAX
, LONG_MIN
i LONG_MAX
czy LLONG_MIN
i LLONG_MAX
. Trochę kłopotów może sprawiać typ long int
który może mieć różne zakresy w zależności od tego czy komputer jest 32-bitowy czy 64-bitowy. Podczas programowania, korzystając ze stałych takich typów, nalezy pamiętać o odpowiednich przyrostkach: L
— long, LL
— long long czy U
— unsigned, UL
— unsigned long, itd.
W zasadzie wszystkie obliczenia na liczbach całkowitych dokonywane są dokładnie. Wyjątki od tej reguły są dwa:
Operacja dzielenia nigdy nie wyprowadza poza typ całkowity. Jest to dzielenie całkowitoliczbowe („z resztą").
Wynik działania wykracza poza dopuszczalny zakres; podawany jest wówczas modulo
.
Dane typu niecałkowitego
Dowolną liczbę rzeczywistą
![]“Problemy z liczbami zmiennoprzecinkowymi”(./floating-point.png “Problemy z liczbami zmiennoprzecinkowymi, za Examples of floating point problems)
W realizacji komputerowej cecha liczby
korzystamy (gdy mantysa została prawidłowo zaokrąglona do
Liczba
Jezeli reprezentację zmiennoprzecinkową liczby
co można zapisać:
Liczby rzeczywiste reprezentowane są, na ogół, niedokładnie. Błąd względny float
(32-bitowych) lub 53 (double
; 64 bity).
Liczba cyfr mantysy decyduje o dokładności liczb rzeczywistych, a liczba cyfr cechy — o ich zakresie. Cecha
Szczegóły zapisu liczb zmiennoprzecinkowych zawiera norma IEEE-754 .
Można zaryzykować twierdzenie że zakres liczb i ich precyzja są wystarczająco duże aby prowadzić obliczenia w miarę dokładnie, ale jak przyjrzeć się szczegółom — różnie to bywa. A wynik długotrwałych i skomplikowanych działań może być trudny do przewidzenia.
Programiści języka C mogą korzystać ze stałych zdefiniowanych w pliku nagłówkowym float.h
: FLT_MIN
i FLT_MAX
, DBL_MIN
i DBL_MAX
, a nawet LDBL_MIN
/LDBL_MAX
dla liczb poczwórnej dokładności(long double
) . W przypadku liczb typu float
maksymalna wartość to: 3.40282e+38.
Rozważmy prosty przykład:
Niech
W przypadu gdy wartości float
, a wartość
#include <stdio.h>
#include <math.h>
float
modul1 (float a, float b)
{
return sqrtf (a * a + b * b);
}
float
modul3 (float a, float b)
{
return fabs (a) * sqrtf (1 + powf (fabs (b) / fabs (a), 2));
}
float
modul2 (float a, float b)
{
if (fabs (a) > fabs (b))
return modul3 (a, b);
else
return modul3 (b, a);
}
int
main (int argc, char *argv[])
{
float m;
m = modul1 (2e-25f, 2e-25f);
printf ("Bardzo male\n");
printf ("modul1=%g\n", m);
m = modul2 (2e-25f, 2e-25f);
printf ("modul2=%g\n", m);
printf ("Bardzo duze\n");
m = modul1 (2e25f, 2e25f);
printf ("modul1=%g\n", m);
m = modul2 (2e25f, 2e25f);
printf ("modul2=%g\n", m);
return 0;
}
Modyfikacja polega na tym, że wzór zapisujmy w alternatywnej postaci. Niech
Druga metoda (funkcja modul2()
daje poprawne wyniki gdy jej argumenty są bardzo małe jak i bardzo duże.
Domyślny typ
Matlab
Domyślnym typem dla obliczeń numerycznych w Matlabie jest typ double
.
Nie wyklucza to użycia zmiennych innego typu, ale trzeba je osobno deklarować
Więcej na ten temat można znaleźć w odpowiednim tutorialu.
Mathematica
W przypadku Mathematici, która zazwyczaj wszystkie obliczenia wykonuje symbolicznie sprawa jest znacznie bardziej skomplikowana.
Funkcja N[]
pozwala podać żądaną precyzję obliczeń
In[1] := N[1/7]
Out[1] := 0.142857
Jeżeli precyzji nie podamy — obliczenia będą wykonywane z tak zwaną precyzją maszynową. Wówczas obliczenia prowadzone są w arytmetyce 64-bitowej.
Jeżeli precyzję zadamy — wygląda to tak:
In[1]:= N[1/7,50]
Out[1]= 0.14285714285714285714285714285714285714285714285714
To ten pierwszy z lewej. ↩︎
Raz jeszcze przypominam, że zapis liczby jest na
bitach; ten dodatkowy bit, to bit znaku. ↩︎Określenia mantysa i cecha są niepoprawne, ale ciągle jeszcze tradycyjnie używane przy opisie liczb zmiennoprzecinkowych. Po angielsku zamiast mantysa używa się określenia significant; cecha to exponent. Polska Wikipedia pozostaje przy mantysa, choć dodaje też liczba ułamkowa; obok cecha dodaje wykładnik… ↩︎