Seite 1 von 2

Math DLL-hilfe

Verfasst: 20.04.2007 14:35
von Andreas_S
Ich bastle gerade eine Math DLL die so viele Stellen wie man will ausrechnen kann. Ich bin noch nicht weit und frag mal ob sie auch Sinus und Cosinus rechnen können soll?

Wenn ja wie sieht denn so eine Funktion aus wenn man sie zB. im Kopf rechnen will aus?

Die Fage anders gestellt: Aus welchen Grundrechnungsarten bestehen sie?

PS. bin erst in der Vierten im Gymnasium und weiß was/wie man damit (etwas) ausrechnen kann von meinem Vater.

Verfasst: 20.04.2007 15:24
von Tafkadasom2k5
Kurze Zwischenfrage:
Gibt es nicht schon eine Lib, die unendlich große Zahlen mit Nachkomme ausrechnen kann?
AFAIK arbeitet diese mit Strings (weshalb man sie auch von BigNum-Lib auf BigShit-Lib taufen könnte), aber sie funktioniert allemal.

(BTW: Arbeitet PB auf Windows-Basis eigentich mit OLE-Strings? Oder normale Vor-0-Terminierte ASCIIZs?)

Gr33tz
Tafkadasom2k5

Verfasst: 20.04.2007 15:29
von Vallan
mm, wäre ganz praktisch.

Sin(x) = x/1!-x^3/3!+x^5/5!-...
(immer ungrade Zahlen, und +/- abwechselnd)
cos(x)= 1-x^2/2!+x^4/4!-x^6/6+!...
(grade Zahlen, und +/- abwechselnd)

(!= Fakultät: 5!= 1*2*3*4*5 )

Verfasst: 20.04.2007 15:39
von gekkonier
Tafkadasom2k5 hat geschrieben:Kurze Zwischenfrage:
Gibt es nicht schon eine Lib, die unendlich große Zahlen mit Nachkomme ausrechnen kann?
Ja, gibt es:
http://gmplib.org/ (die schnellste Lib wo gibt, und dazu noch GNU, ole!)
Limitiert ist die Grösse der Beträge durch den Hauptspeicher, der der Sache zur Verfügung gestellt wird.

Warum man so etwas nochmal schreiben sollte:
In diesem Fall:

Verinnerlichung der Formeln
Verinnerlichung von Algorithmen

Weiterbildung rockt!

Verfasst: 20.04.2007 15:48
von DarkDragon
BigNum heißt die Lib. Man kanns auch komplizierter machen indem man zuerst eine fremde statische lib importiert.

Verfasst: 20.04.2007 15:52
von Kaeru Gaman
@PBprogger

vierte klasse gymnasium... kann ich jetzt nich so viel mit anfangen,
in DE rechnen wir ab einschulung.. wieviele jahre volksschule habt ihr denn vorm gymi?

wie auch immer...

schau dir mal den wiki-artikel Einheitskreis an.
da müsstest du schon sehr viel info über sin und cos rausbekommen.

die grafik find ich echt klasse:
Bild


@Vallan
ich meine, man kann den sinus auch einfacher ausrechnen.
diese kettenformel mit x-mal fakultät im nenner ist doch wahnsinn.

Verfasst: 20.04.2007 16:49
von Froggerprogger
Schau mal hier nach mySin und myCos (8ter Beitrag).

http://www.purebasic.fr/german/viewtopic.php?t=5550

Statt floats in der Prozedur kannst du auch andere Datentypen (z.B. big decimal) nehmen, mit denen man Addieren/Subtrahieren/Multiplizieren/Dividieren kann, um mehr Stellen zu berechnen.

Verfasst: 20.04.2007 17:45
von Andreas_S
@Kaeru Gaman

8. Schulstufe

@gekkonier

Wieder alle überlegungen umsonst! Da kann ich ja gleich den Source Code posten. Mit nicht weit meinte ich beim Addieren.

Code: Alles auswählen

Procedure Rest(Num)
 test=-1
  Repeat
    If Num>test
     result=addE
    Else
     Find=1
    EndIf
   test+10
   addE+1
  Until Find
 ProcedureReturn result
EndProcedure

Procedure OneNum(Num)
 test=-1
  Repeat
    If Num>test
     add=test+1
    Else
     Find=1
    EndIf
   test+10
  Until Find
 result=Num-add
 ProcedureReturn result
EndProcedure

Procedure HNum(Num1,Num2)
  If Num1>Num2
   result=Num1
  EndIf
  If Num1<Num2
   result=Num2
  EndIf
  If Num1=Num2
   result=Num1
  EndIf
 ProcedureReturn result
EndProcedure

