dark

JSR-385 hätte Mars Orbiter retten können

Avatar

1999 verlor die NASA den Mars-Climate-Orbiter im Wert von 125 Millionen US-Dollar, als er in die Umlaufbahn eintrat. Aufgrund einer Diskrepanz zwischen US-Customary und SI-Maßeinheiten in unterschiedlichen Teilsystemen kam das Raumschiff dem Planeten zu nahe, passierte die obere Atmosphäre und zerfiel. Dies war nicht der einzige Fall, in dem eine fehlerhafte Umrechnung zwischen Maßeinheiten katastrophale Folgen hatte, aber es war sicherlich einer der spektakulärsten und kostspieligsten.

Immer wieder Unglücksfälle wegen Rechenfehler

  • Patriot Missile: Hier war die Ursache eine ungenaue Berechnung der Zeit, die seit dem Start verstrichen ist, auf Grund von Arithmetik-Fehler im Computersystem.
  • Ariane 5 Explosion: Es wurde eine Fließkommazahl umgewandelt, welche danach einen größeren Wert hatte, als durch den verfügbaren 16-Bit-signed Integer-Wert speicherbar gewesen ist.
  • Beinahe Absturz einer US-Verkehrsmaschine auf dem Flug zwischen den USA und Kanada, in der Gegend der Großen Seen und Großraum Chicago. Hier wurden beim Betanken der Maschine die Volumeneinheiten US-Gallone und Britischer Gallone für Flüssigkeit und Treibstoffe verwechselt, was die tatsächlich verfügbare Menge an Kerosin erheblich reduzierte und dazu führte, dass die Maschine in der Warteschleife beim Landeanflug ohne ausreichend Treibstoff endete.
  • Zahlreiche manchmal auch tödliche Fehldosierungen von Medikamenten.

Das Maß einer körperlichen Quantität ist der Prozess des Schätzens des Verhältnisses seiner Größe zu einer anderen Quantität der gleichen Art, die wir als Einheit gegeben annehmen. Zum Beispiel 5 Meter ist eine Schätzung der Länge eines Gegenstandes im Verhältnis zu einer anderen Länge – das Messinstrument, das wir in diesem Beispielfall als die Standardmaßeinheit der Länge annehmen. Eine ähnliche Annäherung kann für finanzielle Quantitäten angenommen werden und voraussetzen, dass eine Währungseinheit richtig und allgemein gültig definiert wird.

Die Maßbezeichnung wird auch in einer loseren Art und Weise verwendet, um sich auf jeden möglichen Prozess des Zuweisens von Zahlen zu beziehen, um etwa die Richtung des Grads in einem Wesen darzustellen. Beispielsweise kennzeichnet die Mohs-Skala von Mineralhärten den Kratzerwiderstand der verschiedenen Mineralien durch die Fähigkeit eines härteren Materials, ein weicheres Material zu zerkratzen. Diese Skala gibt an, dass Quarz härter ist als Calcit, sagt aber nicht aus, um wie viel härter es ist. Es ist eine etwas willkürliche, ausschließliche Ordnungsskala. Die Quantitäten, die durch solche Skalen ausgedrückt werden, sind vergleichbar, jedoch nicht additiv. Eine Quantität kann auch von einem Zählimpuls festgestellt werden.

