PB071 - 2. cvičení

Seznámení s ladicí utilitou 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ář

  1. Zapište do souboru program pro výpočet přibližné hodnoty čísla 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;
    
        }
  2. Program přeložte, odstraňte případné chyby vzniklé překlepy a odzkoušejte. Protože program obsahuje volání matematické funkce a budeme jej ladit, použijte pro překlad příkaz:
    gcc -std=c99 -g -Wall -o cv2 cv2.c -lm
  3. Zdá se, že zprvu posloupnost skutečně konverguje k hodnotě 2.71828..., ale pro hodně velká n se to nějak pokazí.
  4. Pokuste se sledovat průběh výpočtu ladicím nástrojem gdb a odhalit, proč dochází k nečekaným výsledkům.
  5. Dobrovolné rozšíření: Vytvořte program pro výpočet čísla 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:

  1. Celý cyklus 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);
    V tom případě bychom však nemohli sledovat jeho postupné provádění.
  2. Parametr -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>
  3. Funkce pow(u,v) počítá obecnou mocninu uv; v jazyku C totiž neexistuje operátor mocnění.
  4. Chceme-li použít utilitu 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
  5. Pro porovnání a inspiraci si můžete spustit vzorové řešení nepovinného rozšíření ze souboru /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.

Předchozí Předchozí cvičení Další Další cvičení Hlavní stránka Hlavní stránka