Lade...
 

Arithmetik

Arithmetik

Die folgenden Übersichten zeigen die mathematischen Operatoren und die Operanden mit denen eine Zahl verknüpft werden kann. Einige Operationen werden vielleicht den einen oder anderen erstaunen, da sie nicht unbedingt strengen mathematischen Regeln entsprechen. Wir glauben aber, dass die in InstantView® getroffenen Vereinbarungen im Umgang mit kaufmännischen Rechnen pragmatisch sind:

Beispiel für unsere Regel: 10€ +10% = 11€ -> entspricht 10€ + 10% von 10€
30 Stück + 10% pro 3 Stück = 60 Stück

Das Hauptproblem entsteht dabei durch die parallele Verwendung von Zahlen mit und ohne Einheiten. Um die Operationen zwischen verschiedenen Zahlobjekttypen zu ermöglichen, wurden die Prioritätsregeln entwickelt. Dabei gelten folgende Regeln:

  1. Der Datentyp des zurück gelieferten Ergebnisses wird durch den Operanden mit der höchsten Priorität bestimmt.

    Hiervon gibt es folgende Ausnahmen:

    1. Die Operatoren (+=|-=|*=|/=) verändern nie den Typ des ersten Operanden.
    2. (CX_VALUE|CX_VALUE_PER) (*|/) (CX_VALUE|CX_VALUE_PER) liefert immer ein CX_VALUE.
      Beispiel: CX_VALUE_PER(10€ / 3m) * CX_VALUE(6m) = CX_VALUE(20€)
  2. Die Addition und Multiplikation sind grundsätzlich kommutativ, also gilt X + Y = Y + X und X * Y = Y * X.

    Hiervon gibt es folgende Ausnahmen:

    1. CX_PERCENT (+|-|*|/|+=|-=|*=|/=) X ist ein Fehler für alle Typen X != CX_PERCENT.
    2. X (+|-|*|/|+=|-=|*=|/=) (STRING|ML_STRING) hat eine andere Semantik, falls der String vorne steht.
  3. CX_PERCENT(X) wird bei mathematischen Operationen als X/100 betrachtet.
    Beispiel: 20 * (20% + 30%) = 20 * (20/100 + 30/100) = 20 * (50/100) = 10

    Hiervon gibt es folgende Ausnahmen:

    1. X (+|-|+=|-=) CX_PERCENT ist (für X != CX_PERCENT) definiert als prozentualer Aufschlag/Abschlag:  X (+|-|+=|-=) (X * CX_PERCENT).
      Beispiel: 10 + 50% = 10 + (10 * 50%) = 10 + (10 * 50/100) = 10 + 5 = 15
    2. CX_PERCENT (<|>|=) X vergleicht die Prozentpunkte mit der Zahl X.
  4. Die Operation X (+=|-=|*=|/=) Y ist nur dann erlaubt, wenn X kein primitiver Typ ist und X (+|-|*|/) Y ein Ergebnis liefert, welches in den Typ X konvertierbar ist ohne Einheiten zu verlieren.
  5. Bei der Operation (CX_VALUE|CX_VALUE_PER) (+|-|+=|-=)  X, mit X ∉ {CX_VALUE, CX_VALUE_PER, CX_PERCENT} wird X automatisch um die Einheit von (CX_VALUE|CX_VALUE_PER) ergänzt.
    Beispiel: 10€ + 3 = 10€ + 3€ = 13€
  6. Bei der Operation X (+|-|*|/|+=|-=|*=|/=) (STRING|ML_STRING) wird der STRING in den Zieltyp von X importiert.
    Beispiel: 20% + "30" = 20% + 30% = 50%

 

String-Operationen:

  1. (STRING|ML_STRING) + X wandelt X in einen String um und konkateniert beide. Bei einem ML_STRING wird X in so vielen Sprachen exportiert, wie der ML_STRING Sprachen enthält und sprachenweise konkateniert.
    Beispiel: T("a","b") + CX_VALUE(1 Stück) = T("a1 Stück", "b1 pieces")
  2. ML_STRING * X wandelt X in einen String um und hängt diesen an jede Sprache an.
    Beispiel: T("a","b") * CX_VALUE(1 Stück) = T("a1 Stück", "b1 Stück")

 