Ein Maß ist eine reale Zahl und ist nie wirklich genau, während eine Anzahl (Quantität) eine natürliche Zahl ist und genau sein kann. So können wir beispielsweise feststellen, dass sich genau 12 Eier in einem Karton befinden, indem man sie zählt. Das letzte gebrachte Beispiel birgt auch noch weitere meist regionale Besonderheiten. So werden bestimmte Anzahlen historisch bedingt gerne auch mit Synonymen verbunden bzw. durch solche oft ersetzt. Die Zahl 12 wird in der Regel als ein Dutzend bezeichnet. Auch Vielfache davon (2, 3, … Dutzend) oder Teile davon wie etwa ein halbes Dutzend werden nicht nur umgangssprachlich, sondern auch bis heute in vielen Geschäftsbereichen verwendet. Auch die Maß (Bier) oder andere damit vergleichbare Einheiten, etwa das im britischen Raum und Einflussbereich verwendete Pint (und dessen Teile und Vielfache) sind populäre Beispiele. Während beispielsweise das Pint oder die Maß Bier sehr wohl im Sinn von Einheiten zu verstehen sind, kann eine Anzahl wie ein Dutzend genauso gut auch als Präfix, sprich als Multiplikator, zu verstehen sein und gebraucht werden. Und nicht nur in britischen Pubs, sondern auch in Münchner Biergärten und anderswo auf der Welt ist ein Dutzend Maß oder “a dozen pints“ ein nicht wirklich so seltener Auftrag. Auf Präfix bzw. Multiplikator kommen wir in der Folge noch etwas genauer zu sprechen.

Begriffe

Die Java-Klassen, die in der JSR-385-Spezifikation definiert werden, sind nicht nur auf Wissenschaft, Physik oder Mathematik allein beschränkt. Infolgedessen sollten die Bezeichnungen Quantität und die Maßeinheit in ihrer allgemeinen Begrifflichkeit angenommen werden, wie in der körperlichen Quantität oder in der körperlichen Maßeinheit, falls nicht anders angegeben. Diese Verallgemeinerung trifft zu, selbst wenn das Units-of-Measurement-API ursprünglich mit wissenschaftlichen oder physikalischen Quantitäten als primäres Ziel entworfen wurde. Die Bezeichnungen und Begriffe, die in der Spezifikation verwendet werden, sind:

  • Dimension – Dimension ist einer der grundlegenden Aspekte von Quantitäten, einschließlich Länge, Masse, Zeit oder Kombinationen davon. Der Begriff des Maßes drückt eine Eigenschaft ohne irgendein Konzept der Größe aus. So können wir über Länge ohne irgendeine Implikation sprechen.
  • Quantity (Quantität) – Jedwede Art quantitativer Eigenschaften oder Attribute einer Sache. Masse, Zeit, Abstand, Hitze, Längen- oder Breitengrad gehören zu den vertrauten Beispielen der quantitativen Eigenschaften.
    • Es ist keine Maßeinheit erforderlich, um eine Quantität auszudrücken, noch benötigt man eine bestimmte Arithmetik um dies zu tun. Alice kann die Masse ihrer Schuhe quantitativ bestimmen, indem sie diese in die Hand nimmt. Alice kann die Masse ihres linken Schuhs und die Masse ihres rechten Schuhs hinzufügen, indem sie sie beide in die Schale einer Waage legt. Quantitäten können messbar oder auch dimensionslos sein: die Zahl der Schuhe von Alice ist eine dimensionslose Quantität.
    • Maßeinheiten sind erforderlich, um messbare Quantitäten in einem Computer, auf Papier, in einem Netzwerk, Gerät usw. darzustellen.
      Zwei oder mehr dieser Spezifikation unterstellen den Gebrauch einer bestimmten Quantität nicht als Standardmaßeinheit. Daher wird in der Regel SI (System-International) verwendet, damit das Standardsystem der Maßeinheiten den meisten Anwendungsfällen gerecht wird. Laut der JSR-385-API-Spezifikation sollen 7 Quantitäten commenasurable sein, wenn sie die gleichen Maße haben, um sinnvoll miteinander verglichen werden zu können.
  • Unit (Einheit) – Eine Einheit oder Maßeinheit ist eine Größe, die als Standard mit eindeutigem Wert angenommen wird, mit deren Hilfe man ausdrücken kann. Maßeinheiten derselben Art können als Vergleichswert genommen. So entspricht beispielsweise ein Fuß (ft.) einer Quantität von 0,3048 Metern. Ungeachtet dessen, wie diese zu Stande kam, kann eine Maßeinheit als Quantität anderer Maßeinheiten der gleichen Art ausgedrückt werden.
    • Base-Unit (Basiseinheit bzw. Grundlegende Maßeinheit) – Basiseinheit ist eine wohl definierte Maßeinheit, die von ihrer Definition her als dimensional unabhängig von anderen grundlegenden Maßeinheiten angesehen wird. Das SI-System definiert nur 7 grundlegende Maßeinheiten (einschließlich Meter, Kilogramm und Sekunde), von denen alle weiteren SI-Maßeinheiten abgeleitet werden.
    • Derived-Unit (Abgeleitete Maßeinheit) – Derived-Unit ist eine Maßeinheit gebildet als Produkt von Ergebnissen grundlegender Maßeinheiten. Einige abgeleitete Maßeinheiten erhalten einen speziellen Namen und ein Symbol aus Komfortgründen zur einfacheren Handhabung. Im SI-System schließen abgeleitete Maßeinheiten mit speziellem Namen Hz, Newton und Volt ein.
    • System-of-Units – Ein Einheitensystem ist ein Satz grundlegender und abgeleiteter Maßeinheiten gewählt als Standards für das Spezifizieren von Maßen. Beispiele dafür sind das SI (Metrische) sowie das Imperiale (Englische) System.
    • Prefix (Präfix bzw. Multiplikator) – Ein Präfix ist ein führendes Wort, das an einer Maßeinheit angewendet werden kann, um eine dezimale Vervielfachung oder eine Verringerung der Maßeinheit zu bilden. Präfixe werden hauptsächlich im SI-System verwendet, das Kilo-, Centi-, Mili- etc. miteinschließt. Andere Kulturkreise und Regionen verwenden teilweise vom SI-System abweichende, ähnlich geartete Multiplikatorsysteme. Beispiele sind etwa die gesonderte Verwendung von Multiplikatoren wie etwa Lakh- (100.000) oder Crore- (10 Mio.) in Ländern wie Indien oder auch Teilen des Nahen Ostens. Man kann dies darauf zurückzuführen, dass unterschiedliche Währungssysteme existieren. Es lässt sich auch auf historische Zahlensysteme zurückführen, welche vom lateinischen oder arabischen Ursprung heutiger westlicher Systeme in einigen Bereichen abweichen oder in diesen in derselben Form fehlen. Dafür ist wiederum der Gebrauch anderer, wie etwa ein Dutzend, dort nahezu unbekannt.

