Double bis bestimmte Nachkommzahl vergleichen (ohne zusätzliche Libs)

Status
Nicht offen für weitere Antworten.

Sneek

Aktives Mitglied
Hi Leute, wir sollen den Logarithmus einer Zahl ohne irgendwelche zusätzlichen Libs ausrechnen.

Eine Nährungsformel schaut ja wie folgt aus:


Also meine Berechnung schaut allgemein erstmal so aus:
Java:
 while(true){

      for(int a=1; a < n; ++a){
        zaehler *= (x - 1);
      }
      for(int a=1; a < n; ++a){
        nenner *= (x + 1);
      }
      
      zahl += 2*(zaehler/(n*nenner));
      n += 2;  
      zaehler = x - 1;
      nenner = x + 1;

Das haut soweit alles erstmal hin. Nun haben wir aber als Abbruchbedinung vorgegeben bekommen, dass wenn sich die Zahl der aktuellen und vorherrigen Iteration um weniger als 10^-7 stellen unterscheidet die Schleife verlassen wird.

Nun hab ich keine Ahnung wie ich die Zahlen ohne irgendwelche zusätzlichen Libs bis auf 10^-7 Nachkommastellen vergleichen soll.

Hat einer von euch eine Idee?
 
Aber diese haben doch weitaus mehr als 7 Nachkommastellen. Und es reicht ja wenn die ersten sieben Nachkommastellen gleich sind, der Rest ist ja überflüssig... hmmm
 
Natürlich ist es besser. Wir haben jedoch die Aufgabe wenn sieben Nachkommastellen gleich sind die Schleife abbrechen zu lassen, da bringt uns eine höhere Genauigkeit des Ergebnisses nichts...
 
Ich kenne das so:
Java:
final double DELTA = 1E-7;
if(a-b < DELTA) {
    System.out.println("a = b");
}
 
Eben nicht.
Java:
    private static final boolean isEqual(double x, double y)
    {
      final double epsilon = 1e-7;
      return Math.abs(x - y) <= epsilon * Math.abs(x);
    }

EDIT: Wie man an der Uhrzeit vielleicht schon sieht, bezog sich das "Eben nicht" auf das "So müßte es klappen"....
 
Ich hab da nun eine Frage. Sneek hat ja in seinem Script schon for(int a=1; a < n; ++a){
zugewiesen. Was hat das a hier für eine funktion? Es taucht in der späteren Rechnung nicht mehr auf. Außer in:

Ich kenne das so:
Java:
final double DELTA = 1E-7;
if(a-b < DELTA) {
    System.out.println("a = b");
}


und hier weiß ich nicht, wo das b wiederum hergenommen wird. Sorry bin Anfänger. Aber vielleicht kann mir jemand weiter helfen 🙂
 
a und b sind die beiden double die verglichen werden, Delta ist die abweichung.

Für Matheinteresierte:
während zb ganze Zahlen abzählbar sind, sind relle zahlen (zu denen mit einschränkung der Genauigkeit ja auch die double und flaots ect. zählen können) überabzählbar

Bsp:
0,1,2,3,4,5,.. für ganze Zahlen
Aber:
0,1 bei reelen Zahlen geht nicht, man vergisst die 0.5
0,0.5 geht auch nicht, man vergisst ja die 0.25 , ect
Dies lässt sich unendlich oft wiederholen.

Relle zahlen gehören zu den angeordneten Körpern, das heist:
Seien a,b Relle Zahlen dann kann man sagen a<b oder a>b oder a=b

Computer-technisch kommt jetzt das Problem der Ungenauigkeit durch die begrenzte bittiefe, Bsp: 10/3 = 3,3periode (also unendlich viele Stellen)

Somit muss man sich beim vergleichen von double,real,float,ect bedenken, das Rechnerisch immer ungenauigkeiten vorhanden sind. Bsp: 10/3*3=10,aber nicht wenn man die Ungenauigkeit bedenkt.

Somit kann man die vergeliche nur sinvoll durchführen wenn man die ungenaugkeit bedenkt, dieses kann man machen indem man prüft ob die differenz zweier Zahlen unter einer benötigten genauigkeit liegt.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben