Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

Ahoj, podle zdejšího návodu jsem si vytvořil metodu pro výpočet libovolné odmocniny. Můj problém je ten, že výpočet někdy funguje a jindy se zasekne. Nevím čím to je a tímto vás žádám o radu, kde mám chybu a případně o opravu :-) Přikládám kód.

public static double Odmocni(double a, double b)
{
    double v, x, y;
    v = a + 1;
    x = v / b;
    y = a / x;
    v = x + y;
    while (Math.Pow(x, b) != a)
    {
        x = v / b;
        y = a / x;
        v = x + y;

    }
    { return x; }
}
Editováno 14.4.2015 20:48
 
Odpovědět 14.4.2015 20:47
Avatar
rwn
Člen
Avatar
Odpovídá na Ondřej Krsička
rwn:

Já teda nevim z jakého návodu tady vycházíš a ani jsem nikdy nic podobného neřešil. Ale napadlo mě.. co jít na to trochu vychytrale. :) Odpocnina je v podstatě mocnina, která bude mít převrácený exponent (čitatel za jmenovatel).

public static double Odmocni(double a, double b)
{
    return Math.Pow(a, 1/b);
}
Editováno 14.4.2015 23:36
Nahoru Odpovědět  +1 14.4.2015 23:33
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
rwn
Člen
Avatar
Odpovídá na Ondřej Krsička
rwn:

Jinak ten problém je bych řekl v tom, že tobě ten while někdy nemusí přesně vyjít. On se jakoby s každým proběhnutým cyklem iteruje směrem k řešení, ale velikost typu double je omezená a on se není schopen iterovat na nějaká 15.pozici už směrem k řešení. Do toho cyklu si přidej výpis aktuálního výsledku, co by to zrovna vrátilo

while (Math.Pow(x, b) != a)
{
    x = v / b;
    y = a / x;
    v = x + y;

    Console.WriteLine(x.ToString());
}

Když tam zadáš nějakou jednoduchou odmocninu třeba 2. odmocnina z 81, tak vidíš, jak se to blíží k řešení, když tam ale zadáš třeba 3. odmocninu z 81 tak ti tam hned skočí nějaké číslo, které se už nemůže s dalším cyklem někam posunout, protože ta hodnota co se ti mění (a jen její vhodná změna může zastavit cyklus) se číselně nemění na pozici, kterou by mohl typ double zaznamenat..

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 14.4.2015 23:59
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na rwn
Ondřej Krsička:

Paráda, tak trochu jednodušší způsob. Dík za obě odpovědi

 
Nahoru Odpovědět 15.4.2015 7:25
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 4 zpráv z 4.