höchste Priorität

CX_VALUE_PER
CX_VALUE
CX_FLOAT
CX_FRACTION
CX_NUMERIC
CX_INTEGER
CX_PERCENT

niedrigste Priorität

Die Einführung von Priorität zwischen Zahlobjekttypen optimiert auch die Übernahme von Altdaten in das ClassiX®-System. Da Altdaten häufig einheitslos sind, mussten sie ins vorher erzeugte transiente Objekte geladen und mit eine Einheit versehen werden, was einen enormen Aufwand bedeutete. Nach Einführung von Prioritätsregeln sind alle Operationen "Typ-kommutativ". Eine aus Altdaten übernommene Integer-Zahl übernimmt beispielsweise bei der Operation mit einem ClassiX®-Zahlobjekttyp dessen Typ. Dabei gilt das Kommutativgesetz bei der Addition und Multiplikation. Bei der Subtraktion und Division bedeutet es hingegen, dass die Operationen auch mit vertauschten Zahlobjekttypen möglich sind.

CX_INTEGER(x) + CX_VALUE(y) = CX_VALUE(y) + CX_INTEGER(x) = CX_VALUE(x + y)

Einheiten

Mit Einheiten wird so gerechnet wie man es aus der Physik kennt. Zu beachten ist, dass auch die leere Einheit eine Einheit ist. Es gibt somit das CX_VALUE-Objekt "0".

ClassiX® kennt eine besondere Einheit, das Fragezeichen ?. Es ist nicht als Einheit zu verstehen, sondern als Hilfseinheit. Sie hilft, folgende Rechenaufgabe zu lösen: Es sollen mehrere Werte addiert werden, die alle die gleiche Einheit haben (z.B. €). Der Startwert ist 0?. Würde "0 + 1€" gerechnet werden, käme es zu einem Fehler, da die Einheiten nicht zueinander passen. "0? + 1€" dagegen ist erlaubt. ? ist eine Hilfseinheit, die besagt: Nimm bei Addition und Subtraktion für das Ergebnis die Einheit des anderen Operanden an. Es ergibt sich "0? + 1€ = 1€" und "1€ + 0? = 1€". Bei allen anderen Rechenoperationen und Vergleichen verhält sich ? wie undimensioniert, d.h. es wird so getan, als wenn die Einheit gar nicht vorhanden wäre.

Am Ende einer Multiplikation oder Division werden die Einheiten gekürzt, d.h. aus "kg/kg" wird undimensioniert, aus "Stück * €/Stück" wird "€". ? verschwindet immer: "1 * 2? = 2", "3? * 1? = 3", "2? / 2? = 1", "5 / 1? = 5".

Überlauf

Würde bei einer arithmetischen Operation der Geltungsbereich eines Datentypen überschritten, so wird der Fehler 00-0060 ("Arithmetik-Fehler: Überlauf") geworfen.

So können in einem CX_INTEGER beispielsweise Werte zwischen - 231 und 231 - 1 stehen.

Addition

+ CX_PERCENT
50%
CX_INTEGER
50
CX_NUMERIC
50,0
CX_FRACTION
1/3
CX_FLOAT
50,0
CX_VALUE
50 €
CX_VALUE_PER
 3 € / 1 m
CX_PERCENT
30%
CX_PERCENT(3)
80%
nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1)
CX_INTEGER
30
CX_INTEGER(3.1)
45
CX_INTEGER
80
CX_NUMERIC
80
CX_FRACTION
91/3
CX_FLOAT
80,0
CX_VALUE
80 DM
CX_VALUE_PER
92 € / 3 m
CX_NUMERIC
30,0
CX_NUMERIC(3.1)
45,00
CX_NUMERIC
80,00
CX_NUMERIC
80,00
CX_FRACTION
91/3
CX_FLOAT
80,0
CX_VALUE
80 DM
CX_VALUE_PER
92 € / 3 m
CX_FRACTION
1/3
CX_FRACTION(3.1)
1/2
CX_FRACTION
151/3
CX_FRACTION
151/3
CX_FRACTION
2/3
CX_FLOAT
50,3333333
CX_VALUE
50,333333 €
CX_VALUE_PER
3,333333 € / 1 m
CX_FLOAT
30,0
CX_FLOAT(3.1)
45,0
CX_FLOAT
80,0
CX_FLOAT
80,0
CX_FLOAT
30,333333
CX_FLOAT
80,0
CX_VALUE
80 €
CX_VALUE_PER
33,333333 € /1 m

