Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Potenzieren


oktober22 - So 12.06.05 19:08
Titel: Potenzieren
So ich habe nun den Crashkurs gemacht und ich muss sgn er hat mir schon geholfen doch 1 frage hab ich schon:
ich will einen button so programmieren das beim drücken eine zahl potenziert wird
was hab ich da flasch gemacht?


also ausschnitt aus meinem quellcode:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var x, y, z: Real;
begin
 x := StrtoFloat(edit1.text);
 y := StrToFloat(edit2.text);
 z := x^y;  //hier schreibt delphi immer, das es einen Zeigertyp erwartet ?
 label1.caption := FloatToStr(z);
end;


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.


delfiphan - So 12.06.05 19:09

Potenzieren geht über Power(basis, exponent). Und du musst die unit Math via uses einbinden.


Christian S. - So 12.06.05 19:10

Hallo!

Potenzieren in Delphi funktioniert nicht mit ^, sondern über die Funktion power. Einfach mal in der Delphi-Hilfe gucken, da steht drin, wie man die benutzt. :-)

Grüße
Christian

//edit: Zu langsam :motz:


Delete - Sa 18.02.06 14:44

Hallo, bin neu hier und stecke gerade noch in den Anfängen des Programmierens mit Delphi :)

Hab mal ne Frage zum Potenzieren:
Die Aufgabe ist es ein Programm zum Potenzieren zu schreiben, bei welchem folgende Standardfunktion als Vorlage gilt:

Exp(a * Ln(b))

Ich habe mir folgendes überlegt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Function Potenz(Basis, Exponent: Extended): Extended;
begin
    if Exponent = 0.0 then Result := 1.0
      else if (Basis = 0.0and (Exponent > 0.0then
    Result := 0.0
  else if Exponent = 2 then
    Result := Sqr(Basis)
  else Result := Exp(Ln(Basis) * Exponent );

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  eBasis, eExponent, eResult: Extended;
begin
  eBasis := strtofloat(edit1.text);
  eExponent := strtofloat(edit2.text);
  eResult := Potenz(eBasis, eExponent);
  edit3.Text := floattostr(eResult);
end;

end.


Jedoch besteht nun das Problem, dass ich bei "negativer Basis" und "ungeradem Exponenten" eine Fehlermeldung bekomme.
Habe mir schon überlegt dies eine zusätzliche if-then-Anweisung auszugleichen, indem man bspw.
if (Basis < 0.0) and (Exponent mod 2 = 1) then [...]
jedoch lässt sich das anscheinend mit "Extended" nicht vereinbaren.

Kann mir vllt jemand weiterhelfen? (Bitte nicht mit dem Power-Befehl... - da die Aufgabe auch nach Aufgabenstellung gelöst werden soll)

Gruß, Tino


AXMD - Sa 18.02.06 15:52

user profile iconTino the Rino hat folgendes geschrieben:
Habe mir schon überlegt dies eine zusätzliche if-then-Anweisung auszugleichen, indem man bspw. if (Basis < 0.0) and (Exponent mod 2 = 1) then [...]
jedoch lässt sich das anscheinend mit "Extended" nicht vereinbaren.


Modulo funktioniert auch nicht mit Gleitkommazahlen.

AXMD


Jetstream - Sa 18.02.06 16:40

negative zahl hoch gebrochener exponent -> imaginäre zahl.
das geht nicht.

negative zahl hoch ungerader exponent -> negative zahl.
müsste funktionieren.


Delete - Sa 18.02.06 19:04

Zitat:
Modulo funktioniert auch nicht mit Gleitkommazahlen.


Ja, das ist mir beim Anzeigen der Fehlermeldung auch schon bewusst geworden.

Aber wie kann ich denn jetzt nun eine if-then-Anweisung vereinbaren, das das Programm auch Lösungen ermittelt, wenn ich "negative Zahlen" und "ungeraden Exponenten" hab?
Also, das halt wie schon gesagt ne negative Zahl rauskommt?


AXMD - Sa 18.02.06 19:10

Es geht nicht um ungerade, sondern um gebrochene Exponenten :roll: . (-2)^3 = -8

AXMD


Delete - Sa 18.02.06 19:39

user profile iconAXMD hat folgendes geschrieben:
Es geht nicht um ungerade, sondern um gebrochene Exponenten :roll: . (-2)^3 = -8


Ja, schön, dass du so ein Genie bist, aber das Programm rechnet aber die "-8" trotzdem nicht aus - und das "(-2)^3 = -8" ist, weiß ich auch noch...

Ich will einfach nur wissen wie ich dem PC sagen kann, dass er bei "negativer Basis" und "ungeraden Exponenten" das Absolutglied der Basis bildet also "abs(Basis)" und dann ganz normal weiterrechnet.
--> Ich brauche nur den Befehl, da es mit MOD nicht geht...

Denn dann multipliziert man das Ergebnis einfach mit "-1" und schon wäre das Problem gelöst! Also ich bin net unbedingt der Dümmste in Mathematik und brauche hier derweil keine klugen Ratschläge.

Mir wäre weißgott mehr geholfen, wenn ihr mal auf meine Frage eingehen würdet!

Gruß, Tino


Born-to-Frag - Sa 18.02.06 19:47


Delphi-Quelltext
1:
if Round(deineZahl) <> deineZahl then //machwas                    


alzaimar - Sa 18.02.06 20:10

user profile iconTino the Rino hat folgendes geschrieben:

Ja, schön, dass du so ein Genie bist, aber das Programm rechnet aber die "-8" trotzdem nicht aus - und das "(-2)^3 = -8" ist, weiß ich auch noch...
......Also ich bin net unbedingt der Dümmste in Mathematik und brauche hier derweil keine klugen Ratschläge
...
Mir wäre weißgott mehr geholfen, wenn ihr mal auf meine Frage eingehen würdet!

Bischen unverschämt, wenn du mich fragst. Und Deine Mathenkentnisse sind aber wirklich ziemlich rudimentär, wenn Du rationale Exponenten über eine Moduloopration klassifizieren willst. Insofern ist die Nachhilfe schon verständlich.


Versuch es mal mit Höflichkeit, das könnte im späteren Leben noch was bringen. Hier kommst Du jedenfalls so nicht weiter.

user profile iconBorn-to-Frag hat folgendes geschrieben:

Delphi-Quelltext
1:
if Round(deineZahl) <> deineZahl then //machwas                    

Und das klappt auch nicht weil ... [ausgeblendet wegen Impertinenz des Fragestellers]...


Gausi - Sa 18.02.06 20:16

user profile iconalzaimar hat folgendes geschrieben:
user profile iconBorn-to-Frag hat folgendes geschrieben:

Delphi-Quelltext
1:
if Round(deineZahl) <> deineZahl then //machwas                    

Und das klappt auch nicht weil ... [ausgeblendet wegen Impertinenz des Fragestellers]...
Doch, das sollte schon klappen, wenn man den Extended-Wert direkt durch umkonvertieren eines Strings erhält und man auf Ganzzahligkeit prüfen möchte. Ansonsten gilt natürlich durchaus manchmal 2 + 0.1 - 0.1 <> 2. Oder meintest du was anderes?

Den gerundeten Wert kann man dann mit Mod bearbeiten.


alzaimar - Sa 18.02.06 20:21

user profile iconGausi hat folgendes geschrieben:
.... Oder meintest du was anderes?..

Bei Vergleichen von Extended-Werten auf Gleichheit habe ich einen Pavlov-Reflex bezüglich 'klappt nicht'. Aber Du hast Recht.


Delete - Sa 18.02.06 21:46

Tut mir leid, ich war ein wenig gereizt.
Habs mitlerweile selbst hinbekommen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Function Potenz(Basis, Exponent: Extended): Extended;
var
helper: integer;
begin
          Result := Exponent / 2;
          helper := Trunc(Result);
          if Exponent = 0.0 then Result := 1.0
          else  if (Basis = 0.0and (Exponent > 0.0then
             Result := 0.0
          else  if Exponent = 2 then
             Result := Sqr(Basis)
          else  if (Basis < 0.0and ((helper mod 2) <> 0then
             Result := (Exp(ln(abs(Basis)) * Exponent)) * -1
          else     Result := Exp(Ln(Basis) * Exponent );

end;


Danke trotzdem!

Gruß, Tino