Ansicht
Dokumentation

ABAPCOMPUTE_ARITH - COMPUTE ARITH

ABAPCOMPUTE_ARITH - COMPUTE ARITH

BAL Application Log Documentation   rdisp/max_wprun_time - Maximum work process run time  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

Arithmetische Ausdrücke ()

Kurzreferenz



... $[+$|-$] operand1
    $[${+$|-$|*$|/$|DIV$|MOD$|**$} $[+$|-$] operand2
    $[${+$|-$|*$|/$|DIV$|MOD$|**$} $[+$|-$] operand3
    ... $]$] ...


Wirkung

Ein arithmetischer Ausdruck formuliert eine Berechnung. Das Ergebnis eines arithmetischen Ausdrucks ist ein numerischer Wert, der in dem Rechentyp vorliegt, der dem arithmetischen Ausdruck zugeordnet ist. In einem arithmetischen Ausdruck arith_exp kann ein Operand operand1 über die arithmetischen Operatoren +, -, *, /, DIV, MOD oder ** mit einem oder mehreren Operanden operand2, operand3 ... Kombiniert werden, wobei Klammerungen möglich sind. Die Berechnung basiert auf Rechenregel, die vom jeweiligen Rechentyp abhängig sind.

Arithmetische Ausdrücke können an den Lesepositionen bestimmter Anweisungen und insbesondere auf der rechten Seite einer Zuweisung mit dem Zuweisungsoperator = vorkommen. Als Operand des Lossless-Operators EXACT kann ein arithmetischer Ausdruck auf eine verlustfreie Berechnung überprüft werden.

Die Operandenpositionen operand sind allgemeine Ausdruckspositionen, d.h. es können numerische Datenobjekte, eingebaute Funktionen, funktionale Methoden oder geklammerte arithmetische Ausdrücke angegeben werden. Die arithmetischen Operatoren +, -, *, /, DIV, MOD und ** kombinieren zwei benachbarte Operanden. Bei der Auswertung des Ausdrucks wird daraus ein numerischer Wert berechnet, der mit dem nächsten benachbarten Operanden kombiniert wird. Die Priorität der Kombinierung richtet sich nach den verwendeten Operatoren.

Vor jedem Operanden können ein oder mehrere durch Leerzeichen getrennte Vorzeichen + oder - in beliebiger Reihenfolge stehen. Jedes Vorzeichen wirkt so, als sei an seiner Stelle der Ausdruck +1 * bzw. -1 * angegeben, wodurch ein Vorzeichen die gleiche Priorität wie eine Multiplikation hat.

Wenn funktionale Methoden oder zeichenartige Ausdrücke als Operanden angegeben sind, werden diese vor der Auswertung des gesamten übrigen Ausdrucks von links nach rechts und von innen nach außen ausgeführt. Die Rückgabewerte werden für die Verwendung an den entsprechenden Operandenpositionen zwischengespeichert. Zeichenartige Verarbeitungsfunktionen und Zeichenkettenausdrücke sind dabei nur als Argumente von Beschreibungsfunktionen möglich.

Hinweise

  • Es ist darauf zu achten, dass in einer angegebenen funktionalen Methode der Wert eines Datenobjekts geändert wird, das ebenfalls als Operand verwendet wird. Selbst wenn ein solcher Operand links von der funktionalen Methode steht, wird sein Wert immer vor seiner Auswertung von der Methode geändert.
  • Arithmetische Ausdrücke, Zeichenkettenausdrücke und Bit-Ausdrücke sind nicht mischbar. Eingebaute Funktionen, die als Operanden arithmetischer Ausdrücke verwendet werden, können aber Zeichenkettenausdrücke oder Bit-Ausdrücke als Argumente enthalten.
  • Ein einfacher arithmetischer Ausdruck +$|- literal, der sich aus einem Operator +$|-, Leerzeichen und einem vorzeichenlosen Zahlenliteral literal zusammensetzt, hat den gleichen Wert wie das entsprechende Zahlenliteral +$|-literal mit direkt vorangestelltem Vorzeichen. Da der Ausdruck aber als solcher behandelt und immer erst zur Laufzeit ausgewertet wird, sollte in solchen Fällen aus Gründen der Performance immer das Zahlenliteral verwendet werden.

