Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Schau' Dir mal per SysOut die einzelne Werte an !!
Java:
float x = 1000.0F;
float y = 0.00010F;
float a = x + y + y + y + y;
float b = y+ y + y + y + x;
boolean c = a == b;
System.out.println( a );
System.out.println( b );
System.out.println( c );
// Ergebnis:
1000.0005
1000.0004
false
Berechnungen auf Datentypen die kleiner als int sind, werden dennoch als int durchgeführt. d.h. obwohl du byte+byte rechnest, ist das Ergebnis ein int. Liegt eben daran das der Prozessor eh nicht mit so kleinen Werten rechnet, sondern eben mit mindestens 32 Bit
Zu 1.: Alle arithmetischen Operatoren in Java arbeiten mit int oder long. a+b ist also ein int, welches du zu byte zurückkonvertieren musst: (byte) (a+b)
Zu 2.: Liegt an der Präzision von float/double. Überleg dir mal, wenn du im Dezimalsystem nur 4 Stellen zur Verfügung hast:
30000 + 14 + 14 + 14 = ...
30000 + 14 = 30014 (gerundet) 30010
30010 + 14 = 30024 (gerundet) 30020
30010 + 14 = 30034 (gerundet) 30030
Im Gegensatz zu:
14 + 14 + 14 + 30000 = ...
14 + 14 = 28
28 + 14 = 42
42 + 30000 = 30042 (gerundet) 30040
Berechnungen auf Datentypen die kleiner als int sind, werden dennoch als int durchgeführt. d.h. obwohl du byte+byte rechnest, ist das Ergebnis ein int. Liegt eben daran das der Prozessor eh nicht mit so kleinen Werten rechnet, sondern eben mit mindestens 32 Bit
Nein, das liegt daran, dass Java keine echten Datentypen wie BYTE, SHORT etc anbietet und von daher immer nur Mist rauskommt wenn man was anderes als int order float rechnet. Mit C/C++ würde Dir das nicht passieren.
Mist kommt da sicherlich nicht raus. Im Gegensatz zu C/C++ sind die Operationen mit Byte/Short ect... nämlich wohldefiniert. Wenn man die Ergebnisse falsch interpretiert, kann man natürlich denken, dass dabei Mist rauskommt. Eine einfache Addition von zwei Byte-Werten mit anschließender Rück-Konvertierung zu byte im Bereich -128 bis 127 funktioniert ohne Probleme. Außerhalb des Bereichs entsteht halt ein Überlauf, der so auch bei int, sowie bei jeder anderen Programmiersprache existiert. Das einzig "merkwürdige" bei Java ist, dass eben eine Addition von zwei Bytes nicht automatisch zu Byte konvertiert wird, nur weil es dort zu einem Überlauf kommen könnte. Etwas inkonsistent, da die Addition zweier Ints eben auch ein Überlauf erzeugen kann.
Nein, das liegt daran, dass Java keine echten Datentypen wie BYTE, SHORT etc anbietet und von daher immer nur Mist rauskommt wenn man was anderes als int order float rechnet.
Java bietet die sehr wohl an und sie sind eben auch genauso groß wie sie sein sollten (1 bzw 2 byte). Nur die Berechnung mit ihnen wird auf int ausgeführt.
Java bietet die sehr wohl an und sie sind eben auch genauso groß wie sie sein sollten (1 bzw 2 byte). Nur die Berechnung mit ihnen wird auf int ausgeführt.
Das ist überhaupt kein Schwachsinn. Auf Prozessorebene wird (fast) immer mit ints gerechnet. Und der Vergleich mit float und int passt auch nicht. byte passt immer in int, int aber nicht in float. Es macht halt kein Unterschied, ob man direkt zwei bytes addiert und in ein byte speichert, oder den "Umweg" über ints macht. Der "Umweg" über ints ist aber performanter, bzw. bei vielen Prozessoren der einzige Weg. Das ist auch keine Eigenart von Java, sondern der Prozessoren.
Halte es auch für Schwachsinn. Java kann ja intern rechnen wie es will. Aber wenn wenn alle beteiligten Operanden vom Typ byte sind, das Ergebnis auch vom Typ Byte ist, warum muss ich dann selber nochmal casten ?
Da gebe ich dir recht. Das hatte ich auch schon vorhin erwähnt. Arithmetische Operatoren mit ausschließlich Bytes sollte automatisch zu Byte konvertiert werden.
Im Endeffekt wurde das gemacht, da der OPCode für einen Befehl exakt ein byte groß sein soll und wenn man nun für jeden Datentypen alle Operatoren separat definieren würde, hätte man eben nicht genug OPCodes
Im Endeffekt wurde das gemacht, da der OPCode für einen Befehl exakt ein byte groß sein soll und wenn man nun für jeden Datentypen alle Operatoren separat definieren würde, hätte man eben nicht genug OPCodes
Given the Java Virtual Machine's one-byte opcode size, encoding types into opcodes places pressure on the design of its instruction set. If each typed instruction supported all of the Java Virtual Machine's run-time data types, there would be more instructions than could be represented in a byte. Instead, the instruction set of the Java Virtual Machine provides a reduced level of type support for certain operations. In other words, the instruction set is intentionally not orthogonal. Separate instructions can be used to convert between unsupported and supported data types as necessary.