gdb
Jestliže nevidíte správně česká písmena, zvolte potřebné kódování češtiny manuálně.
Oprava:
2.3.2005: Místo modulu devel je nutno použít devel2
3.3.2005: Opraven odevzdávací adresář
e
z
definice. e
je definováno jako limita posloupnosti (1+1/n)n,
takže počítejme:#include <stdio.h> #include <math.h> int main(void) { double n, prevr_n, mocnenec, e; for(n=1;n<1e20;n*=10) { prevr_n = 1/n; mocnenec = 1+prevr_n; e = pow(mocnenec,n); printf("n= %20.0f e= %f\n",n,e); } return 0; }
gcc -std=c99 -g -Wall -o cv2 cv2.c -lm
gdb
a odhalit,
proč dochází k nečekaným výsledkům. e
, který bude počítat numericky
stabilním způsobem. Potřebné nástroje získáte ve 3. přednášce, kdy
už také budete mít vytvořen odevzdávací adresář /export/e1/pb071/váš_login/cvic2
;
do něj program uložte pod názvem e.c
. Za odevzdání fungujícího
programu nejpozději v den Vašeho 4. cvičení získáte +2 body. Ale
pozor, triviální řešení s použitím standardní funkce exp()
nebude
uznáno. Námět: Co takhle Taylorova řada?Poznámky:
for
bychom samozřejmě mohli zapsat kompaktněji bez
pomocných proměnných a jediným příkazem:for(n=1;n<1e20;n*=10)printf("n= %f e= %20.0f\n",n,pow(1+1/n,n);
-lm
je nutno použít při překladu vždy, když program volá
některou matematickou funkci. Souběžně s tím musí v záhlaví programu být zapsána
direktiva #include <math.h>
pow(u,v)
počítá obecnou mocninu uv; v jazyku C totiž neexistuje
operátor mocnění. gdb
, musíme před jejím spuštěním provést místo
příkazu module add gcc
příkaz module add
devel2
/home/jkucera/pb071/cvic2/e
. Jeho zdrojový tvar má 11 řádků (204 znaků). (Zdrojové verze
vzorových řešení vám však nejsou k
dispozici.) Povšimněte si, že I-tý člen sčítané řady se získá vydělením
předchozího členu číslem n.![]() |
![]() |
![]() |