Rechnen mit MaxValue

Shao

Mitglied
Guten Abend,

ich habe eine Uni Aufgabe die eigentlich wahnsinnig simpel erscheint und normalerweise kein Problem für mich darstellen sollte.
Da ich aber sehr lange nicht mehr programmiert habe komme ich seit Stunden leider nicht auf eine Lösung.

Die Frage an der ich hänge ist wie ich in einem simplen Taschenrechner nicht über den MIN/MAX Value eines Integer rechne. Also Integer.MinValue - 10 würde ja dann ans andere Ende des Integer springen und mir irgendeinen Riesen Wert geben. Nun bekomme ich es nicht hin das ganze so abzufangen das er so etwas garnicht erst rechnet.
Ich vermute das wenn ich eine Lösung sehe absolut vor Scharm im Boden versinken werde, aber es will mir einfach keine Lösung einfallen ^^

Vllt kann mir jemand helfen :)
Mit freundlichen Grüßen Shaw
 

Blender3D

Top Contributor
Java:
public int add(final int a, final int b) {
        int result = 0;
        try {
            result = Math.addExact(a, b);

        } catch (ArithmeticException e) {
            System.err.println("Overflow at operation add!");
        }
        return result;
    }
 

Shao

Mitglied
Danke dir @Blender3D. ich verstehe diese Lösung und hab so kompliziert garnicht gedacht direkt die Math Klasse zu nehmen.
Hast du noch eine leichtere Lösung von wegen (a+b);
Weil mein Nachbar grade guckt mit Tränen auf meinen Bildschirm und versteht das ganze mit TryCatch nämlich garnicht ^^
 

Robat

Top Contributor
Du könntet die Werte auch zu einem long casten.
Java:
long test = (long)x+ (long)y;
if (test > Integer.MAX_VALUE || test < Integer.MIN_VALUE) {
   // Overflow!
}
 
K

kneitzel

Gast
Man kann sich natürlich auch die ganzen Kriterien selbst überlegen.

Also nehmen wir nur mal die Addition (+):
result = a + b;

Wenn a und b positiv sind, dann prüfen wir auf:
MAX_VALUE - b < a // entspricht a + b > MAX_VALUE

Wenn a und b negativ sind, dann prüfen wir:
MIN_VALUE -b > a // entspricht a + b < MIN_VALUE

Wenn ein Operand positiv und der andere negativ ist, dann kann es zu keinem Overflow kommen.

Das Ganze kann man dann ähnlich für die anderen Operationen überlegen.

Funktionieren tut das, weil wir nie einen Überlauf oder Unterlauf haben: MAX_VALUE - einem positiven Integer ist im Wertebereich. Ebenso MIN_VALUE - negativer Integer.
 
X

Xyz1

Gast
In Assembler ist das sehr easy:

javac -h . MyJni.java
MyJni.java:
Java:
public class MyJni {
	static {
		System.loadLibrary("my");
	}
	public native boolean addO(int x, int y);
	public native boolean subO(int x, int y);
	public static void main(String[] args) {
		MyJni j = new MyJni();
		System.out.println(j.addO(Integer.MAX_VALUE - 1, 1));
		System.out.println(j.subO(-2, Integer.MAX_VALUE));
	}
}


(export java home...).
gcc -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libmy.so MyJni.c
MyJni.c:
C:
#include <jni.h>
#include "MyJni.h"

/*
 * Class:     MyJni
 * Method:    addO
 * Signature: (II)Z
 */
JNIEXPORT jboolean JNICALL Java_MyJni_addO
  (JNIEnv *env, jobject to, jint x, jint y) {
	  int l1=x, l2=y, l3=1;
	  asm("add %%ebx, %%eax;"
	  "jo aSiOv;"
	  : "=a" (l3)
	  : "a" (l1), "b" (l2));
	  l3 = 0;
	  asm("aSiOv:" : : );
	  return l3 == 1;
  }

/*
 * Class:     MyJni
 * Method:    subO
 * Signature: (II)Z
 */
JNIEXPORT jboolean JNICALL Java_MyJni_subO
  (JNIEnv *env, jobject to, jint x, jint y) {
	  int l1=x, l2=y, l3=1;
	  asm("sub %%ebx, %%eax;"
	  "jo sSiOv;"
	  : "=a" (l3)
	  : "a" (l1), "b" (l2));
	  l3 = 0;
	  asm("sSiOv:" : : );
	  return l3 == 1;
  }


java -Djava.library.path=. MyJni:
...
...

jo springt bei einem Overflow zu aSiOv (add signed overflow) oder sSiOv (sub signed overflow).;)
 

Blender3D

