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



## Sneek (11. Nov 2009)

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:

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


----------



## Leroy42 (11. Nov 2009)

Sneek hat gesagt.:


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




Dazu brauchst du keine Libs sondern du mußt einfach nur imt double-Variablen rechnen.


----------



## Sneek (11. Nov 2009)

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


----------



## Michael... (11. Nov 2009)

Sneek hat gesagt.:


> Aber diese haben doch weitaus mehr als 7 Nachkommastellen


Um so besser


----------



## Sneek (11. Nov 2009)

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


----------



## musiKk (11. Nov 2009)

Ich kenne das so:

```
final double DELTA = 1E-7;
if(a-b < DELTA) {
    System.out.println("a = b");
}
```


----------



## faetzminator (11. Nov 2009)

und b-a < DELTA  ?


----------



## Marco13 (11. Nov 2009)

Ja, der Klassiker: [29] Newbie Questions / Answers  Updated! , C++ FAQ Lite


----------



## Sneek (11. Nov 2009)

musiKk hat gesagt.:


> Ich kenne das so:
> 
> ```
> final double DELTA = 1E-7;
> ...



Jou stimmt, gute Idee, damit müsste es klappen


----------



## Ariol (11. Nov 2009)

musiKk hat gesagt.:


> Ich kenne das so:
> 
> ```
> final double DELTA = 1E-7;
> ...



Wäre nicht

```
final double DELTA = 1E-7;
if(Math.abs(a-b) < DELTA) {
    System.out.println("a = b");
}
```
[/QUOTE]
besser?


----------



## Marco13 (11. Nov 2009)

Eben nicht.

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


----------



## evil (15. Nov 2009)

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:



musiKk hat gesagt.:


> Ich kenne das so:
> 
> ```
> final double DELTA = 1E-7;
> ...




und hier weiß ich nicht, wo das b wiederum hergenommen wird. Sorry bin Anfänger. Aber vielleicht kann mir jemand weiter helfen


----------



## Empire Phoenix (15. Nov 2009)

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.


----------