CX_VALUE
30 €

CX_VALUE(3.1)
45 €
CX_VALUE(5)
80 €
CX_VALUE(5)
80 €
CX_VALUE(5)
30,333333 €
CX_VALUE(5)
80 €
CX_VALUE
80 €
Einheitenfehler
€ <--> €⋅m
CX_VALUE_PER
2 € / 3 m
CX_VALUE_PER(3.1)
3 € / 3 m
CX_VALUE_PER(5)
152 € / 3 m
CX_VALUE_PER(5)
152 € / 3 m
CX_VALUE_PER(5)
3 € / 3 m
CX_VALUE_PER(5)
152 € / 3 m
Einheitenfehler
€ <--> €⋅m
CX_VALUE_PER
11 € / 3 m

Subtraktion

- CX_PERCENT
50%
CX_INTEGER
50
CX_NUMERIC
50,0
CX_FRACTION
1/3
CX_FLOAT
50,0
CX_VALUE
50 €/m
CX_VALUE_PER
2 € / 3 m
CX_PERCENT
30%
CX_PERCENT(3)
-20%
nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1)
CX_INTEGER
30
CX_INTEGER(3.1)
15
CX_INTEGER
-20
CX_NUMERIC
-20
CX_FRACTION
89/3
CX_FLOAT
-20,0
CX_VALUE
-20 €/m
CX_VALUE_PER
88 € / 3 m
CX_NUMERIC
30,0
CX_NUMERIC(3.1)
15,0
CX_NUMERIC
-20,0
CX_NUMERIC
-20,0
CX_FRACTION
89/3
CX_FLOAT
-20,0
CX_VALUE
-20 €/m
CX_VALUE_PER
88 € / 3 m
CX_FRACTION
1/3
CX_FRACTION(3.1)
1/6
CX_FRACTION
-149/3
CX_FRACTION
-149/3
CX_FRACTION
0
CX_FLOAT
-49,666667
CX_VALUE
-49,666667 €/m
CX_VALUE_PER
-1 € / 3 m
CX_FLOAT
30,0
CX_FLOAT(3.1)
15,0
CX_FLOAT
-20,0
CX_FLOAT
-20,0
CX_FLOAT
29,666667
CX_FLOAT
-20,0
CX_VALUE
-20 €/m
CX_VALUE_PER
88 € / 3 m
CX_VALUE
30 €
CX_VALUE(3.1)
15 €
CX_VALUE(5)
-20 €
CX_VALUE(5)
-20 €
CX_VALUE(5)
29,666667 €
CX_VALUE(5)
-20 €
Einheitenfehler
€ <--> €/m
Einheitenfehler
€ <--> €⋅m
CX_VALUE_PER
2 € / 3 m
CX_VALUE_PER(3.1)
1 € / 3 m
CX_VALUE_PER(5)
-148 € / 3 m
CX_VALUE_PER(5)
-148 € / 3 m
CX_VALUE_PER(5)
1 € / 3 m
CX_VALUE_PER(5)
-148 € / 3 m
CX_VALUE_PER
-148 € / 3 m
CX_VALUE_PER
0 € / 3 m

Multiplikation

