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.
ich versuche im moment das Faktorisierungsverfahren nach Lehmann[1] zu implementieren. Nun stehe ich allerdings vor dem Problem das ich y=x²-4kn berechnen soll (n und k sind gegeben) und dann Prüfen soll ob y eine Quadratzahl ist. Ich habe mir dafür überelgt das ich aus y die Wurzel ziehe und dann gucke ob das Ergebnis Gannzzahlig ist. Da die Funktion Math.sqrt aber einen double zurück liefert steht ich nun vor dem Problem wie teste ich für eine Gleitkomma zahl ob sie ganzzahlig ist. Nach dem was ich einmal gelernt habe müsste ich dafür ja eigentlich nur die Mantisse(?) der Gleitkommazahl testen, aber wie mache ich das ohne dafür zu tief in die Trickkiste zu greifen? Aber vielleicht gibt es ja noch einen anderen Weg, den ich im moment nicht sehe.
Ich wäre über einen entsprechenden hinweis auf jeden Fall sehr dankbar.
Viele Grüsse
Dan
public class Test {
public static void main(String[] args) {
int y = 10;
double wurzel = Math.sqrt(y);
int pruefWert = (int) Math.round(wurzel * wurzel);
boolean yIstQuadratZahl = pruefWert == y;
System.out.println(yIstQuadratZahl);
}
}
ich habe mich direkt erschrocken was für eine Ressonanz ich mit dieser Frage erzielt habe. Auf jeden fall vielen dank für die vielen hilfreichen Antworten. Ich denke ich werde die Idee von Ebenius beherzigen und das so umsetzen.
Viele Grüsse
Dan
Compare vergleicht intern auch auf Gleichheit (testet noch Sonderfälle wie NaN usw...).
double x = 0;
x+= 0.1;
x+= 0.1;
x+= 0.1;
x+= 0.1;
x+= 0.1;
Double.compare(0.5, x); // Gibt vtml. nicht 0
Um die Ungenauigkeit zu umgehen, muss man GROB sowas machen wie
boolean equals(double a, double b) { return Math.abs(a-b) < 1e-7; }
wobei man das "epsilon" eigentlich auch noch auf die Größe der beiden Zahlen beziehen muss (siehe Knuth TAOCP)
Triebi, das funktioniert ganz genauso wenig. Es geht ja nicht darum, dass falsch verglichen wird. Es geht darum, dass die zwei Doubles sich eben minimal unterscheiden können. Der richtige weg ist ein Epsilon-Vergleich. Da ich aber zu faul war, darüber nachzudenken, welches Epsilon hier passend wäre, hab ich mir was anderes ausgedacht, was IMHO sicher funktionieren sollte.
// EDIT: Marco, mit Deinem letzten Satz erklärst Du gut, warum ich lieber anders rangehen wollte.