Beispiel

Dieser Programmabschnitt berechnet den Hyperbelsinus mit der Eulerschen Formel im expliziten Rechentyp decfloat34 und mit der eingebauten Funktion sinh im impliziten Rechentyp f und gibt den Unterschied aus.

Beispiel

Folgendes Programm demonstriert die Regel, die die Auswertung von funktionalen Methoden in arithmetischen Ausdrücken bestimmt. Die erste Berechnung setzt die Variable changing auf 6 and gibt das erwartete Ergebnis 9 zurück. Das Ergebnis der zweiten Berechnung ist 15 und nicht, wie man erwarten könnte, 10. Die funktionale Methode wird zuerst aufgerufen and ihre Ergebnis 9 wird zum geänderten Wert 6 von der Variablen changing addiert und nicht zu ihrem initialen Wert 1.

Ausnahmen

Behandelbare Ausnahmen

CX_SY_ARG_OUT_OF_DOMAIN

  • Ursache: Unzulässiger Aufruf von acos
    Laufzeitfehler: COMPUTE_ACOS_DOMAIN (abfangbar)
  • Ursache: Unzulässiger Aufruf von asin
    Laufzeitfehler: COMPUTE_ASIN_DOMAIN (abfangbar)

  • Ursache: Unzulässiger Aufruf von cos
    Laufzeitfehler: COMPUTE_COS_DOMAIN (abfangbar)
  • Ursache: Unzulässiger Aufruf von log10
    Laufzeitfehler: COMPUTE_LOG10_ERROR (abfangbar)
  • Ursache: Unzulässiger Aufruf von log
    Laufzeitfehler: COMPUTE_LOG_ERROR (abfangbar)
  • Ursache: Unzulässiges Argument bei Potenzierung
    Laufzeitfehler: COMPUTE_POW_DOMAIN (abfangbar)
  • Ursache: Unzulässiger Aufruf von sin
    Laufzeitfehler: COMPUTE_SIN_DOMAIN (abfangbar)
  • Ursache: Unzulässiger Aufruf von sqrt
    Laufzeitfehler: COMPUTE_SQRT_DOMAIN (abfangbar)
  • Ursache: Unzulässiger Aufruf von tan
    Laufzeitfehler: COMPUTE_TAN_DOMAIN (abfangbar)

CX_SY_ARITHMETIC_OVERFLOW

  • Ursache: Überlauf bei arithmetischer Operation (Typ p)
    Laufzeitfehler: BCD_OVERFLOW (abfangbar)
  • Ursache: Überlauf bei arithmetischer Operation (alle Operanden Typ p)
    Laufzeitfehler: COMPUTE_BCD_OVERFLOW (abfangbar)
  • Ursache: Überlauf bei cosh
    Laufzeitfehler: COMPUTE_COSH_OVERFLOW (abfangbar)
  • Ursache: Über- oder Unterlauf bei exp
    Laufzeitfehler: COMPUTE_EXP_RANGE (abfangbar)
  • Ursache: Überlauf bei Addition (Typ decfloat)
    Laufzeitfehler: COMPUTE_DECFLOAT_ADD_OVERFLOW
  • Ursache: Überlauf bei Subtraktion (Typ decfloat)
    Laufzeitfehler: COMPUTE_DECFLOAT_SUB_OVERFLOW
  • Ursache: Überlauf bei Multiplikation (Typ decfloat)
    Laufzeitfehler: COMPUTE_DECFLOAT_MUL_OVERFLOW
  • Ursache: Überlauf bei Division (Typ decfloat)
    Laufzeitfehler: COMPUTE_DECFLOAT_DIV_OVERFLOW
  • Ursache: Überlauf bei Division (Typ decfloat)
    Laufzeitfehler: COMPUTE_DECFLOAT_DIV_OVERFLOW
  • Ursache: Überlauf bei Division (Typ f)
    Laufzeitfehler: COMPUTE_FLOAT_DIV_OVERFLOW (abfangbar)
  • Ursache: Überlauf bei Subtraktion (Typ f)
    Laufzeitfehler: COMPUTE_FLOAT_MINUS_OVERFLOW (abfangbar)
  • Ursache: Überlauf bei Addition (Typ f)
    Laufzeitfehler: COMPUTE_FLOAT_PLUS_OVERFLOW (abfangbar)
  • Ursache: Überlauf bei Multiplikation (Typ f)
    Laufzeitfehler: COMPUTE_FLOAT_TIMES_OVERFLOW (abfangbar)
  • Ursache: Überlauf bei |-2147483648|
    Laufzeitfehler: COMPUTE_INT_ABS_OVERFLOW (abfangbar)
  • Ursache: Ganzzahl-Überlauf bei Division
    Laufzeitfehler: COMPUTE_INT_DIV_OVERFLOW (abfangbar)
  • Ursache: Ganzzahl-Überlauf bei Subtraktion
    Laufzeitfehler: COMPUTE_INT_MINUS_OVERFLOW (abfangbar)
  • Ursache: Ganzzahl-Überlauf bei Addition
    Laufzeitfehler: COMPUTE_INT_PLUS_OVERFLOW (abfangbar)
  • Ursache: Ganzzahl-Überlauf bei Multiplikation
    Laufzeitfehler: COMPUTE_INT_TIMES_OVERFLOW (abfangbar)
  • Ursache: Unzulässiger Aufruf von log10
    Laufzeitfehler: COMPUTE_LOG10_ERROR (abfangbar)
  • Ursache: Unzulässiger Aufruf von log
    Laufzeitfehler: COMPUTE_LOG_ERROR (abfangbar)
  • Ursache: Über- oder Unterlauf bei Potenzierung
    Laufzeitfehler: COMPUTE_POW_RANGE (abfangbar)
  • Ursache: Überlauf bei sinh
    Laufzeitfehler: COMPUTE_SINH_OVERFLOW (abfangbar)
  • Ursache: Überlauf bei Funktion round oder rescale
    Laufzeitfehler: COMPUTE_ROUND_RESCALE_OVERFLOW

