Arithmetische Überlauf oder wie kommt nur diese Zahl zustande?

 

Manchmal testet man doch das erstellte Javaprogramm (oder in einer anderen Programmiersprache geschrieben) und stellt fest, dass die auf dem Bildschirm ausgegebenen Zahlen nicht stimmen können. Woran kann es liegen?

Ist die zu berechnende Formel korrekt?

Werden von Java/ der gewählten Programmiersprache etwa Rechengesetze mißachtet?

All diese Fragen sind abgecheckt und mit „alles ok“ beantwortet, doch die falschen Zahlen bleiben. Eine weitere Fehlerquelle könnte ein falsch verwendeter Datentyp sein – was auch in vorliegendem Programm die Ursache war.

In Java gibt es acht verschiedene primitive Datentypen und jeder hat seinen Wertebereich (in anderen Programmiersprachen können es mehr sein, aber auch hier hat jeder Datentyp seinen Wertebereich).

Datentyp Wertebereich
boolean true oder false
char 16-Bit-Unicode Zeichen bzw. (0x0000 … 0xFFFF)
byte -27 bis 27-1 bzw. (-128 … 127)
short -215 bis 215-1 bzw. (-32.768 … 32.767)
int -231 bis 231-1 bzw. (-2.147.483.648 … 2.147.483.647)
long -263 bis 263-1 bzw. (-9.223.372.036.854.775.808 … 9.223.372.036.854.775.807)
float 1,40239846E-45f … 3,40282347E+38f
double 4.94065645841246544E-324 … 1,79769131486231570E+308

Dieser muss berücksichtigt werden, denn ansonsten entsteht eben das Phänomen des arithmetische Überlaufs.

 

Was ist das eigentlich?

 

Bei der Deklaration einer Variablen wird dieser ein primtiver Datentyp zugeordnet. So weiß der Computer wieviel Speicherplatz er für diese Variable reservieren muß und damit wie groß die Zahl höchstens werden kann. Die Zahl selber wird als 2er-Komplement abgespeichert, d.h. als Bits in 0 und 1.

Kommt es nun durch eine Rechenoperation eine größere Zahl als vorher angegeben wurde entsteht aufgrund des 2er-Komplements eine negative Zahl.

 

Beispiel:

1 Byte ist darstellbar als 0000 0001

2 Byte ist darstellbar als 0000 0010

3 Byte ist darstellbar als 0000 0011

4 Byte ist darstellbar als 0000 0100

127 Byte ist darstellbar als 0111 1111 -> die vorderste Null steht für das Vorzeichen

0 entspricht einer positiver Zahl und 1 entspricht einer negativen Zahl

Addition von 1 bzw. 0000 0001 ergibt 1000 0000.

Unter Beachtung des Vorzeichenbits (1000 0000), wobei 1 einer negativen Zahl entspricht, ist nicht die positive Zahl 128 sondern die negative Zahl -128 entstanden.

 

Wie kann ich das Problem lösen?

Es gibt zwei Möglichkeiten.

  1. Begrenzung der möglichen Eingaben
  2. Ändern des genutzen primitiven Datentyps in einen höherwertigen

 

 

Wenn noch Fragen sind, schreibt sie in die Kommentare.

 

Bis demnächst,

Sperling

Wann ist ein MOOC ein MOOC? oder ein Fazit zur 1. Woche MOOC

Die erste MOOC-Woche ist vorbei. Uns wurden zahlreiche Impulsbeiträge gegeben und am Ende der Woche gab es eine Live-Session in Form eines Hangout on Air.

Als kollaborative Aufgabe konnte eine Matrix ausgefüllt werden und wer zusätzliche Literatur benötigte bekam hierzu noch ein paar Links.  Soviel Input, dass sich für mich zeigt, dass es zeitlich ziemlich schwierig ist, außer diesen Inputs noch zusätzlich Beiträge, sei es in Twitter, auf Blogs, in Google+ oder anderen gewählten Medien, zu verfolgen.

Mein erstes Fazit: Prioritäten setzen, aggregate. Sehr gut, dass uns bereits angeraten wurde unsere Ziele vorher zu formulieren.

