Double exponent – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Double exponent – Java – Fórum – Programujte.comDouble exponent – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
lekejs0
Newbie
30. 10. 2013   #1
-
0
-

Potřebuji pomoc s jednou metodou... nevím si rady jak to udělat bez použití toho Math.pow(a,b)...

Implementujte funkci double power(double base, int exponent) která pro zadaný základ base a exponent exponent vrátí base ^ exponent. Exponent předpokládejte kladný anebo nulový. Při implementaci funkce nepoužívejte funkci Math.pow(a, b).

Děkuji moc za pomoc...

Nahlásit jako SPAM
IP: 88.102.153.–
ingiraxo+15
Grafoman
31. 10. 2013   #2
-
0
-

#1 lekejs
A co je na tom těžkýho? Důležitý je si uvědomit, jak funguje Math.pow() a co vlastně dělá

když přes pow dáš 3^3 = 3*3*3, když exp bude 5, tak 3*3*3*3*3

už tě teda něco napadá?

Rec. řešení je takto 

int pow(int n, int e)
{
    if (e == 0) return 1;
    return pow(n, e - 1) * n;
}
Nahlásit jako SPAM
IP: 93.90.162.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
sleepy
~ Anonymní uživatel
422 příspěvků
31. 10. 2013   #3
-
0
-

Alebo skorej nieco taketo ze ak mas cislo reprezentovane v bin (exponentu) tak staci vzdy vynasobit cislo samo zo sebou a ak je 1 tak ho potom vynasobit zakladom. Asi takto pow(3.1415297,5) = pow (a,0x101) = 1*a * ( 0 * a^2) + 1*(a^4). Cize ti staci robit take nieco:

public static void pow(double a, int b) {
	double out = 1.;
	for(int i=0; i<32; i++) { // viac ako 32 iteracii nepotrebujes
		if(b%2) {
			out *= a;
		}
		b /=2;
		a *= a;
	}
	return out;
}
Nahlásit jako SPAM
IP: 147.175.177.–
ingiraxo+15
Grafoman
31. 10. 2013   #4
-
0
-

#3 sleepy
cože? tak tohle opravdu nevím jestli bude fungovat :) Zkoušel sis zadat těch tvých pow(3.1415297,5) při počtu iterací 32? Ano, opravdu vyjde nekonečno ;)

jinak nepřijde ti tohle jednodušší?

double pow(double n, int e)
{
    double r = n;
    for (int i = 1; i < e; i++) r *= n;
    return r;
}
Nahlásit jako SPAM
IP: 93.90.162.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
lekejs0
Newbie
31. 10. 2013   #5
-
0
-

#2 ingiraxo
Jo já vím jak je 3^3 ale nevěděl jsem jak to mám udělat..

return pow(n, e - 1) * n;

proč tam odečítáš tu jedničku od toho e??

Nahlásit jako SPAM
IP: 88.102.153.–
KIIV
~ Moderátor
+43
God of flame
31. 10. 2013   #6
-
0
-

ale panove, vsak se ptal na radu jak na to .. nechtel to prece udelat za nej :)

#5 lekejs
tak si tam zkus tu -1 nedat... pak dej vedet jestli ti java schodila i kompa, nebo se jen slozila jak domecek z karet :D

pak si najdi na netu pojem rekurze - tj. volani sama sebe

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
31. 10. 2013   #7
-
0
-

#6 KIIV
to víš, jsou chvilky, kdy se ti to chce udělat a někdy stačí pár vlídných slov :)

krom toho teď naivně očekáváme, že jeho řešení bude úplně jiné

Nahlásit jako SPAM
IP: 93.90.162.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
sleepy
~ Anonymní uživatel
422 příspěvků
31. 10. 2013   #8
-
0
-

#4 ingiraxo
ano myslim to vazne a nie nevyde. Nieje to dobre napisane, ale princip v tom je, troska sa mi tam priplietla python syntax. Na a nepozeraj to je nezauimave, zauimave je iba out. a to vide spravne

Nahlásit jako SPAM
IP: 147.175.177.–
sleepy
~ Anonymní uživatel
422 příspěvků
31. 10. 2013   #9
-
0
-

#4 ingiraxo
Casovo narocnejsie mi to pride, ale aj jednoduchie. No ale ten tvoj algoritmus take zvrholosti ako pow (1. - 1/10^9, 10^9); bude pocitat nejaku tu chvylku. Moj na to potrebuje konstantny cas.

Nahlásit jako SPAM
IP: 147.175.177.–
KIIV
~ Moderátor
+43
God of flame
31. 10. 2013   #10
-
0
-

#9 sleepy
mimochodem s malym vylepsenim to funguje i pro zaporny exponenty

double pow(double x, int n) {
    double out = 1;
    if (n<0) { n *= -1; x = 1/x; }
    while (n>0) {
      if (n & 1) { out *= x; }
      n >>= 1;
      x *= x;
    }
    return out;
}

a realny exponent uz jedine pres   exp(n * ln(x))  (samozrejme to chce najit spravne funkce pro javu)

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sleepy
~ Anonymní uživatel
422 příspěvků
31. 10. 2013   #11
-
0
-

#10 KIIV
nie jedine, ale asi jedny pouzitelny neviem ako dobre konverguje exp. Ale pre cisla blizke 0 to pojde pekne. V podstate staci vyuzit co si napisal ty s tym ze exp(y*ln(x))=exp(m)*exp(z), kde m je cele a z je nieco blizke 0, toto asi pojde odost rychlejsie ako to co chcem uviest. Ale kedysi davno som rozsiril, algoritmus o to co sa deje za desatinou ciarkou. Asi je to nevyhodnejsie, lebo tam treba pociatat vela odmocnin. Ale da sa to. Konkretne tak ze som si povedal ze nech je bin cislo zapisane takto: b_0 * 2^0 + b_1*2^1 + ... + b_n * 2 ^n + b_(-1) * 2^(-1) + ... + b_(-m) * 2^(-m), b je z {0,1}. A kedze vyssie uvedena rovnica sa da napisat: pow(a,n) = a^n = a^bin(n) = a^(b_0 * 2^0 + b_1*2^1 + ... + b_n * 2 ^n) = a^(b_0 * 2^0) * a^(b_1*2^1) * ... * a ^( b_n * 2 ^n), tak som to len doplnil o tu cast za desatinou ciarkou, kde ak sa dosadi zaporne cislo tak dostavas 1/2^k, k je z {0,...,n} co je vyjadrenie 2^k odmocniny. 2^k odmocninu som pocital ako odmocninu z 2^(k-1) odmocniny cize znova to iste ako pri tom umocnovani. A cuduj sa svete fungovalo to a davalo to dobre vysledky. :D

Nahlásit jako SPAM
IP: 147.175.177.–
lekejs0
Newbie
1. 11. 2013   #12
-
0
-

Děkuji vám za rady... nějak jsem to zkompletoval... děkuji..

Nahlásit jako SPAM
IP: 88.102.153.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 16 hostů

Podobná vlákna

Double avatar — založil dalaman

Porovnání double — založil vazbok

Double border in IE — založil meloun

Long double — založil akoze

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý