Autor Beitrag
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.03.06 20:38 
also nochmal für die blondinen unter uns..
Ein negatives a hoch eine dezimalzahl ist nicht realisierbar oder nur zu schwer?
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Mi 08.03.06 20:42 
An Lena89

"ABS" ergibt die absolute Zahl ohne Vorzeichen, d.h. abs(3) = 3 und abs(-3) ist auch 3.

Damit kann man LN auch ein negatives Argument unterjubeln. Den Rest habe ich ja geschrieben.
Das zeigt aber, daß Eure Lehrerin durchaus recht hat, Power nicht zuzulassen. Ihr sollt doch ein bißchen Arithmetik lernen, oder? :wink:
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Mi 08.03.06 20:46 
Hat sich überschnitten. Bei negativem a sind NUR Ganzzahlen zulässig. Wie bei meinem beitrag unter 3).
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Mi 08.03.06 20:47 
Ein negatives a mit ganzem Exponenten ist wie schon mehrfach beschrieben recht einfach Realisierbar...
Beispiel:
(-3)^2=9.... da ist der Exponent gerade...
als erstes Nimmste den Betrag der Basis, und berechnest dann, was 3^2 wäre, das kannste ja schon mit deiner Prozedur, dann checkst du, ob der Exponent gerade ist, wenn gerade, dann ist das Ergebnis positiv.
Haste (-3)^3=-27. Im ersten Schritt dann wieder der Betrag, berechnest dann 3^3=27, das kannte ja auch mit deiner Prozedur, und anschließend chcekst du wieder, ob der Exponent gerade ist, oder ungerade.....Das geht ja mithilfe des MOD Operators, und du siehst: 3 ist ungerade....und schon setzt du vor das Ergebnis von 3^3 n Minus und du bist zu Hause.
Mit Exponenten, die nicht aus Z kommen, also eine Kommazahl darstellen, und <0 sind, ist das ganze nit machbar.
blaueled
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 133

Win XP
D5
BeitragVerfasst: Mi 08.03.06 21:35 
Hallo Lena,

das ist schwieriger, da du bei einem rationalen Exponenten, der nicht Ganzzahlig ist immer eine wurzel ziehen musst

edit: habe mich verschrieben, sollte natürlich rationaler Exponent und nicht gerade heissen

Arne


Zuletzt bearbeitet von blaueled am Do 09.03.06 15:50, insgesamt 2-mal bearbeitet
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Mi 08.03.06 21:51 
Ich werd' verrückt, was lernt man denn heute so in der Schule?

Ein ungerader Exponent hat aber auch gar nichts mit Wurzelziehen zu tun.
z.B. Exponent =3 (ungerade, oder?) --> 2^3 =8 , 2^(-3) =1/8 - wo ist da eine Wurzel?

Ein Exponent von 0,5 entspricht der Quadratwurzel, 0,25 der vierten Wurzel, usw.

So Leute, da muß jetzt reichen - es gibt doch sicher noch Mathebücher.
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 09.03.06 17:50 
Ich habs immer noch nicht geschafft.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
If a < 0 then
   begin
     If Frac(b) <> 0 then
      Edit_c.Text := 'Keine Dezimalzahl eingeben!'
     else
      begin
         b:= f;
         begin
          c:=a;
          for i:=1 to (f-1) do
          begin
           c:=c*a;
           Edit_c.Text := FloatToStr(c);
           end;
           end;
       end;
   end



Hier kommt ne ganz komische Fehlermeldung, könnt ihr mir sagen, warum??

" Im Projekt Projekt2.exe ist eine Exception EOverflow aufgetreten. Meldung 'Gleitkommüberlauf' Prozess wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen."

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Do 09.03.06 19:25 
In welcher Zeile ist das Programm denn mit dieser Fehlermeldung stehengeblieben?
An sich sieht die Routine selbst ja ok aus (Ich denke, daß "f" eine Integervariable ist).