Sehr interessant das Pamphlet von Jasmin Hammadeh , welches ein pro/contra MOOCs aufzeigt. Auf der pro-Seite wird der cMOOC herausgestellt: offene Zugänge, selbstgesteuertes Lernen, freiwilliges publizieren. Die contra-Seite sieht einen MOOC nicht als effiziente Lernform. Die Struktur fehlt, sowie die Unterstützung für die Newbies. So ein vorstrukturierter MOOC, bei dem Wissen erworben wird, wird als xMOOC bezeichnet. Ich bin gespannt welche Form sich am Ende heraus kristallisiert oder ob eine Mischform die effektivste ist. Wobei m.E. je nach Themengebiet und Lernportfolio der Lerner unterschieden werden muss.

Das Video von Hannes Klöpper zeigt zunächst einen chronlogischen Abriß über die Entstehung der MOOCSs. Die 4 Erfolgsfaktoren  für MOOCs sieht er

in der neuartigen Nutzung von Videos, d.h. keine abgefilmten Vorträge sondern thematische Videos die zeigen wie es geht,

dem zeitnahen instant Feedback,

der sozialen Interaktion durch Foren und

dem event-charakter als Motivation durch Zeitdruck.

Diese Erfolgsfaktoren zeigen sich bei MOOCs die einen festen Kurscharakter haben und somit xMOOCs sind.

Der Eröffnungspost von Claudia Bremer ist in einem ganzen Blog verpackt, der den MMC13 begleitet. Sie empfiehlt sich auf den Beitrag zur Begrifflichkeit und der Kategorie zu beschränken. Der Kurscharakter zeichnet sich in xMOOCs als Frontalunterricht aus, während die cMOOCs seminarcharakter aufweisen. Dies hatte ich in meinem vorherigen Beitrag als „Diskussionsplattform zum Lernen durch Thesen“ bezeichnet. Frau Bremer berücksichtig MOOC-Hasen und MOOC-Einsteiger und versucht mit ihrem Input beide Gruppen auf einen Wissenstand zu bringen. Interessant  die MOOCs in verschiedene Kategorien  zu unterteilen bezüglich Lernzielvorgabe, der Taktung, der Betreuung, der genutzen Medien und des Angebots von Zertifikaten.

Für mich stellt sich hier zum einen die Frage nach der Finanzierung solcher MOOCs, zum anderen aber auch den Grad der Betreuung, der bei MOOC-Einsteigern sicherlich höher ist als bei MOOC-Hasen.

Ein wenig war ich auf Twitter aktiv, wo ich vor allem das Thema Medienkompetenz mit anderen Teilnehmern diskutierte. Neben diesem Blogbeitrag mein remix.

Als neue Medien habe ich Pearltrees kennengelernt. Dazu ein passendes Tutorial von HauteCulture. Toll fand ich auch diese Analytic tool Tagsexplorer. Dieses kann die einzelnen Verbindungen der Twitterfeeds abbilden. So kann man heute sehen, dass sich immer mehr ein kugelförmiges Lernnetzwerk bildet.

Die Live Session habe ich mir in der Aufzeichnung angesehen. Interessant waren dabei für mich folgende Punkte:

  1. was bleibt anschließend vom MOOC? -> es ist durchaus möglich alte Inhalte mit neuen Teilnehmern zu bearbeiten und dabei neue Erkenntnisse zu gewinnen.
  2. wieweit sollte ein MOOC x(für strukturiert) oder c(onnectivism) sein? -> jeder cMOOC sollte für die einzelnen Teilnehmer entsprechend x sein, d.h. für jeden Teilnehmer das passende Format.

Nachdem ich meinen remix verfasst habe fällt mir auf, das dieser Beitrag eigentlich kein reiner Lerntagebucheintrag ist. Ich würde ihn eher als einen Beitrag in einem Lernscript bezeichnen, der nicht nur chronologisch den Ablauf des MOOCs wiederspiegelt, sondern auch Remsümees der Impulse und Ideensplitter enthält.

In der 2. Woche geht es um die Didaktik eines MOOCs. Wieder ein spannendes Thema.

Bis demnächst

Sperling