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:
- Der Datentyp des zurück gelieferten Ergebnisses wird durch den Operanden mit der höchsten Priorität bestimmt.
Hiervon gibt es folgende Ausnahmen:
- Die Addition und Multiplikation sind grundsätzlich kommutativ, also gilt X + Y = Y + X und X * Y = Y * X.
Hiervon gibt es folgende Ausnahmen:
- 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:
- 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.
- 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€ - Bei der Operation X (+|-|*|/|+=|-=|*=|/=) (STRING|ML_STRING) wird der STRING in den Zieltyp von X importiert.
Beispiel: 20% + "30" = 20% + 30% = 50%
String-Operationen:
- (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") - 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 |
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 |