Eine Erklärung könnte sein, daß ja bei der Fehlermeldung die Routine mit den unveränderten Werten für "a" und "b" verlassen wird. Kann es sein, daß irgenwo doch die LN-Funktion (diesmal evtl. mit dem "verbotenen" negativen "a") aufgerufen wird? Mußt sicherstellen, daß das nicht passiert.
Ich kann hier nur raten. :gruebel:
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 09.03.06 19:51 
in der Zeile c:= c*a;
aber ich versteh die Fehlermeldung nicht.. :(


Also die ganze Prozedur sieht so aus:

ausblenden volle Höhe Delphi-Quelltext
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:
procedure TForm1.Bt_ahochbClick(Sender: TObject);
var i : integer;
    f : integer;
begin
a:= StrToFloat(edit_a.Text);
b:= StrToFloat(edit_b.Text);

If a > 0 then
 begin
 c := exp(b* ln(a) );
  Edit_c.Text := FloatToStr(c);
 end;

 If a < 0 then
   begin
     If Frac(b) <> 0 then
      Edit_c.Text := 'Keine Dezimalzahl eingeben!'
     else
      begin
         b:= f;
         begin
          c:=a;
          for i:=1 to f do
          begin
           a:=a*a;
           Edit_c.Text := FloatToStr(c);
           end;
           end;
       end;
   end

end;


a und b hab ich weiter oben als real geschrieben.


Zuletzt bearbeitet von Lena89 am Do 09.03.06 21:53, insgesamt 2-mal bearbeitet
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Do 09.03.06 21:18 
Hallo Lena,

hab mir die Mühe gemacht, Deinen Kram mal zu kompilieren. Dein letztes Listing ergibt schon bei der Kompilation eine Fehlermeldung und stimmt mit dem ersten Codeschnipsel nicht überein. Hab's doch zum Spielen gekriegt. Anbei Dein Listing mit meinen kommentaren (sollst ja auch noch etwas tun):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
If a < 0 then  
   begin  // <---Nicht nötig
     If Frac(b) <> 0 then  
      Edit_c.Text := 'Keine Dezimalzahl eingeben!'  
     else  
      begin // <---nicht nötig 
         b:= f;  //<--- hier liegt der Fehler! in welcher Richtung wird zugewiesen?
                 // Noch was: f ist Integer, b ist Float -->Tip:  Typ umwandeln
         begin  
          c:=a;  
          for i:=1 to (f-1) do  
          begin  
           c:=c*a;  
           Edit_c.Text := FloatToStr(c);  
           end;  
           end;  
       end;  
   end // evtl. die Zahl der "end;" korrigieren


Müsstest Du ja jetzt hinkriegen.

Noch etwas: Es gibt auch noch z.B. "-3 hoch -5", was ja 1/-243 ergibt. Wird mit Deiner Routine noch nicht erschlagen.
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 09.03.06 21:52 
"Tip: Typ umwandeln "

@[quote]aim65 Vielen Dank für die Hilfe erstmal!
Wie wandelt man denn einen Typ um? Jetzt erscheint nämlich wieder die Fehlermeldung, dass Real und Integer inkompatibel sind. :oops:

An negative b hatte ich auch schon gedacht, aber wenn die postiven erstmal funktionieren, dachte ich, wäre das kein problem mehr.
huhn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Do 09.03.06 21:52 
also ich hab jetzt nur den thread überflogen^^
aba soviel ich mitbekommen habe darfst du keine standard funktionen nehmen.
hab da noch was in meiner kiste gefunden:
ausblenden Delphi-Quelltext
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 hochzahl(a,b:real):real;
var z:real;
    negativ:boolean;
begin
  if b=0 then
    begin
      result:=1;
      exit;
    end
  else if a=0 then
    begin
      result:=0;
      exit;
    end;
  z:=1;
  negativ:=false;
  result:=a;
  if b<0 then
    begin
      b:=b*-1;
      negativ:=true;
    end;
  repeat
    z:=z+1;
    result:=result*a;
  until z=b;
  if negativ then result:=1/result;
end;

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Do 09.03.06 22:14 
Lena,

deswegen mein Tip. Ich dachte, daß Du vielleicht die Delphi-Hilfe oder eins von den vielen Tutorials hier im Forum für solche Grundlagen zu Rate ziehst. Würde Dir für zukünftige Projekte sehr helfen.

Also, noch mal Mitleid mit einer armen (oder bequemen??) Seele. Eine von mehreren Möglichkeiten: f := trunc(b).

Übrigens, der Überlauffehler kam von der Tatsache, daß in f ein völlig zufälliger Wert steht, da f ja nie initialisiert (d.h. ein Wert zugewiesen) wurde. Da kann also z.B. so was wie 35465776 drin stehen, das war dann die Zahl der Schleifendurchläufe. Das bringt sogar eine Double-Variable zum Weinen.
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Do 09.03.06 22:46 
Eine EOverflowException ist eine "Überlaufausnahme" und mitunter ein Laufzeitfehler. Das geschieht, wenn ein Ergebnis den darstellbaren Zahlenbereich der Variablen überschreitet. Teilweise wird dabei überhaupt keine Fehlermeldung ausgelöst (ist mir einmal bei einem integer passiert. Der hatte komischerweise nur 16 Bit, konnte also maximal die Zahl 32768 darstellen).
Warum: Wenn ich eine Dezimalziffer habe kann ich zehn Zahlen darstellen, wenn ich zwei hab 10*10=100 usw. (die Null wird mitgezählt). Der Computer rechnet im Dualsystem. Und zwar unter den gängigen Delphi-Versionen mit 32 Bit also 2^32=4294967296 Zahlen können dargestellt werden. Da das erste Bit (binäre Stelle) zur Codierung des Vorzeichens verwendet wird stehen für integer also nur 2^31 Zahlen zur Verfügung also bis 2147483648.
Bei Fließkommazahlen sieht die Codierung noch anders aus siehe IEEE754. Aber bedingt durch diese darstellung kann selbst mit dem größten Fließkommatypen der zur Verfügung steht (extended) nur Zahlen im Bereich von 3.6 x 10^-4951 .. 1.1 x 10^4932 dargestellt werden (steht auch in der Delphi Hilfe). Wenn du also 10^5000 eingibst kann das dieser Typ nicht mehr fassen und er läuft über.
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Fr 10.03.06 10:39 
@Allesquarks
Hab mich vielleicht etwas zu flapsig ausgedrückt mit dem "Weinen" - insofern ist Deine genaue Erklärung für Lena sicher hilfreich. Der Überlauffehler tritt natürlich in "c" auf (c:=c*a) und wird daher dort gemeldet. Verursacht wurde er aber in diesem Fall durch die undefinierte und damit meist riesigen Zahl in der Laufvariablen "f" (Integer) für die "For"-Loop. (Zuweisung "b" und "f" im Programm verdreht).

@Lena
ich würde Eurer Lehrerin mal vorschlagen, die Fehlersuche mit den wirklich guten Debugger-Werkzeugen von Delphi zu üben. Spart u.U. viel Frust und Zeit.
Gruß, Horst
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 10.03.06 10:53 
Ich hatte ja nach Umwandlung gesucht, aber da bin ich nich schlau draus geworden.

Habs jetzt aber hingekriegt, danke nochmal :)


