PDA

View Full Version : Bedeutung eval(rh)



Mr.iSeries
03-03-09, 07:23
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!

B.Hauser
03-03-09, 07:35
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

Mr.iSeries
03-03-09, 07:41
nein ich weiß es nicht.. hätt nur gedacht ich hab das irgendwo mal gelesen aber hab mich da wahrscheinlich getäuscht.

BenderD
03-03-09, 10:04
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


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!

Mr.iSeries
04-03-09, 12:04
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?

BenderD
04-03-09, 13:04
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


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

Fuerchau
04-03-09, 13:50
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.