CX_SY_CONVERSION_NO_NUMBER

  • Ursache: Operand nicht als Zahl interpretierbar
    Laufzeitfehler: CONVT_NO_NUMBER (abfangbar)

CX_SY_CONVERSION_OVERFLOW

  • Ursache: Überlauf bei arithmetischer Operation (Typ p, mit spezifizierter Länge)
    Laufzeitfehler: BCD_FIELD_OVERFLOW (abfangbar)
  • Ursache: Operand zu groß oder (Zwischen-)Ergebnis zu groß
    Laufzeitfehler: CONVT_OVERFLOW (abfangbar)

CX_SY_PRECISION_LOSS

  • Ursache: Ergebnis von cos ungenau
    Laufzeitfehler: COMPUTE_COS_LOSS (abfangbar)
  • Ursache: Ergebnis von sin ungenau
    Laufzeitfehler: COMPUTE_SIN_LOSS (abfangbar)
  • Ursache: Ergebnis von tan ungenau
    Laufzeitfehler: COMPUTE_TAN_LOSS (abfangbar)

CX_SY_UNSUPPORTED_FUNCTION

  • Ursache: Unzulässige Funktion für Rechentyp decfloat34
    Laufzeitfehler: COMPUTE_UNSUPPORTED_DECF_FUNC

CX_SY_ZERODIVIDE

  • Ursache: Division durch 0 (Typ p)
    Laufzeitfehler: BCD_ZERODIVIDE (abfangbar)
  • Ursache: Division durch 0 (Typ f)
    Laufzeitfehler: COMPUTE_FLOAT_ZERODIVIDE (abfangbar)
  • Ursache: Division durch 0 (Typ i)
    Laufzeitfehler: COMPUTE_INT_ZERODIVIDE (abfangbar)
  • Ursache: Division durch 0 (Typ decfloat)
    Laufzeitfehler: COMPUTE_DECFLOAT_ZERODIVIDE


Unbehandelbare Ausnahmen

  • Ursache: p-Feld enthält kein korrektes BCD-Format
    Laufzeitfehler: BCD_BADDATA
  • Ursache: p-Feld enthält kein korrektes Vorzeichen
    Laufzeitfehler: BCD_NO_SIGN





General Material Data   ROGBILLS - Synchronize billing plans  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 18351 Date: 20240425 Time: 032235     sap01-206 ( 343 ms )