Beispiel

Das Ergebnis des Messens der Wellenlänge einer einfarbigen Lichtquelle kann im Rahmen des SI-Systems mit folgenden Einheiten dargestellt werden:

 λ = 698,2 nm

wobei:

  • λ ist das Symbol der physikalischen Größe (Wellenlänge)
    nm ist das Symbol der physikalischen Einheit (Nanometer), worin:

    • n das Symbol des Verringerungsmultiplikators ist (Nano, was so viel bedeutet wie 10-9)
    • m das Symbol der Grundeinheit oder abgeleiteten Einheit, auf welche das Präfix anzuwenden ist.
  • 698,2 ist der numerische Wert (Magnitude) der Wellenlänge in Nanometer. Die Dimension einer Länge wird in der Regel durch den Buchstaben L in dimensionaler Analysis bezeichnet. Nichtsdestotrotz erscheint diese Dimension nicht explizit, sondern kann stattdessen aus der Größe λ oder mithilfe der Einheit m (und dem entsprechenden Multiplikator) abgeleitet werden.

Datentypen

Maßeinheit

Die Einheit javax.measure.Unit repräsentiert eine bekannte Größe, welche sich als Standard zur Messung bewährt und durchgesetzt hat. So sind beispielsweise Kilometer und Watt Einheiten, wohingegen 5 Kilometer keine Einheit darstellt (jedenfalls nicht im Rahmen des internationalen Einheitssystems). Es ist lediglich eine Abmessung.

Quantität