Top Contributor
Hast du noch eine leichtere Lösung von wegen (a+b);
@Robat hat die einfache Variante der Addition bereits gepostet.
Aber ich würde die eingebaute Lösung von Java nützen, weil Du damit auch Fehler bei Multiplikationen abfangen kannst.
Es stellt für den Anwender auch die einfachste Variante dar. Der try Block versucht die Operation ohne Überlauf durchzuführen.
Falls das nicht klappt wird der catch Block aufgerufen. Das ist nicht wirklich kompliziert. ;)
 
X

Xyz1

Gast
Na ja zum Beispiel:
Java:
System.out.println(j.addO(Integer.MAX_VALUE, Integer.MAX_VALUE));
//oder
System.out.println(j.subO(Integer.MIN_VALUE, Integer.MAX_VALUE));
zu erkennen finde ich schon kompliziert, zumal die alu ja schon ein Flag setzt... Es ist nur nicht in JAVA verwendbar.:(
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Rechnen mit Brüchen, ist meine Lösung soweit richtig? Java Basics - Anfänger-Themen 4
C Kann mir jemand sagen warum ich nicht mal rechnen kann ? Java Basics - Anfänger-Themen 32
Liroyd Methode mit Objektvariabel rechnen? Java Basics - Anfänger-Themen 6
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
Zeppi Geteilt rechnen Java Basics - Anfänger-Themen 2
D Mit Objekten rechnen, Textfield, JavaFX, Noob Java Basics - Anfänger-Themen 8
L Mit Zahlen im String rechnen Java Basics - Anfänger-Themen 19
L Datentypen Rechnen und abrunden mit double Java Basics - Anfänger-Themen 7
S Hamster Simulator rechnen lernen Parameter int Java Basics - Anfänger-Themen 6
D Operatoren Mit Objekten rechnen Java Basics - Anfänger-Themen 7
P Rechnen mit Brüchen - objektorientierte Programmierung Java Basics - Anfänger-Themen 18
L Rechnen mit Objekten Java Basics - Anfänger-Themen 3
W Erste Schritte Rechnen mit Schleifen? Denkanstoß gesucht Java Basics - Anfänger-Themen 15
W Seltames Problem bei Rechnen mit BigIntegers Java Basics - Anfänger-Themen 2
A Rechnen mit Text und Zahl Java Basics - Anfänger-Themen 4
S Jede Ziffer einer Zahl auslesen, damit rechnen und beim Ergebnis wiederholen ? Java Basics - Anfänger-Themen 20
S Dezimalzahlen rechnen Java Basics - Anfänger-Themen 3
kilopack15 Rechnen mit großen Zahlen Java Basics - Anfänger-Themen 6
D Rechnen mit numerischen Datentyp Frage Java Basics - Anfänger-Themen 16
E Best Practice Exaktes Rechnen mit (Pseudo-)Rationalen/Realen Zahlen. Operations Zuweisung für (eigene) Klassen Java Basics - Anfänger-Themen 3
1 Mit Java Rechnen Java Basics - Anfänger-Themen 10
T Einstieg in "grafische Progammierung" + Rechnen in Flussdiagramm Java Basics - Anfänger-Themen 2
W Variablen float rundet beim Bruch rechnen Java Basics - Anfänger-Themen 3
N Oracle SQL mit Zwischenergebnis rechnen Java Basics - Anfänger-Themen 2
Y Variable Menge von Objekten erzeugen und mit ihren Attributen rechnen Java Basics - Anfänger-Themen 7
S Double mithilfe eines Scanners so einlesen, dass ich damit rechnen kann Java Basics - Anfänger-Themen 4
J Char-Rechnen Java Basics - Anfänger-Themen 8
A Rechnen mit Set/Get? Java Basics - Anfänger-Themen 2
Z Erste Schritte Instanzmethoden Rechnen (Bruch) Java Basics - Anfänger-Themen 18
M Mit Werten aus Arrays in anderen Methoden rechnen? Java Basics - Anfänger-Themen 3
J Mit Datum rechnen Java Basics - Anfänger-Themen 11
F Erste Schritte [GUI] Dual in Dezimal rechnen Java Basics - Anfänger-Themen 5
D Erste Schritte Rechnen mit Brüchen Java Basics - Anfänger-Themen 13
D rechnen mit Stunden und Minuten Java Basics - Anfänger-Themen 14
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
G Rechnen mit Long Variablen Java Basics - Anfänger-Themen 4
N Probleme beim Rechnen mit Integer und double Java Basics - Anfänger-Themen 4
W Variablen Rechnen mit "char" Java Basics - Anfänger-Themen 2
Joew0815 Compiler-Fehler Unexpected Type - Problem mit Variablen rechnen Java Basics - Anfänger-Themen 7
F Werte aus Tabelle vergleichen/rechnen Java Basics - Anfänger-Themen 5
C Mit Potenzen rechnen "Problem" Java Basics - Anfänger-Themen 3
M Mit Array rechnen Java Basics - Anfänger-Themen 9
T Rechnen in Arrays Java Basics - Anfänger-Themen 11
B von Ergebniss weiter rechnen Java Basics - Anfänger-Themen 3
S Rechnen mit Datum bzw. Uhrzeit Java Basics - Anfänger-Themen 3
S Datentypen Operatoren und Ausdrücke (formel richtig rechnen) Java Basics - Anfänger-Themen 8
N Mit long rechnen Java Basics - Anfänger-Themen 2
K Übungsblatt 13 Aufgabe 6 (Rechnen) Java Basics - Anfänger-Themen 12
C Mit Gleitkommazahlen rechnen Java Basics - Anfänger-Themen 20
T Rechnen mit Operatoren Java Basics - Anfänger-Themen 2
W Mit (char) rechnen Java Basics - Anfänger-Themen 3
F Mit Arrays rechnen Java Basics - Anfänger-Themen 12
H Datentypen Rechnen mit signed Byte-Array - unsinged byte Java Basics - Anfänger-Themen 3
B mit benutzereingaben rechnen Java Basics - Anfänger-Themen 4
L Bruch rechnen Java Basics - Anfänger-Themen 29
B mit Datum rechnen Java Basics - Anfänger-Themen 10
D Rechnen mit int Array Java Basics - Anfänger-Themen 9
M mit Uhrzeit rechnen Java Basics - Anfänger-Themen 11
T mit Winkel & Sinus rechnen / sin(30°)=2,5 Java Basics - Anfänger-Themen 7
A Rechnen mit big integer Java Basics - Anfänger-Themen 29
L Mit matrizen rechnen Java Basics - Anfänger-Themen 19
W Probleme mit double rechnen Java Basics - Anfänger-Themen 4
J Datentypen Rechnen mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 3
K mit einer int rechnen Java Basics - Anfänger-Themen 10
M Warum -48 rechnen? Java Basics - Anfänger-Themen 3
K Java Code rechnen Java Basics - Anfänger-Themen 7
F Rechnen mit komplexen Zahlen Java Basics - Anfänger-Themen 23
C Datentypen Unklarheiten beim Rechnen Java Basics - Anfänger-Themen 5
W Modulo rechnen Java Basics - Anfänger-Themen 3
H Datentypen Rechnen und Runden Java Basics - Anfänger-Themen 2
S Rechnen mit Zeitangaben Java Basics - Anfänger-Themen 5
Binary.Coder Doppeltes Hashing verläuft in "Endlosscheife" beim rechnen per Hand Java Basics - Anfänger-Themen 8
F Mit Anzahl Startparametern rechnen Java Basics - Anfänger-Themen 17
T mit List<Integer> rechnen Java Basics - Anfänger-Themen 9
O einfaches rechnen mit zahlen Java Basics - Anfänger-Themen 4
K Stunden zusammen Rechnen Java Basics - Anfänger-Themen 4
T mit Typen Date rechnen Java Basics - Anfänger-Themen 6
S mit Werten aus 2D-Array rechnen Java Basics - Anfänger-Themen 32
J Anfänger-Problem: Rechnen mit Java Java Basics - Anfänger-Themen 3
J Mit Java exp Rechnen ? Java Basics - Anfänger-Themen 4
P Mit double und BigDecimal rechnen Java Basics - Anfänger-Themen 6
K Wie zerlege Ich einen String zum Rechnen? Java Basics - Anfänger-Themen 3
D Rechnen mit zwei Klassen Java Basics - Anfänger-Themen 19
J Mit Zeitzonen rechnen! Java Basics - Anfänger-Themen 3
G Float schneidet nach dem Rechnen auf eine Stelle ab Java Basics - Anfänger-Themen 9
L Eingeben Rechnen Ausgeben - Leider nicht so einfach Java Basics - Anfänger-Themen 31
G Mit tastatureingaben rechnen Java Basics - Anfänger-Themen 10
B Großer Java bug beim rechnen? Java Basics - Anfänger-Themen 66
S mit Strings rechnen Java Basics - Anfänger-Themen 16
D mit request.getParameter("x") rechnen Java Basics - Anfänger-Themen 3
T mit byte rechnen. ? Java Basics - Anfänger-Themen 8
MrTical Zahlen einlesen um damit zu rechnen Java Basics - Anfänger-Themen 5
Safado modulo rechnen Java Basics - Anfänger-Themen 5
F mit Dualzahlen rechnen Java Basics - Anfänger-Themen 5
J Rechnen mit Dualzahlen Java Basics - Anfänger-Themen 5
C Bedingtes Rechnen Java Basics - Anfänger-Themen 64
G mit Strings rechnen (Unicode) Java Basics - Anfänger-Themen 15
H Modulo rechnen Java Basics - Anfänger-Themen 17
T Rechnen Java Basics - Anfänger-Themen 3
G Taschenrechner.aber Rechnen bring ich nicht zam! Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben