Wenn long int zu klein

  • Themenstarter Themenstarter Christian76
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
C

Christian76

Gast
Hallo,

was mache ich eigentlich wenn ein Wert den ich speichern möchte zu groß für long int oder vergleichbares ist.

Wie z.B. 10000000000000000000000000000 🙂

Habe nämlich gerade das Problem, einen Schleife etwas häufiger durchlaufen zu müssen.

Gruß
- Christian
 
Eine Möglichkeit wäre evtl. auch, zwei Schleifen zu verschachteln.
Code:
for (long j=0; j<9223372036854775807; j++)
{
    for (long i=0; i<9223372036854775807; i++)
    {
        doit();
    }
}
Aber die Frage, was dort denn mehr als 9223372036854775807 mal gemacht werden soll (und wie lange das dauern soll) stellt sich in allen Fällen...
 
An was für ne Lösung sonst?

long größer machen?!

Desweiteren sind BigDecimal und BigInteger Klassentypen und somit zu instanzieren und immer über getMethoden abzufragen!

double ist da praktischer!


Nachtrag: was habt ihr alle gegen double?!

DOUBLE: 1.7976931348623157E308

LONG: 9223372036854775807

Beides die max values! Da sollte double reichen und aus 😉
 
falls es nur um die Definition geht:

long l = 10000000000;
Fehler

long l = 10000000000l;
korrekt
 
Marco13 hat gesagt.:
Aber die Frage, was dort denn mehr als 9223372036854775807 mal gemacht werden soll (und wie lange das dauern soll) stellt sich in allen Fällen...

Joa, das frag ich mich auch. Du könntest auch noch den negativ-Bereich von Long ausnutzen.

Code:
for (long l = Long.MIN_VALUE; l <= Long.MAX_VALUE; l++) {
   doSomethingCool();
}
 
thE_29 hat gesagt.:
An was für ne Lösung sonst?

long größer machen?!

Desweiteren sind BigDecimal und BigInteger Klassentypen und somit zu instanzieren und immer über getMethoden abzufragen!

double ist da praktischer!


Nachtrag: was habt ihr alle gegen double?!

DOUBLE: 1.7976931348623157E308

LONG: 9223372036854775807

Beides die max values! Da sollte double reichen und aus 😉

Da hast du imho nen Denkfehler. Double kann zwar größere Zahlen speichern, ist für Zählschleifen aber ungeeignet, da im großen Bereich zu ungenau. Double nimmt genausoviel Speicher wie ein long, theoretisch passen also einfach nicht mehr Infos rein. Hier ein Beispiel

Code:
		System.out.println((double)(Long.MAX_VALUE + 500D));
		System.out.println((double)Long.MAX_VALUE);
		System.out.println((double)(Long.MAX_VALUE + 500D) == (double)Long.MAX_VALUE);
		System.out.println(Double.MAX_VALUE - 1);
		System.out.println(Double.MAX_VALUE);
		for (double d = Long.MAX_VALUE - 1; d < Long.MAX_VALUE + 5; d++) {
			System.out.println(d);
		}
 
Naja, das mit den 500 ist das Problem dass das nicht mehr in der Nachkommazahl auftaucht 😉
Mach ein 1000 draus und es geht!

Außerdem solche sinnlose Schleifen habe ich noch nie gebraucht, als das mir long zu klein wäre 😉
 
thE_29 hat gesagt.:
Naja, das mit den 500 ist das Problem dass das nicht mehr in der Nachkommazahl auftaucht 😉
Mach ein 1000 draus und es geht!

Das ist der Zählschleife aber egal 😛

thE_29 hat gesagt.:
Außerdem solche sinnlose Schleifen habe ich noch nie gebraucht, als das mir long zu klein wäre 😉

Das stimmt allerdings. Ich könnte wetten, dass der Threadsteller entweder schmuh programmiert oder nen gewaltigen Denkfehler hat!
 
die Frage wofür man mehr braucht ist schnell beantwortet. Z.b. bei Primzahlen.
 
ja, das hatte ich vor. Dank an dich für den Hinweis mit BigInteger. Ich war auch recht überrascht solch eine
Methode dort drinn zu finden.
 
Selbst implementieren kann man das Ganze auch z.B. als Kette als Stack.
Du musst aber beachten, dass v.a. in den Grundrechenarten das Ganze erheblich langsamer ist, als bei der Nutzung niederer Datentypen!
 
also es gibt gerade in der algorithmischen geometrie einen algorithmus der in nem schlechten fall vieeeel zu große ganze zahlen braucht. Nämich wenn man denn Minimalen abstand zweier Punkte mit randomisierter inkrementeller Konstruktion vollführen möchte. Hierbei kann der Zahlbereich zu klein werden.
 
Du kannst in Java auch externe Nicht-Java Libs einladen.
Habe mich aber noch nicht damit beschäftigt, aber ich denke mal, so könntest du sowas in Fortran oder C programmieren und dann in Java nutzen (ohne über Schnittstellen zu einem anderen Programm zu gehen).
Vielleicht wäre das für dich eine Lösung.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben