Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Probleme mit der REAL_TO_INT Funktion

  1. #1
    Registriert seit
    05.05.2008
    Beiträge
    11
    Danke
    13
    Erhielt 0 Danke für 0 Beiträge

    Ausrufezeichen


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!!

    Ich möchte eine REAL-Variable in einen String umwandeln. Soweit funktioniert diese Funktion auch, aber wenn z.B. in der Variablen steht 4.3 dann bekomme ich als Ergebniss '4.300000021353234'

    Weiß jemand wie das vermieden werden könnte??
    Möchte ja als Antwort: '4.3' im String stehen haben.

    Ich habe auch die Funktion FB_FormatString einmal getestet und das Beispiel implementiert. Wenn man nun hier REAL-Variablen verwendet und z.B. 0.1 immer aufaddiert kommt plötzlich auch ein Fehler bei der Addition zustande!!
    Kennt jemand diese Fehler??

    Schöne Grüße!!
    Zitieren Zitieren Probleme mit der REAL_TO_INT Funktion  

  2. #2
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    1
    Erhielt 9 Danke für 9 Beiträge

    Standard

    Hallo,

    wie wäre es anstelle von "REAL_TO_INT" mit "REAL_TO_STRING"?
    Code:
    LD	4.3
    REAL_TO_STRING
    ST	HM_STRING
    Viele Grüße
    MTec

  3. Folgender Benutzer sagt Danke zu MTec für den nützlichen Beitrag:

    Superfly (13.05.2008)

  4. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.404 Danke für 2.002 Beiträge

    Standard

    ... das sind die Tücken der REAL-Zahlen ...

    Mein Vorschlag wäre hier : auf INT (oder DINT) ausweichen. Bei einer Nachkommastelle multiplizierst du mit 10, machst eine INT daraus, wandelst diese in einen STRING (wenn es denn unbedingt ein STRING sein muss) und schiebst hinterher an der 2. Stelle von hinten das Komma in den STRING ein ...

    Eine Art "PRINT USING"-Funktion gibt es da meines Wissens nicht ...

    Gruß
    LL

  5. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Superfly (13.05.2008)

  6. #4
    Superfly ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.05.2008
    Beiträge
    11
    Danke
    13
    Erhielt 0 Danke für 0 Beiträge

    Standard

    wie wäre es anstelle von "REAL_TO_INT" mit "REAL_TO_STRING"?
    Sorry! Die Überschrift ist falsch! Sollte natürlich REAL_TO_STRING heißen!

    das sind die Tücken der REAL-Zahlen ...
    Warum werden diese auch falsch addiert?

    Mein Vorschlag wäre hier : auf INT (oder DINT) ausweichen. Bei einer Nachkommastelle multiplizierst du mit 10, machst eine INT daraus, wandelst diese in einen STRING (wenn es denn unbedingt ein STRING sein muss) und schiebst hinterher an der 2. Stelle von hinten das Komma in den STRING ein ...
    Wie kann man dhier am besten ein Zeichen einfügen?

  7. #5
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    1
    Erhielt 9 Danke für 9 Beiträge

    Standard

    Zitat Zitat von Superfly Beitrag anzeigen
    Wie kann man dhier am besten ein Zeichen einfügen?
    Das könnte beispielsweise so aussehen:
    Code:
    PROGRAM PLC_PRG
    VAR
      HM_StringResult: STRING;
      HM_StringLength: INT;
      HM_CommaPos: INT;
    END_VAR
    
    
    
    (* String erzeugen *)
    LD	+123456     	(*Ergebnis in DINT --> vorher für 2 Nachkommastellen mit 100 multipliziert *)
    DINT_TO_STRING
    ST	HM_StringResult
    
    (* Stringlänge ermitteln *)
    LD	HM_StringResult
    LEN
    ST	HM_StringLength
    (* Nachkommastellen berechnen *)
    SUB	2
    ST	HM_CommaPos
    
    (* Punkt in String einfügen *)
    LD	HM_StringResult
    INSERT	 '.',HM_CommaPos
    ST	HM_StringResult
    Der Feinschliff fehlt noch (z.B. auswerten von Werten < 10), aber Du möchtest ja auch noch etwas zu tun haben...

    Viele Grüße
    MTec

  8. Folgender Benutzer sagt Danke zu MTec für den nützlichen Beitrag:

    Superfly (14.05.2008)

  9. #6
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    Zitat Zitat von Superfly Beitrag anzeigen
    ...wenn z.B. in der Variablen steht 4.3 dann bekomme ich als Ergebniss '4.300000021353234'

    ... Wenn man nun hier REAL-Variablen verwendet und z.B. 0.1 immer aufaddiert kommt plötzlich auch ein Fehler bei der Addition zustande!!
    Kennt jemand diese Fehler??
    Das liegt an der internen Abbildung der REAL-Werte. Aufgrund derer Darstellung im Speicher mit "Exponent" und "Mantisse" (Grundlagen Informatik) sind nur ganz bestimmte Werte möglich, aber NIE der gesamte Wertebereich mit allen Nachkommastellen. So kann man z.B. eine riesige Zahl mit Nachkommastellen bilden, aber dann keine klitzekleine Zahl hinzuaddieren... is halt so.

    Ich möchte damit nur sagen, dass der Wertebereich nie vollkommen durchgängig ist (wie z.B. beim Int: -32768...32767), sondern nur als "ca." mit Ober- und Untergrenzen angegeben werden kann.

    Zur String-Umwandlung:
    1. Bilder den String (...TO_STRING)
    2. Durchsuche ihn z.B. mit einer Schleife bis zum Komma
    3. Lesen n Nachkommastellen weiter
    4. Die gesammelten Zeichen sind dann dein Ergebnis als neuer String

  10. Folgender Benutzer sagt Danke zu trinitaucher für den nützlichen Beitrag:

    Superfly (14.05.2008)

  11. #7
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    1
    Erhielt 9 Danke für 9 Beiträge

    Standard

    Zitat Zitat von Superfly
    Wenn man nun hier REAL-Variablen verwendet und z.B. 0.1 immer aufaddiert kommt plötzlich auch ein Fehler bei der Addition zustande
    Zitat Zitat von trinitaucher Beitrag anzeigen
    Das liegt an der internen Abbildung der REAL-Werte. Aufgrund derer Darstellung im Speicher mit "Exponent" und "Mantisse" (Grundlagen Informatik) sind nur ganz bestimmte Werte möglich, aber NIE der gesamte Wertebereich mit allen Nachkommastellen. So kann man z.B. eine riesige Zahl mit Nachkommastellen bilden, aber dann keine klitzekleine Zahl hinzuaddieren... is halt so.

    Also ich bin zwar kein Informatiker, aber 4.3 + 0.1 ergibt bei mir auch nach der Umwandlung in String noch '4.4'. Wenn dem nicht so wäre, würde mir das ganz schön zu denken geben...
    Code:
    LD	4.3
    ADD	0.1
    ST	TestReal
    REAL_TO_STRING
    ST	TestString   (*--> TestString = '4.4'*)
    Viele Grüße
    MTec
    Software-Programmierung ist das Rennen zwischen Programmierern,
    die immer größere, idiotensichere Programme zu entwickeln versuchen
    und dem Universum, das immer größere Idioten entwickelt.

  12. Folgender Benutzer sagt Danke zu MTec für den nützlichen Beitrag:

    Superfly (14.05.2008)

  13. #8
    Superfly ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.05.2008
    Beiträge
    11
    Danke
    13
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von MTec Beitrag anzeigen
    Also ich bin zwar kein Informatiker, aber 4.3 + 0.1 ergibt bei mir auch nach der Umwandlung in String noch '4.4'. Wenn dem nicht so wäre, würde mir das ganz schön zu denken geben...
    Bei der Funktion
    Code:
     Real:=Real+0.1
    habe ich aber nicht wie anzunehmen 0.8 sondern 0.8000001 die Zahlen vorher sind korrekt?? Wenn man nun die Task ablaufen läst sind fast immer vier Nachkommastellen vorhanden!!

    Das sollte so nicht sein! Ein Rechner der nicht rechnen kann??

  14. #9
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    1
    Erhielt 9 Danke für 9 Beiträge

    Standard

    Man lernt doch nie aus. Jetzt kann ich Dein "REAL"-Problem und das Posting von trinitaucher auch nachvollziehen.

    Wie wäre es wenn Du generell in ganzen Zahlen rechnest und nur zur Ausgabe des Strings die Kommastelle einfügst?
    Code:
    	
    LD	RealDemo
    ADD	1.0
    ST	RealDemo
    
    LD	RealDemo
    DIV	10.0
    REAL_TO_STRING
    ST	StringDemo
    Software-Programmierung ist das Rennen zwischen Programmierern,
    die immer größere, idiotensichere Programme zu entwickeln versuchen
    und dem Universum, das immer größere Idioten entwickelt.

  15. Folgender Benutzer sagt Danke zu MTec für den nützlichen Beitrag:

    Superfly (14.05.2008)

  16. #10
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    0.1 = 1/10 ist im Zweiersystem eine nicht abbrechende Dezimalzahl: 0,000011001100110011....
    Da die Länge der Mantisse begrenzt ist, kann 0.1 einfach nicht exakt dargestellt werden, genauso wenig wie 1/3 oder 1/7 im Zehnersystem.

  17. Folgende 2 Benutzer sagen Danke zu Zottel für den nützlichen Beitrag:

    M_o_t (31.05.2008),Superfly (14.05.2008)

Ähnliche Themen

  1. Probleme mit Scl funktion Replace
    Von RMLIF im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 23.01.2011, 07:37
  2. Funktion
    Von Placidjam im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 07.05.2009, 15:26
  3. SCL MID Funktion
    Von Uli_87 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 24.02.2009, 10:32
  4. SCL & Funktion
    Von Felse im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 24.02.2009, 10:07
  5. Funktion
    Von isensa im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 26.07.2006, 18:07

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •