# Wenn long int zu klein



## Christian76 (6. Jun 2007)

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


----------



## thE_29 (6. Jun 2007)

Dann nimmst double


----------



## Guest (6. Jun 2007)

mmh, ich dachte eher an eine andere Lösung!


----------



## The_S (6. Jun 2007)

BigDecimal oder BigInteger!


----------



## Marco13 (6. Jun 2007)

Eine Möglichkeit wäre evtl. auch, zwei Schleifen zu verschachteln. 

```
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...


----------



## thE_29 (6. Jun 2007)

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


----------



## SlaterB (6. Jun 2007)

falls es nur um die Definition geht:

long l = 10000000000;
Fehler

long l = 10000000000l;
korrekt


----------



## Guest (6. Jun 2007)

klasse, und wiedermal danke!!!


----------



## The_S (6. Jun 2007)

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.


```
for (long l = Long.MIN_VALUE; l <= Long.MAX_VALUE; l++) {
   doSomethingCool();
}
```


----------



## The_S (6. Jun 2007)

thE_29 hat gesagt.:
			
		

> An was für ne Lösung sonst?
> 
> long größer machen?!
> 
> ...



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


```
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);
		}
```


----------



## thE_29 (6. Jun 2007)

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_S (6. Jun 2007)

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!


----------



## Guest (6. Jun 2007)

die Frage wofür man mehr braucht ist schnell beantwortet. Z.b. bei Primzahlen.


----------



## The_S (6. Jun 2007)

Willste Primzahlen berechnen!? Wie wärs mit

BigInteger#nextProbablePrime

?


----------



## Guest (6. Jun 2007)

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.


----------



## deleted (6. Jun 2007)

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!


----------



## Quickbeam2k1 (6. Jun 2007)

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.


----------



## deleted (6. Jun 2007)

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.


----------

