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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Nachkommastellen vergleichen, bei jeder Vorkomma stelle...

  1. #1
    Registriert seit
    25.02.2010
    Beiträge
    93
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich möchte gerne Eingangswerte vergleichen auf ihre Kommastelle....wobei die Vorkomma Stelle beliebig sein soll...

    d.h.


    1000.78
    1247.78 Soll im gleichen Vergleicher laufen es wird nur auf die .78 geachtet, der Rest wird weitergeleitet...


    Wie mache ich das....?

    Wenn ich ein LT oder ein LE nehme...wird ja der Komplette Werte genommen...aber ich möchte die Kommastelle vergleichen
    unterschiede soll es geben... 1000.78 gegenüber 1000.98 aber nicht bei 1200.78 gegenüber 1478.78

    Ich hoffe ich habe dies verständlich erklärt...

    *g*
    Zitieren Zitieren Nachkommastellen vergleichen, bei jeder Vorkomma stelle...  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Du könntest
    A) die Zahlen in String umwandeln, (den Dezimalpunkt suchen), die Nachkomma-Ziffern vergleichen
    B) mit TRUNC den Vorkomma-Teil ermitteln, von der Eingangszahl abziehen --> ergibt nur die Nachkommastellen. (diese Variante könnte Rundungsfehler erzeugen)
    Code:
    nachkommawert := eingangswert - INT_TO_REAL(TRUNC(eingangswert)) ;
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    Registriert seit
    25.02.2010
    Beiträge
    93
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Also das mit dem String liest nicht schlecht...

    Ich habe es jetzt so gemacht..Ich wandel den Wert von REAL zu String und könnte dann mit Left die Zeichen entfernen, die mich stören...jetzt ist das Problem das der String verkehrt ist...kann man den Umkehren?
    Also ich müsste ihn umkehren bevor ich die Zeichen abschneide...

    Oder wie meinst du das mit dem Dezimalpunkt finden.....??!?!??!

  4. #4
    Registriert seit
    25.02.2010
    Beiträge
    93
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    alles klar bin grad selbst drauf gekommen..

    Wenn es Left gibt , gibt es auch right... *g*


    manchmal...sieht man den Wald einfach nicht..

    Ich danke dir...

  5. #5
    Registriert seit
    12.04.2005
    Ort
    Black Forest
    Beiträge
    1.334
    Danke
    27
    Erhielt 129 Danke für 116 Beiträge

    Standard

    Was mir auch auf die schnelle so einfallen würde (ohne es proboert zu haben),

    Die Real in Integer wandeln und den erhaltenen Wert von der Real wieder abziehen.
    Dann sollte nur die Kommastellen über bleiben.
    Dann halt den zweiten Wert vergleichen >,< oder = usw ...

    „Eine Frage raubt mir den Verstand bin ich verrückt oder sind es die Anderen ?“

    Albert Einstein

  6. #6
    Registriert seit
    21.02.2011
    Ort
    Deutschland, Baden-Würtemberg
    Beiträge
    990
    Danke
    115
    Erhielt 125 Danke für 100 Beiträge

    Standard

    Die Real in Integer wandeln und den erhaltenen Wert von der Real wieder abziehen.
    Dann sollte nur die Kommastellen über bleiben.
    Dann halt den zweiten Wert vergleichen >,< oder = usw ...
    Hier sollte dann denke ich der Integer Wert auf- oder abgerundet werden, dadurch bekommst du auch Rundungsfehler.
    Die beste Variante ist diese mit der Umwandlung in STRING und dem Entfernen der Vorkommastellen.

    Grüße,
    Flo

  7. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Hallo,
    hier bitte erstmal überprüfen, wie die in String gewandelte Dezimalzahl aussieht. Bei Siemens würde aus 1234.56 im String "1.23456E003" werden. Das ist hier vielleicht auch so.

    Hast du immer die gleiche Anzahl von Nachkommastellen ? Wie groß werden deine Zahlen max. ?
    Vielleicht wäre es auch sinnig die Zahl * 100 (oder * 1000) in einem DINT zu wandeln und dann mit einem MOD 100 oder MOD 1000) zu arbeiten.

    Gruß
    Larry

  8. #8
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Ich glaube bei der Lösung mit TRUNC wird nicht gerundet. TRUNC schneidet ja nur den Teil hinter dem Komma (Punkt) ab. TRUNC(1.6) und TRUNC(1.4) gibt beides mal 1. Und bei der nachfolgenden Subtraktion sollte eigentlich auch nicht gerundet werden. Ich würde diese Lösung auf jedem Fall einem gebastel mit String-Funktionen vorziehen.

  9. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Diese Formel liefert rundungsfrei die ersten beiden Nachkommastellen (1234.56 ergibt 56):
    Code:
    nachkommawert := TRUNC(eingangswert * 100.0) MOD 100 ;
    EDIT: hat Larry ja auch schon geschrieben

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von MasterOhh Beitrag anzeigen
    Ich glaube bei der Lösung mit TRUNC wird nicht gerundet. TRUNC schneidet ja nur den Teil hinter dem Komma (Punkt) ab. TRUNC(1.6) und TRUNC(1.4) gibt beides mal 1.
    Richtig, bei TRUNC wird nie gerundet. Es kann höchstens passieren, daß die Ganzzahl nicht in einen DINT passt.

    Zitat Zitat von MasterOhh Beitrag anzeigen
    Und bei der nachfolgenden Subtraktion sollte eigentlich auch nicht gerundet werden.
    Dies ist ein Irrtum. Hier wird gerundet!
    Das Ergebnis einer REAL-Berechnung ist in den meisten Fällen eine "Rundung" auf den nächsten als REAL-Zahl darstellbaren Wert, weil nicht alle Zahlen als REAL-Zahl darstellbar sind.

    Zitat Zitat von MasterOhh Beitrag anzeigen
    Ich würde diese Lösung auf jedem Fall einem gebastel mit String-Funktionen vorziehen.
    Es lohnt sich, mal drüber nachzudenken. Das "Gebastel" kommt auf ein korrektes Ergebnis, die TRUNC-Lösung leider nicht immer.


    Willkürlich herausgegriffen:

    Laut Aufgabenstellung soll ein Vergleich der Nachkommastellen dieses Beispiels TRUE ergeben:
    Eingangswert_1 := 1234.56
    Eingangswert_2 := 1000.56

    Die TRUNC-Variante
    Code:
    nachkommawert := eingangswert - INT_TO_REAL(TRUNC(eingangswert)) ;
    ergibt
    nachkommawert(1234.56) = 0.5600586
    nachkommawert(1000.56) = 0.5599976
    Der Vergleich nachkommawert(Eingangswert_1) = nachkommawert(Eingangswert_2) --> ergibt FALSE !


    Diese Formel
    Code:
    nachkommawert := TRUNC(eingangswert * 100.0) MOD 100 ;
    ergibt für beide Eingangswerte nachkommawert = 56
    Der Vergleich nachkommawert(Eingangswert_1) = nachkommawert(Eingangswert_2) --> ergibt TRUE !


    Die Variante mit dem String-Gebastel vermeidet REAL-Berechnungen und kommt deshalb ebenfalls auf das korrekte Ergebnis.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  11. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    MasterOhh (30.08.2014)

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 15.08.2014, 17:58
  2. Jeder Case ein eigenes Programm
    Von Bensen83 im Forum CODESYS und IEC61131
    Antworten: 8
    Letzter Beitrag: 08.09.2011, 13:31
  3. WinCC, integer, Nachkommastellen
    Von kaputt im Forum HMI
    Antworten: 2
    Letzter Beitrag: 11.12.2010, 14:47
  4. S5 Teile jeder Art abzugeben
    Von wincc im Forum Suche - Biete
    Antworten: 0
    Letzter Beitrag: 16.11.2008, 16:52
  5. Regeln mit jeder Simatic CPU ???
    Von Anonymous im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 30.04.2004, 23:03

Lesezeichen

Berechtigungen

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