Math DLL-hilfe

Für allgemeine Fragen zur Programmierung mit PureBasic.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Math DLL-hilfe

Beitrag 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.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag 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
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Vallan
Beiträge: 223
Registriert: 20.01.2006 19:34
Kontaktdaten:

Beitrag 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 )
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Beitrag 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!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

BigNum heißt die Lib. Man kanns auch komplizierter machen indem man zuerst eine fremde statische lib importiert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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.
!UD2
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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?".
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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
Antworten