Rechnen mit gemischten Datentypen

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

    • Rechnen mit gemischten Datentypen

      In der Hilfe von bascom steht ja drin, das man möglichst mit gleichen Datentypen (byte, integer, word..) rechnen soll. Ein zuordnen Var_integer=Var_single geht ja in der Regel, wenn man darauf achtet, dass in das Ziel auch zumindest der ganzzahlige Wert von der Größe her rein passt.
      Aber, geht das Rechnen immer schief, oder geht das, wenn man die Reihenfolge beachtet Var_integer=Var_integer1*Var_single bzw Var_integer=Var_single*Var_integer1?
      Raum für Notizen

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

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

      geht das Rechnen immer schief,
      Ja, meistens.
      Ich habe bisher keine Probleme mit dem Rechnen mit verschieden Datentypen gehabt, wenn ich in der Formel nicht Singles etc und Ganzzahlen vermische. Ich mache vor der Formel die Typkonvertierung zwischen Single etc und Ganzzahlen. Ich meine aber mal ein Problem mit langen Singles (wie heißen die noch?) gehabt zu haben (2080, es kommt sicher auch auf die Bascom-Version an). Du mußt halt immer aufpassen, sonst stürzt Deine Rakete doch irgendwann mal ab.
      Zum Entkäfern habe ich immer eine TX-Schnittstelle dran und lasse mir die Ergebnisse vor und nach den Rechnungen anzeigen.
    • Laut Hilfe liefert das round ja wieder ein single
      var = ROUND( x )
      Remarks
      VarA single or double variable that is assigned with the ROUND of variable x.
      XThe single or double to get the ROUND of.

      Ich wäre vorsichtig und würde die 2. Variante wählen. Single sind halt ganz anders 'aufgebaut' als Ganzzahlen. Und dass das dann das Ergebnis der Berechnung gleich konvertiert wird, dass es in eine Ganzzahl passt, hm...
      Kannst ja mal ein Miniprogramm im Simulator laufen lassen. Aber bis man das probiert hat, hat man die 2. Zeile schon lange geschrieben.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Bei dem Beispiel kann nicht viel schief gehen. Wenn const x=5.5 ist, was passiert bei
      dim a as byte
      und dann
      a=1+x?
      Ein byte mit einer single addieren geht doch schief, man muss doch erst die single zB mit a=x in ein byte überführen. (denke ich)
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • BASCOM Source Code

      1. $regfile = "M88def.dat"
      2. $crystal = 1000000
      3. $hwstack = 40
      4. $swstack = 40
      5. $framesize = 60
      6. Const X = 5.5
      7. Dim A As Byte
      8. Print "Vorher:"
      9. Print "a= " ; A ; " x= " ; X
      10. A = 1 + X
      11. Print "Nachher:"
      12. Print "a= " ; A ; " x= " ; X
      13. End
      Display All




      ergibt im Simulator:

      Source Code

      1. Vorher:
      2. a= 0 x= 5.5
      3. Nachher:
      4. a= 7 x= 5.5


      Es hat nicht geknallt :)

      Der Compiler liest:
      A = 1 + X

      Daraus macht er wegen der Konstantenersetzung:
      A = 1 + 5.5
      Dann denkt er 'Hoppla, da brauche ich keine Singleoperation' und rechnet statt 1 + 5.5 einfach 1 + 6





      Geht auch umgekehrt:

      BASCOM Source Code

      1. $regfile = "M88def.dat"
      2. $crystal = 1000000
      3. $hwstack = 40
      4. $swstack = 40
      5. $framesize = 60
      6. Const X = 5.5
      7. Dim A As Byte
      8. Print "Vorher:"
      9. Print "a= " ; A ; " x= " ; X
      10. A = X + 1
      11. Print "Nachher:"
      12. Print "a= " ; A ; " x= " ; X
      13. End
      Display All



      Source Code

      1. Vorher:
      2. a= 0 x= 5.5
      3. Nachher:
      4. a= 7 x= 5.5
    • Ich frage mich nur, wie kommt jetzt der compiler darauf, x auf 6 zu runden, wo doch bei Ganzzahl-operationen die Nachkommastellen einfach weg fallen?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Wenn man das Programm erweitert

      BASCOM Source Code

      1. $regfile = "M88def.dat"
      2. $crystal = 1000000
      3. $hwstack = 40
      4. $swstack = 40
      5. $framesize = 60
      6. Const X = 5.5
      7. Dim A As Byte , B As Byte
      8. Dim Y As Single
      9. Y = 5.5
      10. Print "Vorher:"
      11. Print "a= " ; A ; "b= " ; B ; " x= " ; X ; " y= " ; Y
      12. A = 1 + X
      13. B = Y + 1 'ist nur in dieser Reihenfolge zulässig
      14. Print "Nachher:"
      15. Print "a= " ; A ; " b= " ; B
      16. End
      Display All

      stellt man fest, dass nur diese Reihenfolge in Zeile 17 zulässig ist und als Ergebnis bekommt man

      Source Code

      1. Vorher:
      2. a= 0b= 0 x= 5.5 y= 5.5
      3. Nachher:
      4. a= 7 b= 6
      Da werden jetzt die Nachkommas einfach weg gehauen 8o
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hans_L wrote:

      ich könnte also schreiben:
      A_single = B_Single / X ?
      War das die Frage? Antwort von mir: ja. Bei dieser Berechnung kann ja nix schief gehen. (außer die planmäßigen Fehler durch die Darstellung der Zahl mit Mantisse und Exponent, das findet man in diesem Kapitel avrhelp.mcselec.com/language_fundamentals.htm)
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Achso, ja, das geht nur so, sonst kommt die Fehlermeldung, dass y nicht gedimmt ist. Es wird nicht compiliert. Ich kann also kein Rechenergebnis mit der anderen Reihenfolge erzielen.
      Raum für Notizen

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

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