ausblenden volle Höhe Delphi-Quelltext
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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
procedure TForm1.Bt_ahochbClick(Sender: TObject);
var i : integer;
    f : integer;  
begin  
a:= StrToFloat(edit_a.Text);  
b:= StrToFloat(edit_b.Text);  

 
If a > 0 then                      
 begin  
 c := exp(b* ln(a) );
  Edit_c.Text := FloatToStr(c);  
 end;  


If a < 0 then
   If Frac(b) <> 0 then        
    Edit_c.Text := 'Keine Dezimalzahl eingeben!'
   else
Begin                            
      f := trunc(b);              
      c:=a;                       
   If b > 0 then
      begin
        for i:=1 to (f-1) do
          begin
            c:=a*c;
            Edit_c.Text := FloatToStr(c);
          end;
      end
   else
      begin
        f := f* (-1);
        for i:=1 to (f-1) do
          begin
            c:=a*c;
            c:= 1/c;
            Edit_c.Text := FloatToStr(c);
          end;
      end;
end;
If b = 0 then
 Edit_c.Text := '1';
end;
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Fr 10.03.06 11:28 
Meinen Glückwunsch!

Ich gebe zu, daß die Delphi-Hilfe für Anfänger schon schwierig sein kann (ging mir auch so). Aber sieh mal unter "trunc" und "round" nach.

Kannst die Sache noch verschönern:
Ist Dir aufgefallen, daß Du die jeweilige Ergebnisanzeige innerhalb der Schleifen plaziert hast? Bei jedem Durchlauf wird das Zwischenergebnis angezeigt (siehste bloß nicht, da das zu schnell geht). Macht hier nix, aber bei größeren Schleifen kann das zu einer unnötigen Verlangsamung führen. Hier kannst Du dann auch einige "begin-end" Zeilen sparen, da die eigentliche Anweisung in der Schleife in nur einer Zeile steht.

Es gibt noch einen Sonderfall, nämlich a=0.

Viel Spaß beim Üben.

EDIT: sehe gerade, daß Du "f:=f*(-1)" genommen hast, um f positiv zu machen. Kann bei anderen Routinen ganz gefährlich sein, da bei jedem Aufruf das Vorzeichen wieder umgeklappt wird. Wie wär's mit "abs"?
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Fr 10.03.06 12:18 
jetzt ist es mir erst wieder bewusst geworden, stimmt ungerade exponenten sind ja wurzel !

vielleicht hilft dir da meine bruch unit weiter, bruch runterkürzen, erst mit dem zähler exponieren dann die nennerste wurzel ziehen, fertig :P

eine float to bruch umwandlung ist auch dabei ;)
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Fr 10.03.06 12:35 
@F34r0fTh3D4rk
Da bist Du mit dem ersten Teil auf dem Holzweg (siehe mein Beitrag hier vom 8.3. 21:51).
Wurzeln gibt's nur bei Absolutwerten <1 von Exponent, d.h., im Bereich: -1 < Exp < 1. Im Klartext: a^0.5 ist Wurzel(a), a^(-0.5) ist 1/Wurzel(a). :wink:
Deswegen ist z.B. (-1)^(0.5) im reellen Bereich nicht zulässig, sondern ergibt die sogenannte Imaginärzahl "i".
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Fr 10.03.06 12:40 
ich hab mich bis jetzt noch net damit außeinander setzen müssen ;)