Ansicht
Dokumentation

ABENARITH_TYPE - ARITH TYPE

ABENARITH_TYPE - ARITH TYPE

Fill RESBD Structure from EBP Component Structure   ABAP Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

- Rechentyp und Rechenregeln

Einem arithmetischen Ausdruck ist ein Rechentyp zugeordnet, der die Rechenregeln für den arithmetischen Ausdruck festlegt. Der Rechentyp wird zur Programmlaufzeit aus den dann feststellbaren beteiligten Datentypen bestimmt. Eine statische Bestimmung des Rechentyps ist nur notwendig, wenn das Zielfeld eine Inline-Deklaration ist, wobei generisch typisierte Operanden dann mit einem Standardtyp eingehen.

Bestimmung des Rechentyps

Der Rechentyp entspricht einem der numerischen Datentypen i, int8, p, f oder decfloat34. Er wird nach folgender Hierarchie bestimmt, wobei die Priorität von oben nach unten abnimmt:

  1. Ist einer der beteiligten Datentypen decfloat16 oder decfloat34, ist der Rechentypdecfloat34.
  2. Ist einer der beteiligten Datentypen f oder wenn der Operator ** verwendet wird, ist der Rechentypf.
  3. Ist einer der beteiligten Datentypen p, ist der Rechentyp p.
  4. Ist einer der beteiligten Datentypen int8, ist der Rechentyp int8.
  5. Ist einer der beteiligten Datentypen i, (b oder s), ist der Rechentyp i.

Der Rechentyp wird also durch den beteiligten Datentyp mit dem größten Wertebereich bestimmt mit den Ausnahmen, dass jede dezimale Gleitpunktzahl zum Rechentyp decfloat34 führt und dass Verwendung des Operators ** wie ein beteiligter Datentyp vom Typ f angesehen wird.

Als beteiligte Datentypen zählen:

  • bei einem arithmetischen Ausdruck als rechte Seite einer Zuweisung:
  • Falls es sich nicht um eine Inline-Deklaration DATA(var) oder FINAL(var) handelt, um die Datentypen aller Operanden des gesamten arithmetischen Ausdrucks und den Datentyp des Ergebnisfeldes result.

  • Falls es sich bei result um eine Inline-Deklaration handelt, bestimmt der Rechentyp, der sich aus den beteiligten Datentypen des arithmetischen Ausdrucks ableitet, den Datentyp der deklarierten Variable. Dabei führt ein Rechentyp p immer zum Datentyp p der Länge 8 ohne Nachkommastellen.

  • bei einem arithmetischen Ausdruck als Operand eines relationalen Ausdrucks die Datentypen aller Operanden des gesamten relationalen Ausdrucks. Es wird nicht erst der Rechentyp jedes beteiligten arithmetischen Ausdrucks und daraus der Vergleichstyp gebildet. Alle Operanden des relationalen Ausdrucks tragen unabhängig von ihrer Zugehörigkeit zu arithmetischen Ausdrücken zum Rechentyp bei, der gleichzeitig der Vergleichstyp ist.
  • bei einem arithmetischen Ausdruck hinter der Anweisung CASE die Operanden des arithmetischen Ausdrucks ohne Berücksichtigung der hinter WHEN angegebenen Operanden.
  • bei einem arithmetischen Ausdruck als Aktualparameter für Eingabeparameter von Methoden die Datentypen aller Operanden des gesamten arithmetischen Ausdrucks und die Typisierung des Formalparameters, falls dieser vollständig typisiert ist. Wenn der Formalparameter generisch typisiert ist, werden nur die Operanden des Ausdrucks ausgewertet.
  • bei einem arithmetischen Ausdruck als Argument einer eingebauten Funktion die Datentypen aller Operanden des gesamten arithmetischen Ausdrucks und der Typ des Eingabeparameters, falls dieser vollständig bestimmt ist. Eine überladene numerische Funktion, die einen arithmetischen Ausdruck als Argument enthält wirkt dagegen wie ein arithmetischer Operator und sie wird an ihrer Position wie ein arithmetischer Ausdruck behandelt.
  • bei einem arithmetischen Ausdruck als Argument in einem Konstruktorausdruck wird der Rechentyp wie bei einer Zuweisung bestimmt. Die linke Seite der Zuweisung ist entweder das Resultat des Konstruktorausdrucks mit dem vor den Klammern angegebenen Typ type oder eine Strukturkomponente.

