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:
@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