Was kann man machen, um die Funktion V_single=Val(V_string) zu verbessern?

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Was kann man machen, um die Funktion V_single=Val(V_string) zu verbessern?

      Wenn ich NMEA-Strings, die aus einem gps-Empfänger kommen, in eine single umwandle, dann sollte das Erscheinungsbild doch erstmal gleich sein, wenn ich beide Variablen drucke. Ist es aber nicht, zumindest bei mir nicht und das schon ab der 3. Nachkommastelle ||
      Folgender Ausdruck als Beispiel
      4934.94379N 4934.941894531 49.582363126
      01057.70983E 1057.709472656 10.961824415
      4934.94360N 4934.941894531 49.582363126
      01057.70991E 1057.709472656 10.961824415
      4934.94356N 4934.941894531 49.582363126
      01057.71004E 1057.709960937 10.961832044
      die erste Ziffernfolge ist der string (ggmm.mmmmm), N oder E ist die geographische Richtung, die 2. Ziffernfolge ist jetzt Val(string) (ggmm.mmmmm) und die 3. Ziffernfolge soll die Grad-Dezimalzahl des strings sein (gg,ggggggggg)
      Wo ist jetzt ein Fehler, oder was muss ich andes Machen, dass ich eine bessere Genauigkeit bekomme?

      Das Programm schaut im interessanten Bereich so aus:

      BASCOM Source Code

      1. ...
      2. Print Laenge_txt ; N_s ; " ";
      3. Temp = Val(laenge_txt)
      4. Print Temp ; " ";
      5. Temp = Grad_dez(laenge_txt)
      6. Print Temp ; " "
      7. Print Breite_txt ; O_w ; " ";
      8. Temp = Val(breite_txt)
      9. Print Temp ; " ";
      10. Temp = Grad_dez(breite_txt)
      11. Print Temp ; " "
      12. End If
      13. Loop
      14. End
      15. Function Grad_dez(byval Grad_string As String * 14)as Single
      16. 'erzeugt aus Nmea-strings ggggmm.mmmmmm eine single gg.gggggggg
      17. Local Grad_word As Word , Grad_ As Word , Grad_single As Single , Minuten As Single , Grad_bruch As Single
      18. Grad_single = Val(grad_string) 'umwandeln in Dezimalzahl
      19. Grad_word = Grad_single 'Nachkommas entfernen, letzten beidenn Stellen sind Minuten
      20. Grad_ = Grad_word / 100 'Minutenanteil entfernen
      21. Grad_word = Grad_ * 100 'Gradzahl*100
      22. Minuten = Grad_single - Grad_word 'Minuten samt Bruchteil der Minuten
      23. Grad_bruch = Minuten / 60 'Bruchteil von einem Grad
      24. Grad_dez = Grad_ + Grad_bruch
      25. End Function
      26. ...
      Display All
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Bearbeiten geht nicht mehr? ?(

      Singles wurden erschaffen um die CPUs zu quälen :D
      Warum nicht so:

      Source Code

      1. Dim Nmeastr As String * 10
      2. Dim L_grdstr As String * 2 At Nmeastr Overlay
      3. Dim L_minstr As String * 2 At Nmeastr + 2 Overlay
      4. Dim L_reststr As String * 4 At Nmeastr + 5 Overlay
      5. Dim L_grad As Byte
      6. Dim L_rest As Dword
      7. Dim Tempdw As Dword
      8. Dim P_grad As String * 2
      9. Nmeastr = "4934.94379"
      10. Print Nmeastr ; "=";
      11. P_grad = Left(l_grdstr , 2)
      12. Tempdw = Val(l_minstr)
      13. Tempdw = Tempdw * 500000
      14. Tempdw = Tempdw / 3
      15. L_rest = Val(l_reststr)
      16. Tempdw = Tempdw + L_rest
      17. Print P_grad ; "," ;
      18. Print Tempdw
      Display All
    • @Pluto25 du gehst von einem festgelegten Aufbau des string aus, die Anzahl der Nachkommastellen kann schwanken, soweit ich das in Erinnerung hab'. Außerdem brauch ich als Ergebnis ein single, weil es dann mit sin(Ergebnis) und so Zeugs weiter geht. Ich werd's mal mit double probieren und mit meinem Taschenrechnerergebnis vergleichen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Mitch64 wrote:

      Und klappt es nun mit Double?
      mit viel Mühe, aber die Werte passen jetzt und die Umrechnung in Grad mit Kommastellen passt mit dem Taschenrechner zusammen.

      BASCOM Source Code

      1. Function Grad_dez(byval Grad_string As String * 14)as Double
      2. 'erzeugt aus Nmea-strings ggggmm.mmmmmm eine double gg.gggggggg
      3. Local Grad_long As Long , Grad_ As Long
      4. Local Grad_double As Double , Minuten As Double , Grad_bruch As Double , Helfer As Double
      5. Grad_double = Val(grad_string) 'umwandeln in Dezimalzahl
      6. Grad_long = Grad_double 'Nachkommas entfernen, letzten beidenn Stellen sind Minuten
      7. Grad_ = Grad_long / 100 'Minutenanteil entfernen
      8. Grad_long = Grad_ * 100 'Gradzahl*100
      9. Helfer = Grad_long
      10. Minuten = Grad_double - Helfer 'Minuten samt Bruchteil der Minuten
      11. Helfer = Grad_
      12. Grad_bruch = Minuten / 60 'Bruchteil von einem Grad
      13. Grad_dez = Helfer + Grad_bruch
      14. End Function
      Display All

      so schaut jetzt meine Funktion aus. Ich muss einen Helfer bemühen, weil double=double+long (Zeile 11, wenn statt dem Helfer Grad_long verwendet wird) zur Fehlermeldung führt. Ein double kann man auch nicht in ein word oder integer kopieren 8|

      BASCOM Source Code

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 34
      4. $swstack = 32
      5. $framesize = 64
      6. Dim A As Double , C As Double
      7. Dim B As Long , B1 As Double
      8. Dim D As Integer
      9. A = 123.456789
      10. D = A
      11. B = A
      12. B1 = B
      13. C = A - B1
      14. Print A ; " " ; B ; " " ; B1 ; " " ; C
      15. End
      Display All
      Error : 93 Line : 12 Variable not dimensioned [A] , in File : G:\Bascom\noname3.bas
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Action
      Returns the integer part of a single or double.
      Syntax
      var = INT( source )
      Remarks
      Var
      A numeric floating point variable that is assigned with the integer of variable source.
      Source
      The source floating point variable to get the integer part of.

      The fraction is the right side after the decimal point of a single.
      The integer is the left side before the decimal point.
      1234.567 1234 is the integer part, .567 is the fraction
      The assigned variable must be a single or double. When you want to convert a floating point data type to an integer data type, just assign the variable to a variable of that type : someLong = someDoublehab' ich grad' in der Hilfe gefunden

      Mitch64 wrote:

      Und wenn du Double in integer wandelst, sollte der Wert schon rein passen.
      ich darf garnicht, reinpassen tät's locker.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Mitch64 wrote:

      Dann erzählt die Bascomhilfe Müll?
      sie lässt sich nicht darüber aus. Man kann ohne Fehlermeldung double in ein long überführen, in ein integer ist nicht erlaubt. Schau' in Post#7, unteres Beispiel.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • mit double ist es nicht so einfach, ich häng beim nächsten Problem/Fehler
      fehler1.PNG
      :cursing: a_20_e8d7189d


      edit: die Fehlerursache war ich, wenn man die Variablennamen nicht schreiben kann.. a_45_132ca9f5
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      The post was edited 1 time, last by tschoeatsch ().

    • klar, ich bin jetzt ganz happy, weil mein Billig-Gps-Modul hier auf meinem Schreibtisch Koordinaten liefert, die sekündlich entweder gleich sind, oder eine Abweichung von 95mm oder 134mm haben. So habe ich es zumindest ausgerechnet. :D Alles bisschen verdächtig. a_19_23577ce2
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch wrote:

      Alles bisschen verdächtig.
      Wieso verdächtig?

      Wegen der Abweichung kannst du auch mal ein anderes Fenster probieren.
      Je mehr Satelliten der Empfänger sieht, umso genauer. Darüber hinaus darf man auch nicht vergessen, dass Satelliten nicht angenagelt sind, sondern auch driften.
      Und das wird von Bodenstationen ständig überwacht und korrigiert. Von daher können immer Abweichungen vorhanden sein.
    • ich finde das Ergebnis zu gut. Der Empfänger errechnet ja vor Ort die Position aus und das aus den Daten von 6? Satelliten. Und das für 3,40€!
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------