PDA

View Full Version : Rechenproblem im/mit ILE



muadeep
06-08-09, 12:03
Hallo,

wir haben V5R4

wenn ich folgende Berechnung in einem ILE Pgm mache,


D Test S 9 3

C Eval Test = ((49 / 7) / (12 / 6))dann sollte doch das Feld Test den Wert 3,5 enthalten oder?

ILE berechnet mir hier aber folgenden Wert 3,0

Hat irgend jemand eine Erklärung für mich

BenderD
06-08-09, 12:16
... works as designed: es wird Ganzzahl Arithmetrik verwendet, da die erste Berechnung rein Ganzzahlig ist und zuletzt (die Zuweisung hat die niedrigste Priorität) an eine Zahl mit drei Nachkommastellen zugewiesen, was das zuschwindeln der 0 bewirkt.
Konsequenz: nie Literale und (und in RPG auch keine Konstanten) in Rechnungen verwenden und geschachtelte Ausdrücke eher vermeiden.

D*B


Hallo,

wir haben V5R4

wenn ich folgende Berechnung in einem ILE Pgm mache,


D Test S 9 3

C Eval Test = ((49 / 7) / (12 / 6))dann sollte doch das Feld Test den Wert 3,5 enthalten oder?

ILE berechnet mir hier aber folgenden Wert 3,0

Hat irgend jemand eine Erklärung für mich

homue
06-08-09, 12:34
Hallo!

Ich hatte ein ähnliches Problem. Ich wollte in einem RPG-Programm eine Prozentzahl ermitteln und rechnete " / 100". Hierbei gab es ebenfalls Probleme mit Nachkommastellen. Ich habe mit angewöhnt bei solchen Berechnungen immer den EVAL (R) zu verwenden.

Nähere Infos findest Du im RPG-Handbuch für V5R4 (SC09-2508-06) unter "Precision Rules for Numeric Operations" ab Seite 448.

B.Hauser
06-08-09, 12:56
Hallo,

die Angabe des Schlüssel-Wortes ExprOpts(*ResDecPos) (Zwischenergebnisse haben nie weniger Dezimal-Stellen als das Endergebnis) in den H-Bestimmungen beseitigt diese Probleme.


H ExprOpts(*ResDecPos)

Birgitta

BenderD
06-08-09, 13:58
... und schafft neue, andere.
Kalkulierbares Verhalten erreicht man am einfachsten dadurch, dass man Einzelschritte mit Variablen verwendet, dann kann man klar zum Ausdruck bringen wo man die Rechengenauigkeit braucht.

D*B


Hallo,

die Angabe des Schlüssel-Wortes ExprOpts(*ResDecPos) (Zwischenergebnisse haben nie weniger Dezimal-Stellen als das Endergebnis) in den H-Bestimmungen beseitigt diese Probleme.


H ExprOpts(*ResDecPos)

Birgitta

Fuerchau
09-08-09, 11:52
Oder beim Rechnen mit konstanten die Nachkomma eben mit angibt:

Test = ((49,0 / 7,0) / (12,0 / 6,0))