[NEWSboard IBMi Forum]

Thema: Eval (r)

  1. #1
    Registriert seit
    May 2002
    Beiträge
    1.121

    Eval (r)

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    May 2002
    Beiträge
    1.121
    Danke!

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

    Gruß
    Ronald

  4. #4
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    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

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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);
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    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

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Ü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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Vielen Dank für die Erklärungen. Ich werde eval(r) demnächst mal einsetzen.

    Dieter

Similar Threads

  1. Sonderzeichen umsetzen in RPG/IV
    By dinie in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 22-06-11, 10:57
  2. InfoPrintServer ändern Empfänger
    By Jenne in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 24-11-09, 13:58
  3. Rpg-Free-Format // Anfänger fragen (braucht man noch eval? usw.)
    By kr1s in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 08-08-06, 14:16
  4. VARPG - Excel starten
    By Spoldo in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 19-04-05, 15:32
  5. RPG: Variablen Inhalt "ab584" in "AB584" wandeln??
    By JonnyRico in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 03-04-03, 10:48

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •