Veľkonočná akcia je tu a s ňou aj extra kredity ZADARMO na náš interaktívny e-learning. Dobij si teraz kredity a posuň sa vo svojej kariére vpred!
Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – Výpočet ľubovoľnej mocniny

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Tomáš
Nevyplnené
Avatar
Odpovedá 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..

 
Odpovedať
14.1.2014 22:08
Avatar
coells
Tvůrce
Avatar
Odpovedá 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;
}
 
Odpovedať
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;
}
 
Odpovedať
17.8.2015 15:53
Avatar
David Hynek
Tvůrce
Avatar
Odpovedá 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...

Odpovedať
17.8.2015 18:33
Čím víc vím, tím víc věcí nevím.
Avatar
 
Odpovedať
17.8.2015 18:56
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovedá 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.

 
Odpovedať
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

 
Odpovedať
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))
 
Odpovedať
19.9.2024 15:37
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 8 správy z 18.