IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
dvorak.vit94
Člen
Avatar
dvorak.vit94:24.11.2014 19:44

Dobrý den, Mám problém s Brent-Salamin Algorithm. Tento algoritmus vypočítá Pí pomocí vzorců a s každým dalším krokem se upřesní jeho desetinná hodnota.
Jak je ve zdrojáku ukázán první krok..
Dále by mělo být an2= (an1+bn1)/2 atd... záleží na tom, kolik zadá uživatel hodnotu aby se to tolikrát opakovalo.
Moc Díky za pomoc.

Console.WriteLine("Brentuv-Salaminuv algoritmus");
            Console.WriteLine();
            Console.Write("Zadejte počet desetinných míst pro PÍ: ");

            double a = 1;
            double b = Math.Sqrt(2) / 2;
            double r = 1;
            double s = 0.5;
            double an, bn, cn, rn, sn, P;
            double an1, bn1, cn1, rn1, sn1, P1;

            an = (a + b) / 2;
            bn = Math.Sqrt(a * b);
            cn = (an - b) * (an - b);
            rn = 2 * r;
            sn = s - (cn * rn);
            P = (2 * (an * an)) / sn;

            double pocetO = double.Parse(Console.ReadLine());

            for (int i = 0; i < pocetO; i++)
            {
                an1 = (an +bn)/2;
                bn1 = Math.Sqrt(an * bn);
                cn1 = (an1 - bn) * (an1 - bn);
                rn1 = 2 * rn;
                sn1 = sn - (cn1 * rn1);
                P1 = (2 * (an1 * an1)) / sn1;

                Console.WriteLine("Pí je: " +P1);

            }
 
Odpovědět
24.11.2014 19:44
Avatar
Odpovídá na dvorak.vit94
Michal Štěpánek:24.11.2014 19:57

Myslím, že pocet0 by asi neměl být double, ale int.
Co přesně ti nefunguje?

Nahoru Odpovědět
24.11.2014 19:57
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
coells
Tvůrce
Avatar
Odpovídá na dvorak.vit94
coells:24.11.2014 20:49
double a = 1;
double b = Math.Sqrt(2) / 2;
double r = 1;
double s = 0.5;

for (int i = 0; i < 5; i++)
{
    double an = (a + b) / 2;
    double bn = Math.Sqrt(a * b);
    double cn = (an - b) * (an - b);
    double rn = 2 * r;
    double sn = s - cn * rn;

    double pi = 2 * an * an / sn;
    int k = (int)-Math.Log(cn, 10);
    // PI s presnosti na K desetinnych mist

    a = an;
    b = bn;
    r = rn;
    s = sn;
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
24.11.2014 20:49
Avatar
dvorak.vit94
Člen
Avatar
Odpovídá na coells
dvorak.vit94:24.11.2014 21:03

Jenže, se to mění jen do 4. operace... Já bych potřeboval aby uživatel zadal počet operací.. Když tam dám víc, tak už se to jen opakuje ta stejná hodnota..

 
Nahoru Odpovědět
24.11.2014 21:03
Avatar
dvorak.vit94
Člen
Avatar
Odpovídá na Michal Štěpánek
dvorak.vit94:24.11.2014 21:07

No tak má..no potřebuju jak mám ty vzorečky tak aby se v těch vzorečkách nahrazovali hodnoty nejdříve tam mám ve vzroci a pak potřebuju an pak an1 pak an2 a to u všech... Jestli chápeš :)

 
Nahoru Odpovědět
24.11.2014 21:07
Avatar
coells
Tvůrce
Avatar
Odpovídá na dvorak.vit94
coells:24.11.2014 21:08

No jistě, protože typ double má přesnost 15 desetinných míst, víc z něho už nedostaneš.
Dokonce i když zkusíš použít typ decimal, pořád dostaneš maximálně 28 desetinných míst, což odpovídá 4 krokům.

Brent-Salamin má kvadratickou konvergenci a vysoká přesnost během nízkého počtu iterací je jeho předností.

 
Nahoru Odpovědět
24.11.2014 21:08
Avatar
dvorak.vit94
Člen
Avatar
Odpovídá na coells
dvorak.vit94:24.11.2014 21:11

Takže už to lépe nepujde? :)

 
Nahoru Odpovědět
24.11.2014 21:11
Avatar
coells
Tvůrce
Avatar
Odpovídá na dvorak.vit94
coells:24.11.2014 21:13

Nepůjde.

Pokud by ses pokusil použít nějakou knihovnu, která podporuje vyšší počet desetinných míst, vůbec si nepomůžeš, protože potřebuješ inicializovat horní limitu b=sqrtinv(2).

 
Nahoru Odpovědět
24.11.2014 21:13
Avatar
dvorak.vit94
Člen
Avatar
Odpovídá na coells
dvorak.vit94:24.11.2014 21:16

Dobře, tak moc děkuji :)

 
Nahoru Odpovědět
24.11.2014 21:16
Avatar
Odpovídá na dvorak.vit94
Michal Štěpánek:25.11.2014 7:25

Co myslíš tím "No tak má"? Jakože to pocet0 má být double? Jak se počet desetinných míst zadává desetinným číslem?

Nahoru Odpovědět
25.11.2014 7:25
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.