%% Első labor: A lebegőpontos számítások alapjai

%% Túlcsordulás
% A Matlab dupla pontosságú lebegőpontos ábrázolásában 52 bit jut a
% mantisszára (értékes jegyek száma), 1 előjelbit, 11 jegy a
% karakterisztikára (de ebből egy előjelbit). Ennek következménye:
(2^53+1)-2^53

%% $\epsilon_0, \epsilon_1$
% A legkisebb ábrázolható szám: $\epsilon_0$
realmin
%%
% Viszont ez nem azt jelenti, hogy ilyen finomsággal tudjuk ábrázolni a
% lebegőpontos számokat. Ezt az 1 utáni legkisebb ábrázolható szám adja
% meg: $\epsilon_1$
format long
1+2^-52
%%
1+2^-53
%%
53/10*3
%%
% Ez nagyjából 15 értékes jegynek felel meg, ennyi a maximális szóbajövő számítási
% pontosság. Sajnos ez sem mindig elérhető.

%% Összeadás

s=1;
p=0;
for i=1:10 
    s=s+10^(-16);
    p=p+10^(-16);
end, 
s
%%
p=p+1
%%
% Azaz érdemes először a kicsi tagokat összeadni, nem mindegy a sorrend.


%% Kivonás
% Vegyük a két elvben egyforma mennyiséget: sqrt(a)-sqrt(a-1), illetve
% 1/(sqrt(a)+sqrt(a-1)).
c=sqrt(10^6)-sqrt(999999)     
%%
d=1/(sqrt(10^6)+sqrt(999999))
%%
% Kiegyszerűsödés: két közeli szám kivonasákor fellépő jegyveszteség
% Ha a két számban az első k jegy azonos, akkor a különbségükben az első k jegy értektelen
% Az elsőben az utolsó 6 jegy nem stimmel, a második a jó.
% Tanulság: numerikusan megbízhatatlan egymáshoz közeli számok kivonása.
%%
% Vegyük az x^2+b*x+1 egyenlet gyökeit. Ekkor a diszkrimináns:
% sqrt(b^2-4*a*c), azaz
b=10^9; %esetén
D=sqrt(b^2-4) % a diszkrimináns
%%
% Ekkor az egyik gyök: (-b+D)/2, itt:
x1=(-b+D)/2 % ez rossz, viszont helyette az előbbi módszerrel
%%
x11=-2/(b+D) % ami sokkal közelebb van a pontos gyökhöz (bár nem annyi)

%% Szorzás
% Sajnos itt sem számíthatunk pontos eredményre minden szituációban:
(1-10^-9)*(1+10^-9)
%%
% A nagy számmal való szorzás is veszélyes művelet, ugyanis 
% felnagyíthatja a hibákat.

%% Osztás
% A 0 közeli számokkal veszélyes osztani, például:

1/(sqrt(10^10)-sqrt(10^10-1)) 
%%
% helyette:
sqrt(10^10)+sqrt(10^10-1)


%% Saját függvények 
% Mi magunk is készíthetünk saját függvényeket, a már beépített függvények felhasználásával.
% Ennek módja
% function kimenet(ek)=függvénynév(bemenet(ek)) 
% ez egy külön .m fájlba kell menteni, hogy mûködjön,
% és a fájl nevén kell meghívni.

%%
% A függvényüket a parancssorból tudjuk használni, ha abban a könyvtárban
% vagyunk, ahová mentettük. Ezt a pwd paraccsal (vagy a felsõ sorban)
% ellenõrizhetjük. 

%%
% Vigyázat, minden a függvény belsejében szereplõ változó lokális, azaz a
% függvény futása után nem tudjuk elérni, például v-t sem látjuk!

%%
% Több bemenet és kimenet is lehetséges, ez a függvény például visszaadja a 
% bementeként kapott számok összegét és szorzatát
%%
% <include>szamol.m</include>

%% Órai feladat
% Készítsünk egy olyan függvényt, amely minél pontosabban oldja meg a
% másodfokú egyenletet (vizsgálja, hogy lehet-e kiegyszerűsödés). Az első
% sor legyen function [gyok1, gyok2]=masodfoku(a,b,c).

%%
% <include>masodfoku.m</include>
