PureBoard
https://www.purebasic.fr/german/

Winkelfunktionen geben falsche Werte zurück
https://www.purebasic.fr/german/viewtopic.php?f=16&t=22135
Seite 1 von 2

Autor:  Travis [ 24.03.2010 22:34 ]
Betreff des Beitrags:  Winkelfunktionen geben falsche Werte zurück

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

Autor:  helpy [ 24.03.2010 22:39 ]
Betreff des Beitrags:  Re: Winkelfunktionen geben falsche Werte zurück

Siehe PureBasic-Hilfe
Zitat:
Syntax

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

Autor:  STARGÅTE [ 24.03.2010 22:52 ]
Betreff des Beitrags:  Re: Winkelfunktionen geben falsche Werte zurück

:bounce:
Zitat:
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 !!

Autor:  Travis [ 24.03.2010 23:19 ]
Betreff des Beitrags:  Re: Winkelfunktionen geben falsche Werte zurück

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

Autor:  Travis [ 25.03.2010 01:20 ]
Betreff des Beitrags:  Re: Winkelfunktionen geben falsche Werte zurück

Die Botschaft ist mittlerweile angekommen. Habe das Problem jetzt gelöst.

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

Autor:  CSHW89 [ 25.03.2010 01:39 ]
Betreff des Beitrags:  Re: Winkelfunktionen geben falsche Werte zurück

statt '3.141592653589793238' kannste auch #PI schreiben.
is nicht so lang
lg kevin

Autor:  captain_hesse [ 31.03.2010 23:10 ]
Betreff des Beitrags:  Re: Winkelfunktionen geben falsche Werte zurück

... aber irgendwas ist trotzdem nicht richtig denn wenn man

Code:
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 ?? :?

Autor:  ts-soft [ 31.03.2010 23:13 ]
Betreff des Beitrags:  Re: Winkelfunktionen geben falsche Werte zurück

captain_hesse hat geschrieben:
eingibt kommt immer was anderes raus.
Warum ?? :?

Weil der Debugger double nutzt, hast ihm ja nichts anderes gesagt :wink:
Code:
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

Autor:  captain_hesse [ 31.03.2010 23:21 ]
Betreff des Beitrags:  Re: Winkelfunktionen geben falsche Werte zurück

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.

Autor:  STARGÅTE [ 31.03.2010 23:32 ]
Betreff des Beitrags:  Re: Winkelfunktionen geben falsche Werte zurück

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)

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/