[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2007
    Beiträge
    122

    Bedeutung eval(rh)

    eval(r) bedeutet ja mathematische Rundung und eval(h) kaufmännische. In einigen Programmen meiner Firma habe ich Anweisungen mit eval(rh) gesehen. Wie wird hier gerundet? Erst mathematisch und dann kaufmännisch oder wie darf ich das verstehen? Vielen Dank!

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hallo,

    bist Du sicher, dass die Erweiterung (R) mathematisch runden bedeutet?

    Soweit ich weiss, wird bei der Erweiterung (R) nur sichergestellt, dass keine Dezimal-Stellen abgeschnitten werden.

    Hier ist ein Auszug aus der RPG-Referenz, was die Erweiterung (R) bedeutet:
    The ″Result Decimal Positions″ precision rule works the same as the default rule except that if the statement involves an assignment to a numeric variable or a conversion to a specific decimal precision, the number of decimal positions of any intermediate result is never reduced below the desired result decimal places.
    In practice, you don’t have to worry about the exact precisions if you examine the compile listing when coding numeric expressions. A diagnostic message indicates that decimal positions are being dropped in an intermediate result. If there is an assignment involved in the expression, you can ensure that the decimal positions are kept by using the ″Result Decimal Positions″ precision rule for the statement by coding operation code extender (R).
    Das Ergebnis wird also so genau (mit allen möglichen Dezimal-Positionen) wie möglich errechnet und anschließend kaufmännisch gerundet.

    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

  3. #3
    Registriert seit
    Jan 2007
    Beiträge
    122
    nein ich weiß es nicht.. hätt nur gedacht ich hab das irgendwo mal gelesen aber hab mich da wahrscheinlich getäuscht.

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    eval(h) ist runden (da gibts nur eine Art!) auf die Stellenzahl des Ergebnisfeldes, eleganter und leistungsfähiger ist da %dech(), da man hier die Stellenzahl angeben kann.
    eval(r) setzt denselben Würfelalgorithmus in Kraft wie die H option resdecpos und versucht bei vom Compiler erzeugten Zwischenwerten (tritt bei geschachtelten Ausdrücken auf) die Genauigkeit auf die Dezimalstellen zu verlagern und erhöht damit die Gefahr des Überlaufs und wegwerfen von gültigen Stellen vor dem Komma.

    Fazit: Finger weg von eval(h) bzw. RESDECPOS, Schachtelung von Ausdrücken nicht übertreiben und die Genauigkeit selber steuern mit deklarierten Variablen als Zwischenwerten oder %dec und wenn man mit %dech rundet, darf man den Ewald getrost vergessen.

    D*B

    Zitat Zitat von Mr.iSeries Beitrag anzeigen
    eval(r) bedeutet ja mathematische Rundung und eval(h) kaufmännische. In einigen Programmen meiner Firma habe ich Anweisungen mit eval(rh) gesehen. Wie wird hier gerundet? Erst mathematisch und dann kaufmännisch oder wie darf ich das verstehen? Vielen Dank!
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Jan 2007
    Beiträge
    122
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Hallo,

    Soweit ich weiss, wird bei der Erweiterung (R) nur sichergestellt, dass keine Dezimal-Stellen abgeschnitten werden.

    Birgitta
    ILE-RPG rechnet doch immer mit allen Dezimalstellen auch ohne Angabe von (R)oder täusche ich mich?

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    selbstverständlich geht das nicht immer:
    ergebnis = 1/7 * 3/8 erfordert die Anlage von Zwischenvariablen und 1/7 hat beliebig viele Nachkommastellen! Das heißt der Compiler legt eine entsprechende Variable an. Bei einigen Operationen (malnehmen zum Beispiel) braucht man mehr Vorkommastellen, bei anderen Nachkommastellen. Bei geschachtelten Ausdrücken reicht dann der Platz nicht mehr und der Compiler muss sich entscheiden, ob er vorne Luft lässt oder hinten...

    D*B

    Zitat Zitat von Mr.iSeries Beitrag anzeigen
    ILE-RPG rechnet doch immer mit allen Dezimalstellen auch ohne Angabe von (R)oder täusche ich mich?
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Zum Rechnen wird intern das maximum der Stellen (31/63) verwendet, um das Ergebnis zu erhalten.
    Dabei gibts ja mathematische Regeln, die die Anzahl Nachkomma bestimmen.
    Ist das Zielfeld groß genug um das Ergebnis aufzunehmen, gibts keine Probleme.
    Nur wenn Zwischenergebnisse größer als das Zielfeld bzw. 31/63 Vorkommastellen werden können, werden die Nachkommastellen reduziert !

    Mittels eval(r) wird das Abschneiden der Nachkommastellen verhindert, somit stehen weniger Vorkommastellen zur Verfügung.
    Passt nun das Zwischenergebnis nicht, gibts hier bereits einen Überlauffehler (MCH).

    Das (h) steht einfach nur für kaufmännisch runden.

    Im übrigen arbeitet %DEC (abschneiden) und %DECH (runden) genauso. Allerdings kann man dann Zwischenergebnisse per %DEC/%DECH besser beeinflussen.

    Nehme ich Dieters Beispiel nun, kann das Ergbnis ganz anders aussehen:
    ergebnis = %dec(1/7:5:5) * %dech(3/8:5:2)

    Es kommt also auf die persönlich gewünschte Genauigkeit an, die bei Einzelbefehlen (ADD/SUB/MULT/DIV) nun mal anders aussieht als bei komplexen Formeln.
    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

Similar Threads

  1. Bedeutung der Codes im LIC-Log
    By jc_denton in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 30-01-08, 07:40

Berechtigungen

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