Bei Operanden mit vollständigem numerischem Datentyp wird dieser verwendet. Operanden anderer Datentypen werden wie folgt betrachtet:

  • d und t wie i
  • c, n und string wie p
  • x und xstring wie i
  • utclong ist nicht erlaubt

Bei Operanden, die nicht als Datenobjekte angegeben sind, wird der Typ wie folgt bestimmt:

  • Bei Operanden, die als nicht-überladene eingebaute Funktionen angegeben sind, gilt der Datentyp des Rückgabewerts.
  • Bei Verwendung einer Gleitpunktfunktion ist der Rechentyp wie dort beschrieben entweder decfloat34 oder f.
  • Bei Operanden, die als Konstruktorausdrücke angegeben sind, gilt der dort durch type spezifizierte Datentyp. Der arithmetische Ausdruck selbst bestimmt aber nicht den Typ des Konstruktorausdrucks. Wenn Konstruktorausdrücke als Operanden von arithmetischen Ausdrücken verwendet werden, kann das Zeichen # nur dann für den Datentyp des Konstruktorausdrucks angegeben werden, wenn der Typ aus dem Konstruktorausdruck selbst bestimmt werden kann.
  • Bei Operanden die als Tabellenausdrücke angegeben sind, gilt der Datentyp des Resultats.
  • Wenn Operanden als generisch typisierte Feldsymbole oder Formalparameter angegeben sind und eine vorhandene Variable als Zielfeld einer Zuweisung verwendet wird, tragen diese mit dem Datentyp zum Rechentyp bei, der ihnen zur Laufzeit zugewiesen ist.
  • Wenn Operanden als generisch typisierte Feldsymbole oder Formalparameter angegeben sind und eine Inline-Deklaration DATA(var) oder FINAL(var) als Zielfeld einer Zuweisung verwendet wird, tragen die generischen Typen wie folgt zum statisch erkennbaren Rechentyp bei, aus dem der Datentyp der Deklaration bestimmt wird:
  • any, data, simple, numeric und decfloat wie decfloat34

  • csequence, clike, c, n, and p and f. Gibt es keinen beteiligten Typ höherer Priorität wird für die Deklaration der Typ p der Länge 8 ohne Nachkommastellen verwendet.

  • xsequence und x wie i

Der zur Laufzeit aus allen Operanden inklusive Zielfeld ermittelte Rechentyp entspricht immer dem Datentyp der inline deklarierten Variable, da dieser immer der Datentyp mit dem größten Wertebereich ist.

Hinweise

  • Die Bestimmung eines Rechentyps vor der Ausführung der Berechnung und unter Berücksichtigung aller Operanden inklusive des Ergebnisfeldes (bei einem arithmetischen Ausdruck als rechte Seite einer Zuweisung oder als Aktualparameter) ist eine Eigenschaft von ABAP, die sich von der Art wie andere Programmiersprachen Berechnungen ausführen, stark unterscheidet. Um unnötige Konvertierungen zu vermeiden, sollten alle Operanden und ein Ergebnisfeld möglichst den gleichen numerischen Datentyp haben.
  • Beim Rechentyp f muss darauf geachtet werden, dass die Genauigkeit nur gut 15 Stellen beträgt und dass ganze Zahlen nur bis zum Absolutwert von 2**53 entsprechend 9.007.199.254.740.992 exakt dargestellt werden. Andere Zwischenergebnisse werden gerundet. Dies ist insbesondere auch bei der Verwendung des Operators ** zu beachten, der zum Rechentyp f führt, wenn keine dezimale Gleitpunktzahl beteiligt ist.
  • Um zu umgehen, dass der Operator ** zum Rechentyp f führt, kann bei ganzzahligen Exponenten die eingebaute Funktion ipow verwendet werden, bei welcher der Rechentyp durch das Argument bestimmt wird.
  • Der Zeitstempeltyp utclong kann nicht implizit in einen numerischen Typ konvertiert werden und deshalb nicht direkt als Operand eines arithmetischen Ausdrucks angegeben werden.
  • Mit dem Konvertierungsoperator CONV können Teile von arithmetischen Ausdrücken gezielt in andere Typen konvertiert und damit der Rechentyp beeinflusst werden.
  • Dass ein Rechentyp p bei Zuweisungen an eine Inline-Deklaration zum Datentyp p der Länge 8 ohne Nachkommastellen führt kann zu überraschenden Ergebnissen und auch zu Ausnahmen führen. Es empfiehlt sich, beim Rechentyp p entweder auf Inline-Deklarationen zu verzichten, oder den Datentyp durch Anwendung des Konvertierungsoperators CONV auf den arithmetischen Ausdruck zu bestimmen.

Beispiel

Der Rechentyp des folgenden arithmetischen Ausdrucks ist f. Entsprechend wird bei der Inline-Deklaration ein Datenobjekt vom Typ f deklariert.

Rechenregeln für Rechentyp

Vor Ausführung der Berechnung werden alle Operanden, für die dies notwendig ist, gemäß den Konvertierungsregeln für elementare Datentypen in den Rechentyp konvertiert.

Der Rechentyp bestimmt die Rechenmethode und die Rechengenauigkeit:

  • Rechentypen i und int8
Der arithmetische Ausdruck wird mit einer Ganzzahlarithmetik berechnet, bei der jedes nicht-ganzzahlige Zwischenergebnis (nach einer Division) kaufmännisch auf eine ganze Zahl gerundet wird. Jedes Zwischenergebnis muss im Wertebereich des Datentyps i bzw. int8 liegen, ansonsten kommt es zur behandelbaren Ausnahme CX_SY_ARITHMETIC_OVERFLOW.
  • Rechentyp p
Festpunktarithmetik. Der arithmetische Ausdruck wird mit einer internen Genauigkeit von 31 Stellen und einer speziellen dezimalen Gleitpunktarithmetik für Zwischenergebnisse berechnet. Während der Berechnung ist der Dezimalpunkt von Zahlen vom Typ p nicht fixiert. Falls ein Überlauf auftritt, weil ein Zwischenergebnis größer als 10^31 - 1 ist, wird der ganze Ausdruck nochmals mit einer internen Genauigkeit von 63 Stellen bzw. einem maximalen Wert von 10^63 - 1 für Zwischenergebnisse berechnet. Falls erneut ein Überlauf auftritt, kommt es zur behandelbaren Ausnahme CX_SY_ARITHMETIC_OVERFLOW. Ein Überlauf tritt immer dann auf, wenn die Genauigkeit nicht für alle Vorkommastellen vor dem Dezimaltrennzeichen ausreicht. Überzählige Nachkommastellen erzeugen keine Ausnahme, sondern werden für jedes Zwischenergebnis kaufmännisch gerundet.
  • Rechentyp f
Der arithmetische Ausdruck wird mit der binären Gleitpunktarithmetik der aktuellen Plattform berechnet. Jedes Zwischenergebnis muss im Wertebereich des Datentyps f liegen, ansonsten kommt es zur behandelbaren Ausnahme CX_SY_ARITHMETIC_OVERFLOW. Da die Nachkommastellen einer Gleitpunktzahl intern durch Dualbrüche dargestellt werden, gibt es nicht zu jeder im Dezimalsystem darstellbaren Zahl eine exakte Entsprechung, wodurch es in den Zwischenergebnissen zu Rundungsfehlern kommen kann.
  • Rechentyp decfloat34
Der arithmetische Ausdruck wird mit dezimaler Gleitpunktarithmetik nach der Norm IEEE-754-2008 berechnet mit der Abweichung, dass eine Division durch 0 wie bei allen Rechentypen nicht zu einer Ausnahme führt, wenn der Dividend 0 ist. Jedes Zwischenergebnis muss im Wertebereich des Datentyps decfloat34 liegen, ansonsten kommt es zur behandelbaren Ausnahme CX_SY_ARITHMETIC_OVERFLOW. Zwischenergebnisse werden bei Bedarf kaufmännisch gerundet. Die Skalierung jedes Zwischenergebnisses wird so bestimmt, dass bei einem ungenauen Ergebnis der kleinstmögliche Exponent gewählt wird und dass er bei einem genauen Ergebnis wie folgt bestimmt wird:
  • Bei der Addition und der Subtraktion ist der Exponent des Ergebnisses der kleinere der Exponenten der beiden Operanden.

  • Bei der Multiplikation ist der Exponent des Ergebnisses die Summe der Exponenten der beiden Operanden.

  • Bei der Division ist der Exponent des Ergebnisses die Differenz zwischen den Exponenten von Dividend und Divisor.

  • Bei Anwendung der Funktion sqrt ist der Exponent der ganzzahlige Anteil der Hälfte des Exponenten des Operanden.

Hinweis

Die kaufmännische Rundung von Zwischenergebnissen bei den Rechentypen i, int8, p und decfloat34 ist eine Eigenart von ABAP, die sich stark von anderen Programmiersprachen unterscheidet, wo die Nachkommastellen häufig nicht gerundet sondern abgeschnitten werden. Dies kann insbesondere bei Divisionen mit dem Rechentyp i zu unterschiedlichen Ergebnissen führen.

Beispiel

Das Ergebnis des ersten arithmetischen Ausdrucks ist 0. Der Rechentyp ist i und die Zwischenergebnisse jeder Division werden auf 0 gerundet. Das Ergebnis des zweiten arithmetischen Ausdrucks ist 0.9999999999999999999999999999999999. Der Rechentyp ist decfloat34 und die Zwischenergebnisse 0.3333333333333333333333333333333333 werden nicht gerundet. Der äußere Konvertierungsoperator CONV erzeugt daraus die Integerzahl 1.

Behandlung des Ergebnisses

Nach Ausführung der Berechnung wird das Ergebnis des arithmetischen Ausdrucks wie folgt behandelt:

  • Bei einem arithmetischen Ausdruck als rechte Seite einer Zuweisung an ein vorhandenes Datenobjekt wird das Ergebnis in den Datentyp des Ergebnisfeldes konvertiert, falls der Rechentyp von diesem abweicht.
  • Bei einem arithmetischen Ausdruck als rechte Seite einer Zuweisung an eine Inline-Deklaration DATA(var) oder FINAL(var) bestimmt der statisch erkennbare Rechentyp den Datentyp der Variablen var, wobei generisch typisierte Feldsymbole und Formalparameter mit dem oben beschriebenen Standardtyp eingehen. Beim Rechentyp p ist der Datentyp der deklarierten Variable immer p der Länge 8 ohne Nachkommastellen.
  • Bei einem arithmetischen Ausdruck als Operand eines relationalen Ausdrucks findet keine Konvertierung statt, da Rechen- und Vergleichstyp identisch sind.
  • Bei einem arithmetischen Ausdruck als Aktualparameter für Eingabewerte von Methoden wird das Ergebnis bei vollständiger Typisierung des Formalparameters beim statischen Methodenaufruf bei Bedarf in dessen Typ konvertiert und übergeben. Bei generischer Typisierung des Formalparameters übernimmt dieser den Rechentyp, wobei beim Rechentyp p die Anzahl der Nachkommastellen aus der bei der Berechnung benötigten Genauigkeit bestimmt wird.

Beispiel

Der Rechentyp f des folgenden arithmetischen Ausdrucks wird nach string konvertiert, wobei der Wert in wissenschaftlicher Notation aufbereitet wird. Der Textstring enthält nach der Zuweisung die Zeichenkette 1.0240000000000000E+03.






ABAP Short Reference   PERFORM Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 22361 Date: 20240523 Time: 171722     sap01-206 ( 333 ms )