Real Zahl auf Nachkommastelle runden

digga

Level-1
Beiträge
63
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

da die Suche mich nicht zum richtigen Ergebniss geführt hat frag ich hier mal nach.

Ich habe eine Real Zahl, die ich auf eine Nachkommastelle runden möchte.

Sprich aus 15,639856 --> 15,6 oder aus 15,258 --> 15,3.

Wie ich auf eine Ganzzahl runde ist mir bekannt nur weiss ich nicht wie man da im Nachkommabereich runden muss......

Kann mir da vielleicht jemand helfen?

DAnke

mfg

Digga
 
myReal2 := INT_TO_REAL(REAL_TO_INT(myReal * 100)) / 100;

//Edit: ich hatte 2 Nachkommastellen gelesen. Für eine ist es natürlich:
myReal2 := INT_TO_REAL(REAL_TO_INT(myReal * 10)) / 10;
 
Zuletzt bearbeitet:
Hallo!

Ist zwar schon alt der Thread, aber ich habe aktuell das Problem.
Ich nutze PC-WORX (Phoenix Contact) und da funktioniert der Code von @zotos nicht. Wenn ich in ST folgendes eingebe:
Code:
Ergebnis_Real := INT_TO_REAL(REAL_TO_INT(Zahl_Real * 10.0)) / 10.0;
gibt es zwischen Ergebnis_Real und Zahl_Real keinen Unterschied.
Hat jemand einen Tip?

Warum gibt es so etwas einfaches wie eine Runden-Funktion in der SPS-Welt nicht? Gibts in jeder ordentlichen Sprache...
 
... gibt es zwischen Ergebnis_Real und Zahl_Real keinen Unterschied. ...
Wie sind denn Deine Zahlen Ergebnis_Real und Zahl_Real?
Denn Real_TO_INT beinhaltet (zumindest bei S7) die Rundenfunktion.
:confused:



... Warum gibt es so etwas einfaches wie eine Runden-Funktion in der SPS-Welt nicht? Gibts in jeder ordentlichen Sprache...
Alle Rechnungen in INT oder DINT werden auf ganze Stellen gerundet.
Sollte doch an Rundenfunktionen reichen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich vermute, dass es daran liegt, dass die Phoenix den Code so nicht auflösen kann. Ich habe aktuell auch einen Anwendungsfall und werde es morgen mal ausprobieren und meine Erfahrung dann hier teilen.

MFG

Ritschi
 
Runden mit Nachkommastellen ist nicht so einfach wie die Funktion Runden() in Excel. Dort ist das Ergebnis eigentlich ein abgeschnittener String (analog zu Number.toFixed() in JavaScript). Wenn man wie im Beispiel aus Beitrag#1 15,6 in Real darstellen will, wird daraus das Hexmuster DW#16#41799999. Nach dem Bestimmen des Bias (Exponent der 2er-Potenz), wird von dessen Vielfachen 1 abgezogen und der Rest auch als 2er-Potenzen abgespeichert also Hälfte, Viertel, Achtel usw. bis 2^-23. Dadurch sind nur Vielfache solcher 2er-Potenzen wirlich genau. Wenn man das Hexmuster aus dem Beispiel wieder in eine Zahl zurückrechnet, kommt da (1+0,9499999284744263)*2^(130-127)=15,59999942779541 raus. Es ist also nahezu unmöglich Realzahlen exakt auf 1 Stelle nach dem Komma zu runden.
 
Runden mit Nachkommastellen ist nicht so einfach wie die Funktion Runden() in Excel. Dort ist das Ergebnis eigentlich ein abgeschnittener String (analog zu Number.toFixed() in JavaScript).

Ein Abgeschnittener String bei welchem die vorderste abgeschnittene Stelle überprüft wird, ob sie >=5 ist. ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wenn ich mir das folgende genau ansehe, denke ich, dass die Syntax nicht ganz stimmt


Ergebnis_Real := INT_TO_REAL(REAL_TO_INT(Zahl_Real * 10.0)) / 10.0



Versuche mal:
Ergebnis_Real := INT_TO_REAL(Real_TO_INT (Zahl_Real +10.0));
Ergebnis_Real := Ergebnis_Real / 10.0;

MfG

Ritschi
 
Habt ihr alle mal auf das Datum der Fragestellung geschaut?
Nur noch 20 Tage bis zum 10-jährigen. Sind Feierlichkeiten geplant?
Wer darf die Ehrung entgegennehmen? Der ThemenStarter oder der, der den Ablauf der 10 Jahre mit seiner Antwort am genauesten trifft?
Wer hält eigentlich bisher den Rekord, den unkaputtbarsten Thread losgetreten zu haben?
Gruss, Heinileini
 
