Mám problém... Nevím, jak udělat n-tou mocninu a odmocninu. Poraďte prosím...
Fórum › Pascal
N-tá mocnina a odmocnina
To XyZZyX :
no mocninu uděláš jednoduše cyklem kde každou hodnotu v každém průběhu cyklem vynásobíš. Pascal neumim tak alesppoň trochu teorie.
čili něco jako
for(int i = 1; i < mocnina; i++)
hodnota *= hodnota;
a odmocnina je
n-tá odmocnina z a je a^(1/n)
BTW: Pascal na to má určitě funkci alespoň na tu mocninu... něco jako POW(číslo, exponent)
http://www.geocities.com/SiliconValley/Network/4328/math.htm http://www.geocities.com/SiliconValley/Network/4328/math.htm
To XyZZyX : to v pascalu nepoužiješ. domnívám se že ani jinde (mimo Excel :) ) značí to, že je to
a na (1/n)
čili budeš asi muset použít nějakou funkci
v tom odkaze co jsem ti poslal je funkce Power
Function Power(number,top:integer) : real;
begin
Power := Exp(number*Ln(1/top));
end;
asi takto by to podle mě mělo vypadat...
určitě na to najdeš jinou funkci ale tahle se asi taky dá použít
mám takový pocit, že na to umocňování je v jednotce math funkce
power(zaklad, exponent);
takže na začátek programu stačí přidat jen
uses math;
a funkce power by měla jít vesele používat
To XyZZyX : existuje v pascalu něco jako přetypování???
v C++ to udělám takto:
pow(27, 1.0/3.0); nebo pow(27, (float)1/(float)3) //vrati 3
pokud pouziju
pow(27, 1/3); //vrati asi 2.2 coz je spatne
To crAzY^ : Přetypování v Pascalu existuje a píše se takhle: real(hodnota).
Řešení je celkem jednoduché - použít reálné vstupní parametry:
Function Power(number,top:real):real;
Begin
Power:=Exp(number*Ln(top));
End;
Protože se ale nedá logaritmovat záporné číslo, nemohli bychom takhle umocňovat na záporné exponenty. Také při nulovém exponentu by to skončilo chybou (logaritmus nuly je mínus nekonečno), ale my víme, že cokoli na nultou je 1. Takže to chce trochu si pohrát s podmínkami a nakonec může vyjít třeba tohle (počítá to a na n-tou):
function pow(a,n:real):real;
var i:longint;
vysledek:real;
Begin
if a=0 then pow:=0 {nula na cokoli je porad nula (dejme tomu, ze i neurcity vyraz nula na nultou)}
else if n=0 then pow:=1 {cokoli na nultou je 1}
else if frac(n)=0 then begin {obecna mocnina, ale s celym exponentem}
vysledek:=1;
for i:=1 to abs(trunc(n)) do vysledek:=vysledek*a;
if n<0 then vysledek:=1/vysledek; {protoze a^(-n) = 1/(a^n)}
pow:=vysledek;
end
else {uplne obecna mocnina s realnym exponentem}
if a<0 then pow:=0 {radsi vysledek 0 nez Invalid floating point operation pri zapornem zakladu logaritmu}
else pow:=exp(n*(ln(a))); {protoze ln(a^n)=n*ln(a) a exp(ln(x))=x}
End;
(zdroj: http://mircosoft.ic.cz/download/MATYKA.PAS)
Moje stránka.
To Honzc : on myslel kdyz je lichy cely exponent tak je vysledek teto mocniny zaporny.. mozna i odmocniny...
pokud je exponent sudej (resp to odmocneni) tak zaporne cislo odmocnit nejde.. a co je mezi tema exponentama nevim :D sem do podrobnosti nesledoval
Tohle: a^(-n) = 1/(a^n) platí obecně pro jakékoli hodnoty a a n.
Tohle: ntá odmocnina z a = a^(1/n) taky.
Tohle: (-a)^n = -(a^n) platí jenom pro celé liché n.
Tohle: (-a)^n = a^n platí jenom pro celé sudé n.
Pro umocňování záporného a na ne-celé n žádný algoritmus neexistuje, nebo o něm alespoň nevím (neumí to Excel ani žádné kalkulačky).
Moje stránka.
@Mircosoft: Díky, tu poslední větu jsem potřeboval slyšel, i když to není 100% pravda, některé kalkulačky (třeba PowerToy Calc, ale určitě i další) to umí, akorát v C.
@Honzc: Proč jen pro přirozená čísla? Platí to snad i pro záporná čísla ne? Akorát pro tu nulu ne... Protože jak napsal Mircosoft, tak
a^(-n) = 1/(a^n) platí obecně pro jakékoli hodnoty a a n.
Prostě jsem chtěl říct, že liché odmocniny (a převrácená čísla k lichým odmocninám - viz. citace) je možné spočítat i ze záporných čísel - je to číslo opačné k příslušné mocnině z opačného čísla, tedy pow:=-exp(n*(ln(-a))); A proto by šel kód ještě rozšířit, konkrétně v bodě:
if a<0 then pow:=0 {radsi vysledek 0 nez Invalid floating point operation pri zapornem zakladu logaritmu}
Funkce by tak mohla spočítat např. (-27)^(1/3), to se rovná -(27)^(1/3), což je -3.To tom*p
Ještě jednou:
Ty jsi napsal
"Pokud se nemýlím, tak je možné spočítat hodnotu pokud je n = 1/(celé liché číslo), potom lze dostat hodnotu jako -pow(-a, n)."
a já jsem odpovídal na toto: n = 1/(celé liché číslo), pak to tvoje "celé liché číslo", opravdu musí být přirozené liché číslo. (0 to být nemůže, jednak dělení nulou a za druhé 0 není celé liché číslo)
Pozn.: "(-27)^(1/3), to se rovná -(27)^(1/3), což je -9." - je špatně. Správně -3.
To tom*p
Protože v matematice je odmocnina definována pouze pro přirozená čísla, tzn., číslo ve jmenovateli musí být větší než 0.
Ten tvůj případ se ale dá v programování celkem jednoduše obejít tak, že to mínus se přiřadí té jedničce.
Tedy 1/(-5) se napíše jako (-1)/5.
Máme-li např. (-5)^(1/(-5)), což v matematice nejde musíme to napsat jako 1/(-5)^(1/5)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Mocnina a třetí mocnina — založil Ondra
Druhá mocnina — založil off01
N-tá odmocnina z x — založil Ondra
Moderátoři diskuze