Diskuze: Brentův-Salaminův Algoritmus (Pí)

C# .NET .NET (C# a Visual Basic) Brentův-Salaminův Algoritmus (Pí) American English version English version

Avatar
dvorak.vit94
Člen
Avatar
dvorak.vit94:

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:

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
Redaktor
Avatar
Odpovídá na dvorak.vit94
coells:
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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 24.11.2014 20:49
Avatar
dvorak.vit94
Člen
Avatar
Odpovídá na coells
dvorak.vit94:

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:

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
Redaktor
Avatar
Odpovídá na dvorak.vit94
coells:

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:

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

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

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:

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:

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.