Ein grundlegendes Interface zur Darstellung messbarer Werte ist javax.measure.Quantity. Diese definiert und identifiziert all jene Größen, die gemessen werden können. Mittels Java-Generics können Angaben enthaltener Messwerte meist schon während des Kompilierens korrekt und ohne potenzielle Fehlerquellen gehandhabt werden. Die Quantität macht das Ergebnis eines Messvorgangs darstellbar in einer bekannten Einheit. Sie verbindet einen numerischen Wert mit einer Einheit als Ergebnis.

Einheitssysteme

Ein Einheitssystem ist ein Satz von Einheiten, welche als Standard zur Normierung von Maßeinheiten gebräuchlich und bewährt ist. Wie etwa in vorhandenen Bereichen des JDK etablierte Systeme, so z.B. der Kalender in Form des gregorianischen Kalenders so weit wie möglich und sinnvoll abgebildet wurde, enthält JSR 385 als Grundlage die Einheiten des SI-Standards sowie die wichtigsten und am meisten verwendeten Nicht-SI-Einheiten.

Andere Systeme lassen sich als Erweiterung genauso einbinden. So sind etwa bereits erwähnte lokal etablierte Einheiten oder Multiplikatoren ebenso denkbar (und teilweise in Diskussion als Teil des API selbst) wie historische Einheiten. Darunter das Dutzend oder auch so etwas, wie der Marathon – 42,195 km (26 miles 385 yards). Ein Beispiel für Distanzen, die zwar auch selbst keine Einheit darstellen, wie 5m, aber sehr wohl in bestimmten Zusammenhängen praktisch als solche betrachtet werden können. Anders als die 5 Meter mögen 11 Meter in vergleichbarem Rahmen also durchaus ihren Platz in spezialisierten APIs haben. Solche Definitionen blieben dann aber Drittherstellern und Anwendern von JSR-385 überlassen.

Hierarchie von Einheiten und Einheitssystemen (Abb. 1)

Einheiten können auf folgende Art und Weise instanziiert werden:

  • Mithilfe vordefinierter Konstanten: Der einfachste Weg dazu ist, auf Sammlungen von Konstanten zurückzugreifen, wie sie im Rahmen des JSR-385-API enthalten sind. Etwa in SystemOfUnits Implementationen wie SI. Die SI-Klasse stellt alle wichtigen Konstanten bereit, darunter etwa METRE METER (eine Basiseinheit) oder WATT (eine abgeleitete Einheit). METRE ist in ersterem Fall die britische Schreibweise, während METER in den USA und andernorts verwendet wird.
  • Durch algebraische Operationen: Einheiten können dynamisch aus anderen vorhandenen Einheiten durch algebraische Operationen errechnet werden. All diese Operationen sind Methoden der Unit-Klasse. Diese sind vergleichbar mit etwa der Number-Basisklasse des JDK oder anderer Klassen zur Verwendung durch mathematische oder sonstige Berechnungen.
    • Argumente: Alle binären Operationen erwarten Argumente vom Typ (Unit, Unit) oder (Unit, n) wobei n entweder eine ganze Zahl (Integer) oder Fließkommazahl (Float) sein muss. Beispiel: m und s seien Instanzen der Klasse Unit. So sind zulässige Operationen etwa m/s, m*s, m2 oder m*1000, wobei die verwendeten Methoden wie etwa divide(Unit), multiply(Unit) oder power(int) der Instanz m in der Unit-Klasse definiert sind.
    • Ergebnis: Alle Ergebnisse, sowohl binär als auch unär (ein Argument, d.h. im Fall von Methoden und Klassen die Klasse der Instanz selbst) sind jeweils wieder eine Instanz derselben Klasse Unit. Entweder eine neue Instanz oder eine bereits vorhandene mit entsprechendem Wert.
      • Das Ergebnis hat dieselbe Dimension wie die verwendeten Argumente. Solche Operationen dienen meist dazu, neue Einheiten durch Umrechnung aus anderen gegebenen Einheiten zu erhalten. So kann etwa ein Zoll (Inch) als 2,54 cm ausgedrückt werden oder eben der Zentimeter Einheit multipliziert mit dem Faktor 2,54.
      • Das Ergebnis hat eine andere Dimension als die verwendeten Argumente. Solche Berechnungen dienen der Ableitung neuer (abgeleiteter) Einheiten aus grundlegenden bereits vorhandenen Einheiten (zumeist Basiseinheiten). Werte einer solchen Ergebniseinheit sind in der Regel nicht wieder zurückkonvertierbar in die ursprüngliche Einheit. Ein Beispiel ist die Ableitung der Einheit Watt aus der Einheit Joule dividiert durch eine weitere Einheit.

