Seite 1 von 2

Winkelfunktionen geben falsche Werte zurück

Verfasst: 24.03.2010 22:34
von Travis
PureBasic gibt mir folgende Werte zurück :o :o :o :

cos(15) = -0.75968791285882131
cos(45) = 0.52532198881772973
cos(180) = -0.59846006905785809
cos(225) = 0.36731936773024515
cos(360) = -0.28369109148652732

Die realen Werte sind aber doch:

cos(15) = 0,9659
cos(45) = 0,7071
cos(180) = -1
cos(225) = -0,7071
cos(360) = 1

Muss die Funktion vielleicht noch kallibriert werden :shock: :shock: ???

Re: Winkelfunktionen geben falsche Werte zurück

Verfasst: 24.03.2010 22:39
von helpy
Siehe PureBasic-Hilfe
Syntax

Code: Alles auswählen

Ergebnis.f = Sin(Winkel.f)
Beschreibung

Gibt den Sinus des angegebenen Winkels zurück, 'Winkel.f' muss im Bogenmaß (Radiant) angegeben werden, das Ergebnis wird zwischen -1 und 1 liegen.
Siehe:
==> Bogenmaß
==> Umrechnung zwischen Radiant und Grad

Hoffe, das hilft einen Schritt weiter ;-)
cu,
helpy

Re: Winkelfunktionen geben falsche Werte zurück

Verfasst: 24.03.2010 22:52
von STARGÅTE
:bounce:
Winkelfunktionen geben falsche Werte zurück. [...] Muss die Funktion vielleicht noch kallibriert werden ???
Wie geil, das ist echt Zitatwürdig. :allright:

Zum glück hast du das gesehen ^^ und wir rechnen alle seit über 7 jahren mit unkallibriert Werten :freak:

BTW: Cos(180) = -1 ist so oder so falsch! wenn dann Cos(180°) = -1 !!

Re: Winkelfunktionen geben falsche Werte zurück

Verfasst: 24.03.2010 23:19
von Travis
@ helpy
Na doll. Bin es seit 9 Jahren gewohnt immer direkt den Winkel anzugeben. Zum Glück kann man sich ja 'ne Funktion dafür schreiben. In diesem Sinne hatte ich wohl doch recht mit der Kallibrierung :wink:

@ STARGÅTE bin auch gerade wieder am gucken 8)

hier stand was was gelöscht wurde wegen mittlerweiliger bezugslosigkeit
(bobobo)

Re: Winkelfunktionen geben falsche Werte zurück

Verfasst: 25.03.2010 01:20
von Travis
Die Botschaft ist mittlerweile angekommen. Habe das Problem jetzt gelöst.

Code: Alles auswählen

InitSprite()
InitKeyboard()
   
ResX = 800
ResY = 600
    
OpenWindow(0, 0, 0, 800, 650, "Cossin",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)

 ButtonGadget(1,   0, 600, 100, 50, "Hide Cos") : ShowCos = 1
 ButtonGadget(2, 100, 600, 100, 50, "Hide Sin") : ShowSin = 1
 
 TextGadget(5, 250,605,50,20,"Amplitude:")
 TextGadget(6, 250,625,50,20,"Amplitude:")
 
 TrackBarGadget(3, 300, 600, 100, 20, 0, 200): SetGadgetState(3, 40): GadgetToolTip(3,"Kosinus") ; Schieber Kosinus
 TrackBarGadget(4, 300, 620, 100, 20, 0, 200): SetGadgetState(4,100): GadgetToolTip(4,"Sinus")   ; Schieber Sinus

OpenWindowedScreen(WindowID(0), 0, 0, ResX, ResY, 0, 0, 0)

Procedure.f CosW(w)
 ProcedureReturn Cos((3.141592653589793238/180)*w)
EndProcedure

Procedure.f SinW(w)
 ProcedureReturn Sin((3.141592653589793238/180)*w)
EndProcedure

Repeat

 Repeat
 
  Event = WindowEvent() ; Ist etwas im Fenster passiert?
      
   Select Event
    
     Case #PB_Event_Gadget ; Ein Gadget wurde gedrückt
     
      Select EventGadget()
      
       Case 1 ; Button 1
        If ShowCos = 1
         ShowCos = 0
         SetGadgetText(1,"Show Cos")
        Else
         ShowCos = 1
         SetGadgetText(1,"Hide Cos")
        EndIf
       Case 2 ; Button 2
        If ShowSin = 1
         ShowSin = 0
         SetGadgetText(2,"Show Sin")
        Else
         ShowSin = 1
         SetGadgetText(2,"Hide Sin")
        EndIf
      EndSelect
         
     Case #PB_Event_CloseWindow ; Fenster schliessen
      End
       
    EndSelect
      
 Until Event = 0


 ClearScreen(0) 
 StartDrawing(ScreenOutput())
  
  For y = 0 To ResY-1 Step 15
   For x = 0 To ResX-1 Step 15
    Plot(x,y,RGB(100,100,100))
   Next
  Next
 
  For x = 0 To ResX Step 100
   Line(x,0,1,768,RGB(64,64,64))
  Next
 
  For y = 0 To ResY Step 100
   Line(0,y,1024,1,RGB(64,64,64))
  Next
 
  For x = 1 To ResX-1
   If ShowCos
    h = GetGadgetState(3)
    y = h * CosW(x) + ResY/2
    Plot(x,y,RGB(0,255,0))
   EndIf
   If ShowSin
    h = GetGadgetState(4)
    y = h * SinW(x) + ResY/2
    Plot(x,y,RGB(255,0,0))
   EndIf
  Next
  
  StopDrawing() 
  FlipBuffers()

ForEver

Re: Winkelfunktionen geben falsche Werte zurück

Verfasst: 25.03.2010 01:39
von CSHW89
statt '3.141592653589793238' kannste auch #PI schreiben.
is nicht so lang
lg kevin

Re: Winkelfunktionen geben falsche Werte zurück

Verfasst: 31.03.2010 23:10
von captain_hesse
... aber irgendwas ist trotzdem nicht richtig denn wenn man

Code: Alles auswählen

a.f=Sin(#PI/180*50)
b.f=Sin(#PI/180)*50
Debug a
Debug b
Debug Sin(#PI/180*50)
Debug Sin(#PI/180)*50
eingibt kommt immer was anderes raus.
Warum ?? :?

Re: Winkelfunktionen geben falsche Werte zurück

Verfasst: 31.03.2010 23:13
von ts-soft
captain_hesse hat geschrieben: eingibt kommt immer was anderes raus.
Warum ?? :?
Weil der Debugger double nutzt, hast ihm ja nichts anderes gesagt :wink:

Code: Alles auswählen

a.d=Sin(#PI/180*50)
b.d=Sin(#PI/180)*50
Debug a
Debug b
Debug Sin(#PI/180*50)
Debug Sin(#PI/180)*50

Re: Winkelfunktionen geben falsche Werte zurück

Verfasst: 31.03.2010 23:21
von captain_hesse
Das verstehe ich nicht ganz,

1.) ist denn die ungenauigkeit der floats bzw. doubles so extrem ?
2.) wenn man die ersten vier zeilen weg lässt sind die ergebnisse immer noch verschieden.

Re: Winkelfunktionen geben falsche Werte zurück

Verfasst: 31.03.2010 23:32
von STARGÅTE
Ja, ist doch richtig !

Wäre mir neu, wenn Sin oder Cos auf einmal linear wären :lol:

Sin und Cos nehmen immer noch das Bogenmaß als Parameter !

und (#PI/180*50) ist ein völlig anderer Winkel als (#PI/180)