Zamiluj se s námi do IT! Dobij si nyní kredity a získej až 80 % extra kreditů na e-learningové kurzy ZDARMA. Zjisti více.
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í.

Diskuze – Lekce 10 - Výpočet libovolné mocniny

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Tomáš
Neregistrovaný
Avatar
Odpovídá na Kit
Tomáš:14.1.2014 22:08

Myslel jsem kod programu, ktery by to dokazal počítat, na tenhle odkaz jsem se díval a navíc to nesedí na cely definicni obor..

 
Odpovědět
14.1.2014 22:08
Avatar
coells
Tvůrce
Avatar
Odpovídá na
coells:15.1.2014 0:01

Jiste, ze to sedi na cely definicni obor, staci pouzivat vety o logaritmech.

#import <Foundation/Foundation.h>

double ln(double x, int steps)
{
    if (x == 0)
        return -1.0 / 0.0;
    if (x < 0)
        return 0.0 / 0.0;

    double t = x;
    double multiplier = 0.0;
    double ln_10 = 2.302585092994046;

    while (t >= 1.0) t /= 10.0, multiplier++;
    while (t < 0.1) t *= 10.0, multiplier--;

    double taylor = 0.0;
    double y = 1.0;
    double sgn = 1.0;

    for (double i = 1.0; i <= steps; i++)
    {
        y *= t - 1.0;
        taylor += sgn * y / i;
        sgn = -sgn;
    }

    return taylor + ln_10 * multiplier;
}

int main(int argc, const char * argv[])
{
    const int steps = 10000;

    double ln_0 = ln(0, steps);
    double ln_1 = ln(-1, steps);

    double x = 28394;
    double ln_x = ln(x, steps);
    double exact_x = log(x);

    NSLog(@"ln(0)=%f\nln(-1)=%f\nln(x)=%f\nlibrary log(x)=%f\n", ln_0, ln_1, ln_x, exact_x);

    return 0;
}
 
Odpovědět
15.1.2014 0:01
Avatar
fanda
Člen
Avatar
fanda:17.8.2015 15:53

Ahoj, zkusím doplnit alternativní způsob výpočtu mocniny

/// <summary>
/// Výpočet mocniny s časovou náročností ln(N) a paměťovou 1.
/// </summary>
/// <param name="a">základ</param>
/// <param name="b">exponent</param>
/// <returns>Vrací a umocněno na b.</returns>
public static double Pow(double a, int b)
{
        // Povinné ošetření mezních situací
        if (b == 0) return 1;
        if (b < 0)  return 1 / Pow(a, -b);

        // Výpočet:
        //      Pow = a ** b
        // je převeden na:
        //      Pow = (a ** b) * c;
        //   kde c = 1.
        double c = 1;
        while (b > 1)
        {
                // Před úpravou argumentů platí: Pow = (a ** b) * c
                c *= (b & 1) == 1 ? a : 1;
                a *= a;
                b >>= 1;
                // Po úpravě argumentů stále platí: Pow = (a ** b) * c,
                // ale b je poloviční.
        }

        // Stále platí:
        //    Pow = (a ** b) * c;
        // ale b == 1, takže vzorec je možné zjednodušit na:
        //    Pow = (a ** 1) * c = a * c
        return a * c;
}
 
Odpovědět
17.8.2015 15:53
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na
David Hynek:17.8.2015 18:33

Taylorův polynom... celkem by mě to zajímalo. Dokážete jej polopaticky vysvětlit? Já s ním mám celkem problém...

Odpovědět
17.8.2015 18:33
Čím víc vím, tím víc věcí nevím.
Avatar
 
Odpovědět
17.8.2015 18:56
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na David Hynek
Jan Vargovský:17.8.2015 19:02

Máš funkci a tu nahradíš polynomem n-tého řádu v nějakém bodě x. Čím je řád n vyšší, tím je okolí x čím dál tím přesnější. Tohle je takový začátek co to zhruba je.

 
Odpovědět
17.8.2015 19:02
Avatar
ing. SARNOVSKÝ Petr:23.1.2024 16:22

V textu je překlep

b < 0 - výsledek je převrácená hodnota takové mocniny, kde je argument b kladný (např. 2−3 = 1 / 23).

Správně mý být závorka (např. -23 = 1 / 23)

Jinak supr. Děkuji

 
Odpovědět
23.1.2024 16:22
Avatar
Karel Půček:19.9.2024 15:37

Tak jsem ten příklad z Javy přepsal do Pythonu. Teoreticky v pořádku, ale nechápu výhodnost oproti učebnímu příkladu

print("Mocninátor")
print("==========")
a = int(input("Zadejte základ mocniny: "))
n = int(input("Zadejte exponent: "))
result = a
for i in range(n - 1):
    result = result * a

print(f"Výsledek: {result}")
print("Děkuji za použití mocninátoru")
print("Funkce podle příkladu z Matematiky v Javě")
print("=========================================")

a = int(input("Zadej základ mocniny: "))
b = int(input("Zadej exponent: "))

# Vrati 'a' umocnene na 'b'. Pokud je 'b' kladne.
def mocneni_kladnym_cislem(a, b):
    c = a
    for x in range(b, b > 1, -1):
        c = c * a
        return c

# Vrati 'a' umocnene na 'b'.
def mocneni(a, b):
    if b > 0:
        return mocneni_kladnym_cislem(a, b)
    elif b < 0:
        return 1 / mocneni_kladnym_cislem(a, abs(b))
    else:
        return 1

print(mocneni(a , b))
 
Odpovědět
19.9.2024 15:37
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 8 zpráv z 18.