* CX_PERCENT
50%
CX_INTEGER
50
CX_NUMERIC
50,0
CX_FRACTION
1/3
CX_FLOAT
50,0
CX_VALUE
50 m
CX_VALUE_PER
2 € / 3 m
CX_PERCENT
30%
CX_PERCENT(3)
15%
nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1)
CX_INTEGER
30
CX_INTEGER(3)
15
CX_INTEGER
1500
CX_NUMERIC
1500
CX_FRACTION
10
CX_FLOAT
1500,0
CX_VALUE
1500 m
CX_VALUE_PER
60 € / 3 m
CX_NUMERIC
30,0
CX_NUMERIC(3)
15
CX_NUMERIC
1500
CX_NUMERIC
1500
CX_FRACTION
10
CX_FLOAT
1500,0
CX_VALUE
1500 m
CX_VALUE_PER
60 € / 3 m
CX_FRACTION
1/3
CX_FRACTION(3)
1/6
CX_FRACTION
50/3
CX_FRACTION
50/3
CX_FRACTION
1/9
CX_FLOAT
16,666667
CX_VALUE
16,666667 m
CX_VALUE_PER
2 € / 9 m
CX_FLOAT
30,0
CX_FLOAT(3)
15,0
CX_FLOAT
1500,0
CX_FLOAT
1500,0
CX_FLOAT
10,0
CX_FLOAT
1500,0
CX_VALUE
1500 m
CX_VALUE_PER
60 € / 3 m
CX_VALUE
30 m
CX_VALUE(3)
15 m
CX_VALUE
1500 m
CX_VALUE
1500 m
CX_VALUE
10 m
CX_VALUE
1500 m
CX_VALUE
1500 m²
CX_VALUE(1.2)
20 €
CX_VALUE_PER
2 € / 3 m
CX_VALUE_PER(3)
1 € / 3 m
CX_VALUE_PER
100 € / 3 m
CX_VALUE_PER
100 € / 3 m
CX_VALUE_PER
2 € / 9 m
CX_VALUE_PER
100 € / 3m
CX_VALUE(1.2)
33,333333 €
CX_VALUE(1.2)
0,444444 €·€ / m²

Division

/ CX_PERCENT
50%
CX_INTEGER
50
CX_NUMERIC
50,0
CX_FRACTION
1/3
CX_FLOAT
50,0
CX_VALUE
50 m
CX_VALUE_PER
2 € / 3 m
CX_PERCENT(8)
30%
CX_PERCENT(3)
60%
nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1) nicht erlaubt(2.1)
CX_INTEGER
30
CX_INTEGER(3)
60
CX_INTEGER
0
CX_NUMERIC
0,6
CX_FRACTION
90
CX_FLOAT
0,6
CX_VALUE
0,6 1/m
CX_VALUE_PER
90 m / 2 €
CX_NUMERIC
30,0
CX_NUMERIC(3)
60
CX_NUMERIC
0,6
CX_NUMERIC
0,6
CX_FRACTION
90
CX_FLOAT
0,6
CX_VALUE
0,6 1/m
CX_VALUE_PER
90 m / 2 €
CX_FRACTION
1/3
CX_FRACTION(3)
2/3
CX_FRACTION
1/150
CX_FRACTION
1/150
CX_FRACTION
1
CX_FLOAT
0,006667
CX_VALUE
0,006667 1 / m
CX_VALUE_PER
3 m / 6 €
CX_FLOAT
30,0
CX_FLOAT(3)
60,0
CX_FLOAT
0,6
CX_FLOAT
0,6
CX_FLOAT
90,0
CX_FLOAT
0,6
CX_VALUE
0,6 1/m
CX_VALUE_PER
90m / 2 €
CX_VALUE
30,0 m
CX_VALUE(3)
60 m
CX_VALUE
0,6 m
CX_VALUE
0,6 m
CX_VALUE
90 m
CX_VALUE
0,6 m
CX_VALUE
0,6
CX_VALUE(1.2)
45 m² / €
CX_VALUE_PER
2 € / 3 m
CX_VALUE_PER(3)
4 € / 3 m
CX_VALUE_PER
2 € / 150 m
CX_VALUE_PER
2 € / 150 m
CX_VALUE_PER
6 €/ 3 m
CX_VALUE_PER
2 € / 150 m
CX_VALUE(1.2)
0,013333 € / m²
CX_VALUE(1.2)
1,000000