Verwendbare, algebraische Operationen, die die Unit-Klasse zur Verfügung stellt (Abb. 2)

 

  • Durch Interpretieren des Einheitssymbols (Parsing) – Dazu wird wie auch für die Ausgabe von Einheiten ein spezieller Formatter verwendet. Die UnitFormat Implementationen sind zumeist eine Subklasse von text.Format um mit existierenden Java-Bibliotheken und -Komponenten wie etwa javax.swing.JFormattedTextField kompatibel zu sein. Wie die meisten Format-Klassen enthält die Klasse eine Anzahl statischer getInstance Factory-Methoden, welche zusammen mit dem Rest des UnitFormat-API dafür sorgen, dass dessen Benutzer Instanzen der Unit-Klasse direkt aus einer UnitFormat Instanz erstellen können. Dieser Ansatz bietet, wenn auch nicht immer zur Kompilierzeit typensicher, so doch die größtmögliche Flexibilität. Somit entspricht dieser Ansatz auch der Verwendung statischer AbstractUnit.parse(String) Convenience-Methoden. Diese Art erkennt sämtliche SI-Einheiten sowie derzeit alle US-Customary Einheiten wie zum Bispiel in (Listing 1):

(Listing 1)

Unterstützte Einheiten

Die Referenzimplementierung beinhaltet folgende Einheiten und -systeme:

  • BIPM Units (wie ISO-1000), inklusive:
    • Base units
    • Dimensionless derived units
    • Derived units with special names
  • SI prefixes from 10  -24   to 10  +24
  • Binary prefixes


BeispieleVon RI unterstützte Quantitäten und Einheiten (Abb. 3)

(Listing 2) zeigt eine einfache Umrechnung von Maßeinheiten.

(Listing 2)

In (Listing 3) sehen wir das Ergebnis einer Wärmebedarfsermittlung von Blockheizkraftwerken.

(Listing 3)

In (Listing 4) wird der Body-Mass-Index (BMI) einer Person ermittelt.

(Listing 4)

Und in (Listing 5) exemplarisch ein einfaches In-Flight Infotainment-System eines Flugzeuges, das die Zeit bis zur Landung in verschiedenen Einheitensystemen darstellen kann.

(Listing 5)

Fazit:

Primitive Datentypen sind, wie der Name schon sagt, primitiv und sollten in erster Linie der Bildung komplexerer Datentypen dienen. Typsichere Behandlung von Werten im richtigen Kontext unter Wahrung der Semantik ist wichtig für die korrekte Auswertung von Daten und speziell im Realtime- und Embedded-Umfeld, etwa Automotive u.Ä., kann sie oft sogar über Leben und Tod entscheiden, oder zumindest über den Verlust oder Erhalt von Projekt und Budget.

 

Werner Keil

Werner Keil ist Java EE Consultant, BDD und Microservice Experte bei einem führenden Internehmen im Logistik und IoT Bereich. NAch vergleichbarer Tätigkeit für Banken, Versicherungen und Unternehmen im Bereich Print und Automotive/Embedded, sowie als Agile Coach, Java Embedded und Eclipse RCP Experte bei einem Anbieter von Embedded und Realtime Systemen.

Webseite | Twitter | Xing | LinkedIn | GitHub | Email

 

Total
0
Shares
Previous Post

Kafka-Connect – Drittsysteme an Kafka anbinden

Next Post

Bessere Java-Desktop Deployments

Related Posts