Procedure$ Addition(Summand1$,Summand2$)
  If Summand1$ And Summand2$
   SumLen1=Len(Summand1$)
   SumLen2=Len(Summand2$)
   largerSumLen=HNum(SumLen1,SumLen2)
   LKom1=FindString(Summand1$,".",1)
   LKom2=FindString(Summand2$,".",1)
   largerLKom=HNum(LKom1,LKom2)
    If largerLKom=0
     KomELI=1
    EndIf
    If LKom1=0 And LKom2>=1
     AfterKom$=Mid(Summand2$,LKom2,SumLen2)
     KomELI=2
    EndIf
    If LKom1>=1 And LKom2=0
     AfterKom$=Mid(Summand1$,LKom1,SumLen1)
     KomELI=2
    EndIf
   RLen1=SumLen1-LKom1
   RLen2=SumLen2-LKom2
   largerRLen=HNum(RLen1,RLen2)

   ;{ FließkommaZahlen
    If KomELI=0
      For k=largerSumLen To largerRLen Step -1
       SSum1$=Mid(Summand1$,k,1)
        SSum2$=Mid(Summand2$,k,1)
        If SSum1$ And k<=SumLen1
         SSum1=Val(SSum1$)
        Else
         SSum1=0
        EndIf
        If SSum2$ And k<=SumLen2
         SSum2=Val(SSum2$)
        Else
         SSum2=0
        EndIf
       AddA=SSum1+SSum2+Rest
       Rest=Rest(AddA)
       Add=OneNum(AddA)
       result$=Str(Add)+result$
      Next
     result$="."+result$
     ForVal=largerLKom-1
     ToVal=1
    Else
     result$=AfterKom$+result$
     ForVal=largerSumLen
     ToVal=1
    EndIf
   ;} EndFließkommaZahlen
   ;{ GanzeZahlen
    For k=ForVal To ToVal Step -1
     Step1:
     Dif1=k-(largerSumLen-SumLen1)
     Dif2=k-(largerSumLen-SumLen2)
     SSum1$=Mid(Summand1$,Dif1,1)
     SSum2$=Mid(Summand2$,Dif2,1)
      If SSum1$ And Dif1>=1
       SSum1=Val(SSum1$)
      Else
       SSum1=0
      EndIf
      If SSum2$ And Dif2>=1
       SSum2=Val(SSum2$)
      Else
       SSum2=0
      EndIf
     AddA=SSum1+SSum2+Rest
     Rest=Rest(AddA)
     Add=OneNum(AddA)
     result$=Str(Add)+result$
    Next
   ;} EndGanzeZahlen

    If Rest
     result$=Str(Rest)+result$
    EndIf
  Else
   result$="-1"
  EndIf
 ProcedureReturn result$
EndProcedure
Ist ebenfalls ein Stringrechner. Braucht im Prinzip nur eine For Next Schleife.

Bevor ich's vergesse DANKE. Besonders für die Grafik.

Kann keine negativen Zahlen verwnden!

Abgesehen davon dass es soetwas schon gibt, meie neue standart Frage "Was haltet ihr davon?".

Verfasst: 20.04.2007 22:19
von Andreas_S
Ich hab da noch ne Frage: Warum drehen sich die Punkte nicht von 0° aufwärts bis zu 360°? Damit meine ich dass die Punkte "irgendwo" gezeichnet werden und nicht den Kreis nach,

Code: Alles auswählen

OpenWindow(0,10,10,300,300,"Kreis",#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)

r=140
StartDrawing(WindowOutput(0))
 For alfa=0 To 360
  x=Sin(alfa)*r
  y=Cos(alfa)*r
  Plot(x+r+10,y+r+10)
  Delay(10)
 Next
StopDrawing()

Repeat
 EventID=WaitWindowEvent()
  If EventID=#PB_Event_CloseWindow
   Quit=1
  EndIf
Until Quit=1

Verfasst: 21.04.2007 06:16
von Helle
Weil die Argumente der Winkelfunktionen als Radiant angegeben werden. Also umrechnen in Winkel:

Code: Alles auswählen

OpenWindow(0,10,10,300,300,"Kreis",#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered) 

r=140 
StartDrawing(WindowOutput(0)) 
 For alfa=0 To 360 
  x=Sin((alfa*#PI)/180)*r 
  y=-Cos((alfa*#PI)/180)*r   ;Zeichenbeginn oben und in Uhrzeigersinn
  Plot(x+r+10,y+r+10) 
  Delay(10) 
 Next 
StopDrawing() 

Repeat 
 EventID=WaitWindowEvent() 
  If EventID=#PB_Event_CloseWindow 
   Quit=1 
  EndIf 
Until Quit=1
Gruss
Helle