Habe es so gelöst, dass auf eine Nachkommastelle "richtig" gerundet wird:
Code:
L     #IN
L     1.000000e+002
*R    
L     5.000000e+000
+R    
L     1.000000e+001
/R    
RND   
DTR   
L     1.000000e+001
/R    
T     #IN
 
... dass auf eine Nachkommastelle "richtig" gerundet wird...
Für "richtig" müsstest Du bei genau x,x5 noch prüfen, ob zur geraden Zahl bei der 1. Kommastelle auf- oder abgerundet werden muss. Also ob die +5 dann nicht schon wieder zuviel dazu sind.

Bei der S7-1x00 macht ROUND dies mathematisch korrekt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
..ich addiere die 5 zur zweiten Nachkommestelle, dadurch wird beim Abschneiden die erste Nachkommastelle automatisch richtig, oder?
0.05*100+5 wird zu 0.1
0.04*100+5 bleibt bei 0.0
 
..ich addiere die 5 zur zweiten Nachkommestelle, dadurch wird beim Abschneiden die erste Nachkommastelle automatisch richtig, oder?
0.05*100+5 wird zu 0.1
0.04*100+5 bleibt bei 0.0
0,05 gerundet ist 0,0 (abrunden), nicht 0,1.
0,15 gerundet ist 0,2 (aufrunden).

Wenn die zu rundende Stelle die 5 ist und keine weiteren Stellen folgen, wird in der Mathematik auf die gerade Zahl der Stelle davor gerundet.


PS:
Deine Rundung ist vom Aufwand/Nutzen völlig okay.
Ging nur um die Betonung des "richtig". Dazu fehlen halt noch ein paar Prozent.
:razz:

:ROFLMAO:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
???
Quelle bitte!
Irgendwann im Mathematikunterricht, vermutlich so 4./5. Klasse (ziemlich lange her bei mir) -> Symmetrisches Runden:
Wikipedia schrieb:
Symmetrisches Runden

Die symmetrische (oder geodätische, mathematische, unverzerrte, wissenschaftliche[SUP][3][/SUP]) Rundung ist wie folgt definiert (Formulierung angepasst):[SUP][4][/SUP]

  1. Ist die Ziffer an der ersten wegfallenden Dezimalstelle eine 0, 1, 2, 3 oder 4, so wird abgerundet.
  2. Ist die Ziffer an der ersten wegfallenden Dezimalstelle eine 5 (gefolgt von weiteren Ziffern, die nicht alle null sind), 6, 7, 8 oder eine 9, so wird aufgerundet.
  3. Ist die Ziffer an der ersten wegfallenden Dezimalstelle lediglich eine 5 (oder eine 5, auf die nur Nullen folgen), so wird derart gerundet, dass die letzte beizubehaltende Ziffer gerade wird.
Diese Art der Rundung wird in numerischer Mathematik, Ingenieurwissenschaft und Technik verwendet. Sie ist im IEEE-754-Standard für das Rechnen mit binären Gleitkommazahlen in Computern vorgesehen. In englischsprachiger Literatur heißt sie Round to Even oder Banker’s Rounding.[SUP][5][/SUP]

PS:
Und wie gesagt, ROUND arbeitet auch genau so, auch wenn die TIA-Hilfe da vielleicht etwas ungünstig formuliert ist:
F1 schrieb:
ROUND: Zahl runden

Beschreibung
Mit der Anweisung "Zahl runden" runden Sie den Wert am Eingang IN zur nächsten Ganzzahl. Die Anweisung interpretiert den Wert am Eingang IN als Gleitpunktzahl und wandelt sie in eine Ganzzahl oder eine Gleitpunktzahl um. Liegt der Eingangswert zwischen einer geraden und einer ungeraden Zahl, wird die gerade Zahl gewählt.
 
Zuletzt bearbeitet:
Mit Real ist das alles klar, aber funktioniert das auch so meinem LReal?
Da wir im Simatic-Bereich sind, gehe ich mal von TIA aus ->
F1 ist Dein Freund:
TIA-Hilfe F1 schrieb:
ROUND: Zahl runden (S7-1200, S7-1500)
...
Liegt der Eingangswert zwischen einer geraden und einer ungeraden Zahl, wird die gerade Zahl gewählt.
...
INInputGleitpunktzahlen
OUTOutputGanzzahlen, Gleitpunktzahlen
LREAL dürften auch unter die Gleitpunktzahlen fallen.
;)

1682521851499.png

😁
 
Zurück
Oben