[delphi] Machtsverheffen

Pagina: 1
Acties:
  • 475 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een knop met een machtsverheffen functie erachter. Dit is de functie die ik heb gebruikt :
result := exp(y * ln(x))

Nu heeft deze functie ernsige nadelen. Het probleem met de 0 base is zeer eenvoudig weg te programmmeren. Maar met negatieve getallen wordt het iets lastiger. Ik wil dit als volgt aanpakken. De x maak ik altijd absoluut (abs(x)).

Maar nu wil ik na de berekening alles negatief maken hoe doe ik dat(alle waarden van x < 0)? Daarna maak ik het antwoord van alle even, hele negatieve getallen van x het antwoord weer positief ( omdat dit me het eenvoudigst lijkt).
Dus als x =-2 wordt absoluut antwoord = 4 dan wordt negatief gemaakt = -4 dan moet dit weer positief worden. En dit voor de totale range van -2 tot -3.4E4932.
De x en y variabelen zijn natuurlijk extended.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:38
Uhm, uw post is nogal redelijk 'warrig' zal ik maar zeggen. Ik moet eerlijk toegeven dat ik na een regel of 3 het opgegeven heb om hem verder te lezen.

Kun je uw vraag/probleem eens herformuleren (duidelijk liefst)?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmm, puntsgewijs dan maar: (bovenste = de eerste stap die uitgevoerd wordt)

- omzetten van een positief naar een negatief getal voor de uitkomst van de waarden bij (x < 0)

- even gehele negatieve getallen weer positief maken (dus voor x=-2 x=-4 tot x=-3,4E4932)
Dus even duidelijk: zijn de antwoorden van het bovenstaande x'en moeten dus weer positief worden.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:38
Uhm, waarom maak je geen gebruik van de Power() functie voor machtsverheffingen?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zoiets? :? maar wat moet dan bij result staan?

function Power(const Base, Exponent: Extended): Extended;

begin
result := ???
end;

begin
try
dosomething
except
dosomethingrealydifferent
end;
end;

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:38
code:
1
Result := Power(x, y);

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zie dit trouwens net in de helpfile van delphi staan:

Description

Power raises Base to any power. For fractional exponents or exponents greater than MaxInt, Base must be greater than 0.

Heb ik er nog niks aan...

Dus moet ik het toch bij mijn eerste vragen houden :(

Acties:
  • 0 Henk 'm!

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 16:29

Hu9o

Schokkend

Op dinsdag 21 mei 2002 12:46 schreef o_o het volgende:
Dus als x =-2 wordt absoluut antwoord = 4 dan wordt negatief gemaakt = -4 dan moet dit weer positief worden.
Abs(-2) = 2 hoe kom je nou bij 4 :?

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Inderdaad vergeet de y er bij te vermelden -> die is twee

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:38
is verheffen met een negatieve exponent niet hetzelfde als:

1/(x^y)
?

Dus, als je een negatieve exponent hebt:
code:
1
2
3
4
5
6
if exp < 0 then begin
  Result := 1 / (Power(base, exp));
end
else begin
  Result := Power(base, exp);
end;

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het niet over een negatieve exponent maar over de base. Een negatieve exponent pakt hij bij de eerst formule exp(y*ln(x)) ook al...

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:38
Als de exponent even is, dan is de macht ook altijd positief.

Dus eigenlijk mag je altijd de absolute waarde nemen van het grondtal, en als je dan de macht gevonden hebt, kan je gaan bepalen of de macht nu negatief of positief moet zijn. (Als grondtal < 0 en exponent is oneven -> macht is negatief).

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat begrijp ik. Dus ik neem nu de formule

result := exp(y*ln(abs(x)));

-> alles positief!!

-> (X < 0) -> alle results negatief -> hoe doe ik dit??

-> (x=-2) (x=-4) tot (x=-3.4E4932) hoe doe ik dit???

-> maak result van bovengenoemde x'en weer positief!! hoe doe ik dit??

Heb ik dit ingevoerd in code kan ik machtsverheffen!!
behalve bij x=0 en y=0 maar dan kan ik try excepten

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:38
code:
1
2
3
if (base < 0) and (exp mod 2 <> 0) then begin
  Macht := Macht * -1;
end;

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • jhksema
  • Registratie: Januari 2002
  • Laatst online: 25-03-2023
Op dinsdag 21 mei 2002 13:44 schreef o_o het volgende:
Dat begrijp ik. Dus ik neem nu de formule

result := exp(y*ln(abs(x)));

-> alles positief!!

-> (X < 0) -> alle results negatief -> hoe doe ik dit??

-> (x=-2) (x=-4) tot (x=-3.4E4932) hoe doe ik dit???

-> maak result van bovengenoemde x'en weer positief!! hoe doe ik dit??

Heb ik dit ingevoerd in code kan ik machtsverheffen!!
behalve bij x=0 en y=0 maar dan kan ik try excepten
Ehh... je rekent x^y uit, toch? Dus voor x < 0 is het resultaat alleen negatief als y oneven?

Dus toets ff odd(y)...

Oja, je neemt toch geen fractionele exponent, he? Herinner lagere school wiskunde:
x^(1/2) = sqrt(x), wat niet is gedefinieerd voor reële x < 0!

Acties:
  • 0 Henk 'm!

Verwijderd

Op dinsdag 21 mei 2002 13:44 schreef o_o het volgende:
Dat begrijp ik. Dus ik neem nu de formule

result := exp(y*ln(abs(x)));

-> alles positief!!

-> (X < 0) -> alle results negatief -> hoe doe ik dit??

-> (x=-2) (x=-4) tot (x=-3.4E4932) hoe doe ik dit???

-> maak result van bovengenoemde x'en weer positief!! hoe doe ik dit??

Heb ik dit ingevoerd in code kan ik machtsverheffen!!
behalve bij x=0 en y=0 maar dan kan ik try excepten
code:
1
2
3
4
5
6
7
8
function Macht(const Base, Exponent: Extended): Extended;
begin
  if Exponent<0 then
    Result:=-(1/(Exp(abs(Exponent)*ln(abs(Base)))))
  else
    Result:=(Exp(Exponent*ln(abs(Base))));
  if Base<0 then Result:=-Result;
end;

Dit de bedoeling?

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 17:08

Dido

heforshe

Op dinsdag 21 mei 2002 13:17 schreef o_o het volgende:
Ik zie dit trouwens net in de helpfile van delphi staan:

Description

Power raises Base to any power. For fractional exponents or exponents greater than MaxInt, Base must be greater than 0.

Heb ik er nog niks aan...

Dus moet ik het toch bij mijn eerste vragen houden :(
Sorry als ik echt niet kan lezen, maar waarom heb je hier dan niets aan?

Er staat dat je in geval van x^y bij een heeeele grote y een positieve x moet hebben, en bij y fractioneel.
Dat laatste lijkt me niet zo gek, want hoe wou jij reeel -1^.5 berekenen?

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

Verwijderd

Hoe maak ik een getal negatief:
code:
1
i = -abs(i);

Maar daar zal delphi ook wel een negatiefunctie voor hebben neem ik aan.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ahh negatief maken is simpel |:) thanks
---------------------------------------------
Ehh... je rekent x^y uit, toch? Dus voor x < 0 is het resultaat alleen negatief als y oneven?
Dus toets ff odd(y)...

Oja, je neemt toch geen fractionele exponent, he? Herinner lagere school wiskunde:
x^(1/2) = sqrt(x), wat niet is gedefinieerd voor reële x < 0!

--------------------------------------------------
y mag natuurlijk elke waarde hebben!! anders kan je het zowat uit je hoofd.

dus is het makkelijker om alles negatief te maken en daarna de results van de even y-en weer positief te maken (ook weer * -1 :) )

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bij een negatieve even base met een even exponent moet nu weer een positief getal uitkomen
dus:

base=-2 bij exponent 2 moet 4 uitkomen


dus als ik in de volgende functie dit invoer

result := exp(2*ln(abs(-2)));

= dit 4 dat klopt, maar ik maak alle uitkomsten van (base<0)
weer negatief. dus -> -4

nu moet bij alle even exponenten de waarde weer positief worden gemaakt dus (exponent=-3,4E4931) tot (exponent=-2) en (exponent=3,4E4931) tot (exponent=2)

hoe kan ik dit doen?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:38
code:
1
2
3
if (exp mod 2) <> 0 then begin
  Macht := Macht * -1;
end;

Dit maakt de macht van de verheffingen met oneven exponent negatief.

No flame intented, maar je moet toch echt eens leren om uw vraag/probleem duidelijk te verwoorden.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Op dinsdag 21 mei 2002 14:31 schreef whoami het volgende:
code:
1
2
3
if (exp mod 2) <> 0 then begin
  Macht := Macht * -1;
end;

Dit maakt de macht van de verheffingen met oneven exponent negatief.

No flame intented, maar je moet toch echt eens leren om uw vraag/probleem duidelijk te verwoorden.
Ik geef hier gewoon de code die ik gebruik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function macht (x, y : extended) : extended;    {bereik van de functie aangeven}

begin
  result := exp(y*ln(abs(x)));     
end;

begin
  try    
    x := strtofloat(edit1.Text);   
    y := strtofloat(edit2.Text);
    if (y mod -2) <> 0 then     {deze lijn}
  begin
    Macht := Macht * -1;
    label4.Caption := floattostr(macht(x,y));
  end else if (x = 0) and (y = 0) then 
  begin        
    form6.ShowModal;   
  end else if (x = 0) and (y <> 0) then 
  begin   
    label4.Caption := ('0');
  end else 
  begin
    label4.Caption := floattostr(macht(x,y));    
  end;
  except   
    on e : eoverflow do begin   
    form2.ShowModal;
    end;
    on e : econverterror do begin
    form2.showmodal;
    end;
  end;
end;

alleen nu geeft de compiler aan:

operator not applicable to operand this type
wat is hier fout dan?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:38
'k zou het niet weten. Moest je nu eens de lijn aangeven waar de compiler over klaagt...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06 10:52
Volgens mij weet je zelf eigenlijk niet echt waar je mee bezig bent. De machtsverheffings functie wordt doorgaans alleen gedefineerd voor een positieve base, omdat machtverheffen met een negatieve base een complexe functie is. In dat geval gelden allerlei rekenregels die je gewend bent uit de reeele wereld ineens niet meer. Je probeert een observatie die je hebt gedaan over negatieve base met een gehele exponent te extrapoleren naar elke mogelijke exponent, maar dat kan dus niet. Met een negatieve base krijg je alleen bij een gehele exponent een resultaat waarvan de imaginaire component 0 is, in alle andere gevallen kun je geen reeel resultaat geven. Bespaar jezelf gewoon de moeite en gebruik de Power functie van Delphi.

He who knows only his own side of the case knows little of that.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Een negatieve base met een even exponent wordt positief.
Alle andere gevallen met een negatieve base blijven negatief
of zie ik dat verkeerd? Dit moet je toch gewoon met programmeren kunnen omzeilen? zonder te hoeven overstappen op c++?

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 17:08

Dido

heforshe

y mod -2 ?? Als iets deelbaar is door 2 is het dat ook door -2, ik denk alleen niet dat die altijd geaccepteerd wordt! Haal dat minnetje eens weg :)

En wat is er nou precies mis met de Power functie?

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06 10:52
Het heeft niks met programmeren of je programmeertaal te maken. De uitkomst van een negatieve base met een fractionele exponent kun je gewoon niet in één getal uitdrukken, tenminste niet op de manier waarop jij denkt dat het kan. Probeer het maar eens, wat is (-2)0.5?

He who knows only his own side of the case knows little of that.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee, daar heb je gelijk in maar alle uizonderingen kan je ook apart wegprogrammeren. (gouden tijden voor de debuggers)
En in dit geval gaat het me nu hoofdzakelijk om de negative base met een even exponent.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:38
Op dinsdag 21 mei 2002 15:02 schreef o_o het volgende:
Een negatieve base met een even exponent wordt positief.
Alle andere gevallen met een negatieve base blijven negatief
of zie ik dat verkeerd? Dit moet je toch gewoon met programmeren kunnen omzeilen? zonder te hoeven overstappen op c++?
Inderdaad, en ik denk dat je hier al genoeg tips/duwtjes in de goede richting gehad hebt om het op te lossen.

Trouwens, waarom zou je moeten overstappen naar C++? Denk je echt dat je in C++ meer zo'n dingen kunt oplossen dan in Delphi?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06 10:52
Op dinsdag 21 mei 2002 15:24 schreef o_o het volgende:
Nee, daar heb je gelijk in maar alle uizonderingen kan je ook apart wegprogrammeren. (gouden tijden voor de debuggers)
En in dit geval gaat het me nu hoofdzakelijk om de negative base met een even exponent.
Als je bedoelt: even en dus geheel kan het, al zie ik het nut van een negatieve exponent base niet zo erg in...

He who knows only his own side of the case knows little of that.


Acties:
  • 0 Henk 'm!

  • leonardo1504
  • Registratie: April 2001
  • Niet online
Yo o_o, jouw probleem zit hem niet in Delphi, maar in het feit dat je niet echt goed hebt nagedacht over je probleem en de oplossing (in die volgorde). Bedenk eerst eens wat je wil, ik neem aan een functie maken die de argumenten x en y meekrijgt en de waarde van x-tot-de-macht-y retourneert. Stap twee is het bedenken van een algoritme om dat te doen. Daarna is het tijd om je over de implementatiedetails zorgen te maken (bijv.: welke taal ga ik gebruiken)

Suc6!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function macht (x, y : extended) : extended;    {bereik van de functie aangeven}
begin
  result := exp(y*ln(abs(x)));     
end;

begin
  try    
    x := strtofloat(edit1.Text);   
    y := strtofloat(edit2.Text);
  if (x = 0) and (y = 0) then 
  begin        
    form6.ShowModal;  
  end else if (x = 0) and (y <> 0) then 
  begin   
    label4.Caption := ('0');
  end else 
  begin
    label4.Caption := floattostr(macht(x,y));    
  end;
  except   
    on e : eoverflow do begin   
    form2.ShowModal;
    end;
    on e : econverterror do begin
    form2.showmodal;
    end;
  end;
end;

als ik dit stukje code invoeg:

end else if (x < 0) and ((y <> -4) or (y <> -2) or (y <> 2) or (y <> 4)) then begin
z: macht(x,y) * -1;
label4.caption:= floattostr(z);

Nu heb ik wat ik wil (voor -4 tot 4)! Maar ik wil dat dit tot +/- 3.4E4931 doorgaat.
Dit is het enige wat ik wil weten :'(

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 16:58

Creepy

Tactical Espionage Splatterer

Op dinsdag 21 mei 2002 16:21 schreef o_o het volgende:
...
als ik dit stukje code invoeg:

end else if (x < 0) and ((y <> -4) or (y <> -2) or (y <> 2) or (y <> 4)) then begin
z: macht(x,y) * -1;
label4.caption:= floattostr(z);

Nu heb ik wat ik wil (voor -4 tot 4)! Maar ik wil dat dit tot +/- 3.4E4931 doorgaat.
Dit is het enige wat ik wil weten :'(
whoami heeft al 2 keer een oplossing aangeven dat een bij een oneven negative macht het antwoord negatief maakt, en bij een even nagative macht het antwoord positief.

Hierbij nog een keer het stukje code van whoami:
code:
1
2
3
if (exp mod 2) <> 0 then begin
  Macht := Macht * -1;
end;

Ik neem aan dat je dit in je eigen functie kan inbouwen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OK ok. Ik zal het eens proberen te verfijnen want als ik dit invoer werkt het niet...

In ieder geval iedereen bedankt voor het beantwoorden van mijn vragen :)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Mij is eigenlijk nog steeds niet duidelijk wat je wil.
Dat kan eraan liggen dat ik niet letterlijk alles gelezen heb, maar het lijkt me toch wel erg raadzaam de boel eens goed uit te leggen.

Je praat in termen van oplossingen in plaats van problemen, dat is al een onderdeel van het probleem...
Als jij zegt "ik probeer dit-en-dit te bereiken met delphi" wordt het allicht al een stuk duidelijker.

Dus niet gelijk aankomen met de oplossing die jij hebt, maar eerst je probleem.
Dan pas de oplossing die jij al had bedacht.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmm, vooruit probeer het nog één keer:

Ik probeer te bereiken dat ik een negatieve base kan uit te rekenen. That's all.

probleem:

- met de formule die ik gebruik is alleen een base >= 0 te berekenen

doel:

- bij een even en geheel getal van de exponent in een extended omgeving een positief resultaat eruit te krijgen.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:38
Je wilt dus eigenlijk een getal (dat eventueel negatief kan zijn) tot een macht verheffen?

In dat geval is de oplossing hier toch al enkele keren gegeven.
Indien je dit niet bedoelt, dan begrijp ik uw probleem nog steeds niet. :)

https://fgheysels.github.io/

Pagina: 1