PDA

View Full Version : Eval (r)



malzusrex
11-10-13, 11:05
Hallo Gemeinde,

muss mich jetzt mal als unwissend (oder vergessend) outen.

das H in der Klammer bei dem Eval ist mir ja bekannt (Kaufmänisch runden).
Was aber ist ein R in der Klammer ?
Mir ist jetzt nähmlich ein Programm unter gekommen, wo da stand
Eval (HR)

Gruß
Ronald

Fuerchau
11-10-13, 11:10
Das R steht dafür, dass die maximale Ausprägung an Nachkommastellen für Zwischenergebnisse zu verwenden ist.

Bei einer komplexeren Formel könnte es zwischendurch vielleicht zu Integerberechnung kommen und somit das Ergebnis verfälschen.

Im RPG-handbuch ausführlich erklärt.
Es gibt dazu auch eine H-Bestimmung.

malzusrex
11-10-13, 11:23
Danke!

Solangsam rieselt der Kalk aus dem Hirn und setzt da wieder Erinnerungen frei.

Gruß
Ronald

dschroeder
11-10-13, 12:08
Ich muss mich auch outen: Der Operation Extender "R" war mir bisher nicht bekannt. Wir haben schon des öfteren Probleme mit der Rechengenauigkeit gehabt und das meistens mit Hilfe von Hilfsfeldern gelöst. Heißt dass, wenn ich den Extender R angebe, rechnet RPG genauer?

Dieter

Fuerchau
11-10-13, 12:47
In Kurzform:
Ohne R (Result) wird versucht Zwischenergebnisse ohne Überlauf zu berechnen, im Zweifel werden Nachkomma gekürzt.
Mit R werden die Nachkomma nicht gekürzt, was ggf. zu Überläufen bei Zwischenergebnissen führen kann.

Es gibt noch eval(M), wo im Zweifel bis 63-Stellige Genauigkeit (Max) verwendet wird.

Also eval(MR) oder mit Rundung eval(HMR) ist möglich.

Das Hauptproblem bei Berechnungen ist meist das Verwenden von Konstanten ohne Nachkomma oder Division mit Ganzzahlfeldern.

eval 1 / 3 => 0, da Integerdivision
eval 1,00 / 3,00 => 0,3333

Bei komplexeren Formeln kann es schon mal sinnvoll sein, Zwischenergebnisse selber mit %dech() anzupassen.

eval(h) Betrag = Betrag + %dech(Betrag * (MwSt / 100,00): 11: 2);

dschroeder
11-10-13, 13:14
Das heißt, wenn ich eval(m) benutze, habe ich das genaueste Ergebnis? Was heißt "Überläufe bei Zwischenergebnissen"? Heißt das, dass das PGM abstürzt?

Dieter

B.Hauser
11-10-13, 13:15
Das genaueste Ergebnis erhält man mit Eval(R). Die Erweiterung (M) ist der Standard!

Wenn man das Ganze global (für alle Rechenoperationen) innerhalb der Quelle setzen möchte, kann man auch einfach das Schlüssel-Wort EXPROPTS(*RESDECPOS) in den H-Bestimmungen angeben.

Auszug aus der RPG-Reference:
The EXPROPTS (expression options) keyword specifies the type of precision rules to be used for an entire program. If not specified or specified with *MAXDIGITS, the default precision rules apply. If EXPROPTS is specified, with *RESDECPOS, the "Result Decimal Position" precision rules apply and force intermediate results in expressions to have no fewer decimal positions than the result.

Note: Operation code extenders R and M are the same as EXPROPTS(*RESDECPOS) and EXPROPTS(*MAXDIGITS) respectively, but for single free-form expressions

Birgitta

Fuerchau
11-10-13, 13:21
Überlauf heißt MCH12xx!
Klar stürzt das Programm dann ab, wenn ich kein Monitor verwende.

F1 11,5
F2 11,5

F3 12,5

eval(h) F3 = F1 * F2;

Solange die Werte passen, gibts kein Problem.
Das Zwischenergebnis muss ja mit 22,10 berechnet werden und anschließend ins 12,5 passen.

F1 17,5
F2 17,5

Zwischenergebnis 34,10 geht ja nicht, also 31,7.
Bei verwendung von R wird daraus 31,10.

Wenn F1 und F2 nun *HIVAL haben, passt das Zwischenergebnis nicht, folglich MCH12xx.

Je nach Relase kann per Compileroption auf 63 Dezimale erweitert werden, dann klappts meist auch wieder ohne R.

dschroeder
11-10-13, 13:32
Vielen Dank für die Erklärungen. Ich werde eval(r) demnächst mal einsetzen.

Dieter