(* Trzy typowe sposoby definiowania własnych funkcji: *)

f1[x_]:=10x-9/10

f2=Function[{x},10x-9/10]

f3=10#-9/10&

(* Wywołanie funkcji *)

f1[0.1]

f2[0.1]

f3[0.1]

f=Function[{x},10x-9/10] (* funkcja w wersji pierwszej *)

g=Function[{x},10x-0.9](* funkcja w wersji drugiej *)

(* obliczenie wartości w fukcji w czterech żadanych kombinacjach: *)
{{"","f[x]","g[x]"},{"x=1/10",f[1/10],g[1/10]},{"x=0.1",f[0.1],g[0.1]}}//MatrixForm

(* ,,Ręczne'' złożenie fukcji *)
f[f[f[f[f[f[0.1]]]]]]

(* Automatyczne składanie *)
Nest[h,0.1,10]

NestList[h,0.1,10] (* lista ze wszystkimi wynikami pośrednimi *)

Manipulate[
{{"","f[x]","g[x]"},{"x=1/10",Nest[f,1/10,n],Nest[g,1/10,n]},{"x=0.1",Nest[f,0.1,n],Nest[g,0.1,n]}}//MatrixForm
,
{n,1,32,1}
](* suwakiem ustalamy ile razy funkcje mają być składane; wynik dokładny to oczywiście zawsze 0.1 *)

WNIOSEK: Liczby zmiennoprzecinkowe (nie wchodząc w szczegółowe definicje to te zawierające ,,kropkę'' dziesiętną) mają ograniczoną precyzję, i operacje na nich są obarczone błędami. Błędy te mogą ujawnić się w nieoczekiwanych sytuacjach, jak w przykładzie wyżej.

Precision[1/10] (* precyzja symbolu liczby wymiernej jest nieskończona*)

Precision[Pi] (* podobnie dla symbolu rozumianego jako liczba Pi ... *)

Precision[Infinity] (* ... oraz symbolu intuicyjnie interpretowanego jako ,,nieskończoność''*)

Precision[0.1] (* liczby wpisane z ,,kropką'' automatycznie zostają uznane za liczby o precyzji procesora *)

0.1//FullForm

$MachinePrecision (* ilość liczb po przecinku procesora *)

0.1`100 (* w ten sposób podajemy liczbę z precyzją okresloną na 100 miejsc po przecinku *)

Nest[f,0.1`100,64] (* teraz możemy funkcję f złożyć więcej razy otrzymując sensowny wynik *)

Precision[%] (* wynik ma nadal sens z dokładnością 36 miejsc po przecinku*)

Nest[g,0.1`100,64] (* funkcji g to nie pomoże, bo w swojej definicji już zawiera liczbę 0.1 *)

Precision[%]