Entwickler-Ecke

Sonstiges (Delphi) - Basis und Potenz


NoEon - So 13.04.03 12:50
Titel: Basis und Potenz
Hallo ich stehe gerade von einem Problem. Ich weiss nicht wie ich in meiner Formel die "Hochzahl" angeben muss. --->Potenz?<---
Mist ich kenn gerade nicht mal den Mathematisch korrekten Ausdruck dafür.

Also es geht um ZinsesZinsrechnung.
ich weiss das man das theoretisch auch mit der for do schleife machen kann, aber.. da hab ich im Unterricht "gepennt"

Es gibt aber auch eine Formel dafür, die hab ich mir gebastelt!

Wer kann mal helfen?!


Danke schön

NoEon


Husar - So 13.04.03 13:21

Willst du einfach nur potenzieren oder willst du ein funktion zur zinsberechnung, das sind nämlich 2 paar Schuhe und das 2. hat nichts mit Potenzen zu tun?


NoEon - So 13.04.03 13:24

beide Wege würden mir weiterhelfen!! --->weil ich beide nicht kenne!

Potenzieren wäre aber der wichtigste!!


BungeeBug - So 13.04.03 13:24

Hi,
naja nicht wirklich da das eine das andere mit sich bringt ... also wenn ich das richtg verstanden hab kannst du das einfach so schreiben <Basis>^<Potenz> und dann geht das schon :P

MfG BungeeBug

?dit
Scheint doch nicht zu gehn ....
dann bin ich auch mal gespannt ...


NoEon - So 13.04.03 13:29

na wenn das so ist!... let's go

zufällig ne Ahnzng wo ich den MS Help Workshop herbekomme??


Husar - So 13.04.03 13:29

Potenzieren =


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
program potenzieren; 
uses crt; 
var x,potenziertes_x,n:integer; 
begin 
     clrscr; 
     write('Geben Sie die Basis ein: '); 
     readln(x); 
     potenziertes_x:=x; 
     write('Geben Sie den Exponenten ein: '); 
     readln(n); 
     while n>1 do 
     begin 
          potenziertes_x:=potenziertes_x*x; 
          n:=n-1; 
     end; 
     write(radiziertes_x); 
     readln; 
end.


Christian S. - So 13.04.03 13:53

Ich würde die Funktion "power" empfehlen.

Oder, wenn Du das nicht willst, für ganzzahlige Exponenten diese Funktion (ist um einiges schneller als eine simple Schleife):

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function potenz (basis : Extended; exponent : Integer) : Extended;
VAR ergebnis : Extended;
begin
  if exponent = 0 then result:=1
  else begin
    if exponent = 1 then result:=basis else
    begin
      if exponent mod 2 = 0 then
      begin
        ergebnis:=potenz(basis, exponent div 2);
        result:=ergebnis*ergebnis;
      end else result:=potenz(basis, exponent-1)*basis;
    end;
  end;
end;


Oder für x > 0 geht auch, wenn Du x^k haben willst: exp(k*ln(x))

Ich würde aber power empfehlen.

MfG,
Peter


NoEon - So 13.04.03 14:08

Danke das Funzt! Fertig!!!


Was war mit dem Help Workshop zum erstellen von Hilfe Datein? oder macht man das woanderes mit??


Danke schöen


Gruss
NoEoN


Christian S. - So 13.04.03 14:15

Hi!

Den gibt es, glaube ich, hier:
http://msdn.microsoft.com/workshop/author/htmlhelp/

der Link ist aus einem Tutorial bei Delphi-Source. Unter Tutorials --> Tools-Tutorials oder so.

MfG,
Peter


NoEon - So 13.04.03 14:22

Wunderbar!!!


Der Sonntag ist gerettet, die 99 Steps hab ich schon gefunden. Jetzt geht es rund, sprach der Kanarienvogel und flog in den Ventilator
Aso noch was... gibt es da auch so was wo ich das Programm einpacken lassen kann...? So ein Setup Dingsbums?

NoEoN


Christian S. - So 13.04.03 14:36

Jupp, gibt es: Inno Setup [http://www.jrsoftware.org/isinfo.php]


NoEon - So 13.04.03 17:42
Titel: mist geht noch nicht ganz
Hallo ich bin es noch mal schau mal das hab ich jetzt Fabriziert:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.BitBtn6Click(Sender: TObject);
var kn, k0, n, p:real;
begin

k0:=StrToFloat(edit16.Text);
p :=StrToFloat(edit17.Text);
n :=StrToFloat(edit18.Text);

                      if edit16.text = '0' then if abfang1(edit16) then Exit;
                      if edit17.text = '0' then if abfang1(edit17) then Exit;
                      if edit18.text = '0' then if abfang1(edit18) then Exit;

                      kn:= (k0*((1+p)/(100)^n));
                      label27.caption:-=FloatToStrf(kn, ffFixed, 18,2);
end;

end.


aber das ghet nicht so wie ich mir das gedacht habe.
das Basiert auf der Zinseszinsformel. Ich ich gefunden habe!

Kn=K0*((1+p)/(1*100))^n

das sollte so auch von der Umstellung her Stimmen, kann mir das mal jemand sagen ob das überhaupt richtig ist??

Danke noch mal

NoEoN


Christian S. - So 13.04.03 17:53

In meiner Formelsammlung steht die Zinseszinsformel so drin, dass nicht 1+p durch 100 geteilt wird, sondern dass es so aussieht: 1+p/100.

Die Formel sieht dann so aus:

kn = k0*q^n mit q = 1+p/100

Außerdem haben wir alle so fleißig Algorithmen und befehle für die Potenzberechnung gepostet, dass Du sie auch benutzen sollest!

Zitat:

label27.caption:-=FloatToStrf(kn, ffFixed, 18,2);

Das Minus in der Zuweisung solltest Du wegmachen.

MfG,
Peter


NoEon - So 13.04.03 18:03

hast Du p und q durcheinander gebracht???


Christian S. - So 13.04.03 18:15

Nö. So steht es in der Formelsammlung. Scheint mir auch einleuchtend zu sein. Wenn ich p = 3 habe (also 3% Zinsen), muss ich k0 mit 1,03 multiplizieren. Stimmt doch, oder?


NoEon - So 13.04.03 18:47

ne sorry heute rall ich nichst mehr ich glaub für heute lass ich das ich krieg das jetzt nicht merh in das billy billig Programm rein, mal sehn vielleicht morgen.

sag: for do schleife wurde oben erklärt... wurd die auch schon mal woanderes erklärt ich hab nichts gefunden. :-(

bis dann

ich gebs auf-....


Christian S. - So 13.04.03 19:33

Hier [http://www.delphi-forum.de/viewtopic.php?t=3774] hat sich Chatfix die Mühe gemacht, und was über Schleifen geschrieben.

MfG,
Peter


NoEon - Mo 14.04.03 13:48

ok also jetzt sieht das bei mri so aus.. mit der Power Funktion


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.BitBtn6Click(Sender: TObject);
var z, kn, p,ze,k0, lz:real;

begin

kn:=StrToFloat(edit16.Text);
p :=StrToFloat(edit17.Text);
lz :=StrToFloat(edit18.Text);

                      if edit16.text = '0' then if abfang1(edit16) then Exit;
                      if edit17.text = '0' then if abfang1(edit17) then Exit;
                      if edit18.text = '0' then if abfang1(edit18) then Exit;


                      k0:=kn*power((1+p/1*100), 1/lz);
                      //ze:=k0*(1+p/1*100);
                      //z:=power(ze, 1/lz);
                      //kn:= (k0*(power(1+p)/(100), 1/n));
                      //kn := k0*q^n mit q = 1+p/100


                      label27.caption:=FloatToStrf(k0, ffFixed, 18,2);
end;

aber ich bekomme krumme werte raus.. also stimmt nicht .. aber was nur ich hatte die Formel schon 2 mal umgestellt aber es ändert sich nichts!

unit math läuft und ist eingebunden
Danke und Gruss
NoEoN


Christian S. - Mo 14.04.03 14:08

Zitat:
k0:=kn*power((1+p/1*100), 1/lz);
Wie kommst Du auf diese Formel? Wenn ich die Formel, die ich gepostet habe, nach k0 umstelle, bekomme ich ein 1/(q^lz) und dann muss es also nicht 1/lz, sondern -lz heißen.

Zitat:
kn:= (k0*(power(1+p)/(100), 1/n));
Wieso 1/n ? Und das (1+p) ist auch falsch. Es muss doch 1 + p/100 heißen und nicht (1+p)/100.

MfG,
Peter


NoEon - Mo 14.04.03 14:57

hi Peter, erstmal danke das Du Dich intensiv mit meinem Problem beschäftigst!
p das ist meine Variable

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:
begin
     if LCSAbfang(edit16) then begin
          kn:=StrToFloat(edit16.Text);
          if LCSAbfang(edit17) then begin
               p :=StrToFloat(edit17.Text);
               if LCSAbfang(edit18) then begin
                    lz :=StrToFloat(edit18.Text);



-->diese Zeile  kn:= (k0*(power(1+p)/(100), 1/p));---->ist unterlegt
                      //k0:=kn*power((1+p/1*100), 1/lz);
                      //ze:=k0*(1+p/1*100);
                      //z:=power(ze, 1/lz);
                      //kn:= (k0*(power(1+p)/(100), 1/n));
                      //kn := k0*q^n mit q = 1+p/100


                      label27.caption:=FloatToStrf(kn, ffFixed, 18,2);
end;
end;
end;

end.

das ist jetzt erstmal mein text (quelltext)
und ich bekomme noch immer folgenden Fehler
warte ich Zitiere
Zitat:
[Hinweis] Unit1.pas(116): Auf 'wert' zugewiesener Wert wird niemals benutzt
[Fehler] Unit1.pas(228): Nicht genügend wirkliche Parameter
[Fataler Fehler] zinsen.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


so das setht da.. aber was nun noch nicht merh stimmt, das kann ich beim bestenwillen nicht sagen! Weil diese Meldungen, bis auf die letzte kenne ich nicht!

danke


Christian S. - Mo 14.04.03 15:42

Also, beim Power ist die erste ")" zu viel (die, hinter dem p). Deswegen glaubt er, das (1+p) wäre der einzige Parameter, deswegen die Fehlermeldung.

Dann glaube ich nicht, dass diese Formel mathematisch korrekt ist. Da steht nur k0 und p drin und sonst nichts, das kann nicht stimmen. Und das mit dem "1/" hast Du mir auch noch nicht erklärt.


NoEon - Mo 14.04.03 15:58

Hi, damit wir von gleichen reden

Zitat:
kn:= (k0*(power(1+p)/(100), 1/n));

das ist die richtige Formel??

kn:= Zinskapital nach n Jahren
k0:=Anfangskapital;
p:=Prozentsatz;
n:=Anzahl der Jahre;
das ist doch richtig oder?
und umstellen ist für mich sehr schwer.. weil ab da hab ich nur noch in Mathe gepennt, versteh das .. da sist ein Traume.. --->war wegen des Lehrers sogar beim Arzt, ich wollt nicht merh hin zu dem A** lo**.
Bitte hab verständniss dafür... ich bring mir das alles soweit ich damit in Kontakt komme selber bei oder lasse mir von Leuten wie Dir auf die Sprünge helfen!---->weil Mathe ist wichtig!
_____________________________________________________________
so nach mal ne änderung

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:
var k0, p, n, kn:real;

begin
     if LCSAbfang(edit16) then begin
          k0:=StrToFloat(edit16.Text);
          if LCSAbfang(edit17) then begin
               p :=StrToFloat(edit17.Text);
               if LCSAbfang(edit18) then begin
                    n :=StrToFloat(edit18.Text);



                      kn:= (k0*(power(1+p/(100), 1/n)));
                      {k0:=kn*power((1+p/1*100), 1/lz);
                      ze:=k0*(1+p/1*100);
                      z:=power(ze, 1/lz);
                      kn:= (k0*(power(1+p)/(100), 1/n));
                      kn := k0*q^n mit q = 1+p/100 }


                      label27.caption:=FloatToStrf(kn, ffFixed, 18,2);
end;
end;
end;
end;
end.


das ist jetzt soweit alles richtig, aber ....wenn die Länge der Laufzeit größer als eins ist, dann wird mein Endkapital auch kleiner!! :-( was ist das den nun schon wieder?


Christian S. - Mo 14.04.03 16:24

Die Formel ist so leider nicht richtig. Zur Erklärung:

Nehmen wir an, Du hast ein Startkapital k0 und bekommst 3% Zinsen pro Jahr. Wenn Du Dein Geld 1 Jahr angelegt hast, hast Du das Kapital k1. Das erhalten wir, indem wir das Startkapital mit (1+3%) multiplizieren, also mit 1,03. (Daher auch das 1+ p/100, denn 1+3% ist nichts anderes als 1+3/100)
Also: k1=k0*1,03 (Gleichung 1)

Für k2 gilt dann, dass wir k1 mit 1,03 multiplizieren. Also:
k2 = k1*1,03 (Gl. 2)

Nun ist aber nach Gl. 1 k1 = k0*1,03. Wenn wir das mal in Gl. einsetzen erhalten wir:
k2 = k0*1,03*1,03 (Gl. 3)

Wenn wir das so weiterführen kommen wir auf folgende allgemeine Gleichung für das Jahr n:

kn = k0*1,03*1,03* ... *1,03 wobei da n-mal 1,03 steht. Also:
kn = k0*1,03^n

Mit unseren Symbolen heißt das Ganze dann:

kn = k0*(1+p/100)^n

und in Delphi

kn:=k0*power(1+p/100,n);

Ich hoffe, ich konnte Dir damit weiterhelfen. Wenn Du generell mal Hilfe mit Mathe brauchst, kannst Du Dich gerne per PN bei mir melden.

MfG,
Peter


NoEon - Mo 14.04.03 16:38

Dafür danke ich Dir... ich werd mir das mal auf der Zunge ("Hirnwindungen") zergehn lassen!

Danke

echt Klasse jetzt läuft es auch!

:D :D :D :D :D :D :D :D