Hi ,
ich möchte gerne aus einer statischen Methode ein Array mit zwei Elementen zurückgeben, eines muss Typ Double sein und eines muss Typ Long sein.
Bei dem ersten Wert mit 2^n Möglichkeiten handelt es sich um den Typ Long, den ich zwingend als Long in der nächsten Methode brauche. Der andere Wert ist ein Double, häufig mit vielen Nachkommastellen. Ein casten zu Long führte mir da immer zu Datenverlust. Ein casten des Long zu Double lieferte mir auch immer falsche Werte am Ende. Geht darum aus einer Menge M mit n Elementen die Teilemengensumme zu finden, die sich pi am meisten annähert.
Wenn ich die Methode einfach überlade und den Rückgabetyp ändere, funktioniert alles. Aber ist das nicht Laufzeittechnisch total doof, die gesamte Methode nochmal rennen zu lassen obwohl man den Wert schon berechnet hat ? Das Aufgaben Testsystem der Uni meckert da nicht, aber ich dachte das muss doch schöner gehen?
[CODE lang="java" title="SubsetSum"] public static double [] besteTeilSumme (double [] eingebeneMenge) {
double besteSum = eingebeneMenge[0];
long xCount = 0;
double pi = Math.PI;
for (long x = 0; x < (1L << eingebeneMenge.length); x++) {
double zwischenSumme = 0;
for (int i = 0; i < eingebeneMenge.length; i++) {
long binaerStelle = (x >> i) & 1;
if (binaerStelle == 1) {
zwischenSumme = zwischenSumme + eingebeneMenge;
}
}
if (Math.abs (pi - zwischenSumme) < Math.abs(pi - besteSum)) {
xCount = x;
besteSum = zwischenSumme;
}
}
// hier kommt es immer zu Verlust
double [] loesungsWerte = new double[2];
loesungsWerte [0] = xCount; // wird benötigt um in anderer Methode die Menge zu finden
loesungsWerte [1] = besteSum; // wird in Aufgabenstellung als Angabe erwartet und auch benötigt
return loesungsWerte;
}[/CODE]
Das wäre die Lösung mit zwei eigenen Methoden, die funktionieren würde..
ich möchte gerne aus einer statischen Methode ein Array mit zwei Elementen zurückgeben, eines muss Typ Double sein und eines muss Typ Long sein.
Bei dem ersten Wert mit 2^n Möglichkeiten handelt es sich um den Typ Long, den ich zwingend als Long in der nächsten Methode brauche. Der andere Wert ist ein Double, häufig mit vielen Nachkommastellen. Ein casten zu Long führte mir da immer zu Datenverlust. Ein casten des Long zu Double lieferte mir auch immer falsche Werte am Ende. Geht darum aus einer Menge M mit n Elementen die Teilemengensumme zu finden, die sich pi am meisten annähert.
Wenn ich die Methode einfach überlade und den Rückgabetyp ändere, funktioniert alles. Aber ist das nicht Laufzeittechnisch total doof, die gesamte Methode nochmal rennen zu lassen obwohl man den Wert schon berechnet hat ? Das Aufgaben Testsystem der Uni meckert da nicht, aber ich dachte das muss doch schöner gehen?
[CODE lang="java" title="SubsetSum"] public static double [] besteTeilSumme (double [] eingebeneMenge) {
double besteSum = eingebeneMenge[0];
long xCount = 0;
double pi = Math.PI;
for (long x = 0; x < (1L << eingebeneMenge.length); x++) {
double zwischenSumme = 0;
for (int i = 0; i < eingebeneMenge.length; i++) {
long binaerStelle = (x >> i) & 1;
if (binaerStelle == 1) {
zwischenSumme = zwischenSumme + eingebeneMenge;
}
}
if (Math.abs (pi - zwischenSumme) < Math.abs(pi - besteSum)) {
xCount = x;
besteSum = zwischenSumme;
}
}
// hier kommt es immer zu Verlust
double [] loesungsWerte = new double[2];
loesungsWerte [0] = xCount; // wird benötigt um in anderer Methode die Menge zu finden
loesungsWerte [1] = besteSum; // wird in Aufgabenstellung als Angabe erwartet und auch benötigt
return loesungsWerte;
}[/CODE]
Das wäre die Lösung mit zwei eigenen Methoden, die funktionieren würde..
Java:
public static double besteTeilSumme (double [] eingebeneMenge) {
double besteSum = eingebeneMenge[0];
long xCount = 0;
double pi = Math.PI;
for (long x = 0; x < (1L << eingebeneMenge.length); x++) {
double zwischenSumme = 0;
for (int i = 0; i < eingebeneMenge.length; i++) {
long binaerStelle = (x >> i) & 1;
if (binaerStelle == 1) {
zwischenSumme = zwischenSumme + eingebeneMenge[i];
}
}
if (Math.abs (pi - zwischenSumme) < Math.abs(pi - besteSum)) {
xCount = x;
besteSum = zwischenSumme;
}
}
return besteSum;
}
public static long xCount (double [] eingebeneMenge) {
double besteSum = eingebeneMenge[0];
long xCount = 0;
double pi = Math.PI;
for (long x = 0; x < (1L << eingebeneMenge.length); x++) {
double zwischenSumme = 0;
for (int i = 0; i < eingebeneMenge.length; i++) {
long binaerStelle = (x >> i) & 1;
if (binaerStelle == 1) {
zwischenSumme = zwischenSumme + eingebeneMenge[i];
}
}
if (Math.abs (pi - zwischenSumme) < Math.abs(pi - besteSum)) {
xCount = x;
besteSum = zwischenSumme;
}
}
return xCount;
}