In der Java-Standardbibliothek gibt es eine Klasse BigInteger für beliebig große ganze Zahlen. Machen Sie sich mit dieser Klasse vertraut.
Ergänzen Sie die Klasse Rational, die eine rationale Zahl statt mit zwei long-Werte für Zähler und Nenner mit zwei BigInteger-Objekten umsetzt, um die noch nicht implementierten Methoden.
Nehmen Sie eine möglichst genaue Annährerung für die Quadratwurzel.
Was stellen Sie bei der Berechnung von Wurzeln sehr großer Zahlen fest?.
import java.math.BigInteger;
class Rational{
BigInteger zaehler;
BigInteger nenner;
Rational(BigInteger zaehler, BigInteger nenner){
this.zaehler = zaehler;
this.nenner = nenner;
kuerzen();
}
public String toString(){
var ganzzahl = zaehler.divide(nenner);
var rest = zaehler.remainder(nenner);
var result = ganzzahl.equals(BigInteger.ZERO)?"":(ganzzahl+"");
return result+(rest.equals(BigInteger.ZERO)?"":"\\frac{"+rest+"}{"+nenner+"}");
}
@Override public boolean equals(Object other){
//TODO
return false;
}
public void kuerzen(){
var gcd = zaehler.gcd(nenner);
zaehler = zaehler.divide(gcd);
nenner = nenner.divide(gcd);
if (nenner.compareTo(BigInteger.ZERO) < 0 ){
nenner = nenner.negate();
zaehler = zaehler.negate();
}
}
Rational mult(Rational that){
//TODO
return null;
}
Rational div(Rational that){
//TODO
return null;
}
Rational add(Rational that){
//TODO
return null;
}
Rational sub(Rational that){
//TODO
return null;
}
double toDouble(){
//TODO
return 0.0;
}
boolean lt(Rational that){
//TODO
return false;
}
Rational betrag(){
//TODO
return null;
}
Rational sqrt() {
assert !lt(new Rational(BigInteger.ZERO,BigInteger.ONE)):"Wurzel auf negative Zahl";
return this.sqrt( this.add(new Rational(BigInteger.ONE,BigInteger.ONE)).div(new Rational(BigInteger.TWO,BigInteger.ONE) )) ;
}
Rational sqrt(Rational approx) {
//TODO
return null;
}
public static void main(String... args){
Rational d = new Rational(BigInteger.TWO,BigInteger.ONE);
System.out.println(d.sqrt().toDouble());
d = new Rational(new BigInteger("4"),BigInteger.ONE);
System.out.println(d.sqrt().toDouble());
d = new Rational(new BigInteger("9"),BigInteger.ONE);
System.out.println(d.sqrt().toDouble());
d = new Rational(new BigInteger("25"),BigInteger.ONE);
System.out.println(d.sqrt().toDouble());
}
}