# Math.log auf meine Art zu ungenau



## virtualAudio (29. Sep 2009)

Hi Leute,

folgendes Problem:

```
return (Math.log(x)/Math.log(basis));
```

Liefert bei x = 1000 und einer Basis = 10 (also 10er Logarithmus von 1000) nicht 3 sondern 2.9999999999999996

Habt ihr eine Idee wie man diese Ungenauigkeit versteckt oder los wird?  
Math.log10(1000) liefert genau 3.0, aber ich möchte ja jedes x mit jeder Basis logarithmieren können.

lg Andi


----------



## faetzminator (29. Sep 2009)

Die Problematik besteht darin, dass du ein double und kein int oder long hast - double ist ungenau. Du könntest ihn aber z.B. folgendermassen runden:

```
double result = Math.log(x) / Math.log(basis);
result = Math.round(result * 100) / 100; // hier auf 2 stellen
```


----------



## SlaterB (29. Sep 2009)

Math.round() liefert dummerweise einen long und long/ int wird keine Nachkommastellen haben 

mit / 100.0 kommt es hin, 
kann aber eigentlich bei dieser Rechnung kein Rundungsfehler auftreten?
alternativ in der Anzeige immer auf Begrenzung der Nachkommastellen achten, z.B. mit DecimalFormat


----------



## virtualAudio (29. Sep 2009)

Wow, bist du flott  Danke für die rasante Antwort.

Hmmm, ok, das heißt ich werde mal versuchen, bei Eingabe von ganzen zahlen als x und basis (was ja meistens ist) stattdessen long zu verwenden. Ich muss nur schaun, dass ich mit den unterschiedlichen Wertebereichen zwischen double und long kein Problem bekomme (ist ein grafisches Applet mit zoom)...

das applet


----------



## Spacerat (29. Sep 2009)

Ist "Math.log()" (natürlicher Logarithmus) nicht ohnehin die "falsche" Methode? Muss das nicht "Math.log10()" (Logarithmus zur Basis 10) sein?


----------



## virtualAudio (29. Sep 2009)

hmm, ok, ich dachte es gibt sowas wie Math.log(long) aber so gehts nicht.

Naja, dann werde ich erstmal abfragen ob basis == 10 ist und wnen ja den Math.log10 benutzen...der liefert in dem Fall zumindest 3.0 und sonst alle Kommastellen (da hat wer die Lösung für mein Problem gehabt  )


----------



## virtualAudio (29. Sep 2009)

Spacerat hat gesagt.:


> Ist "Math.log()" (natürlicher Logarithmus) nicht ohnehin die falsche Methode? Muss das nicht "Math.log10()" (Logarithmus zur Basis 10) sein?



ja, wenn man nur basius 10 verwendet ist log10 die richtige (und liefert wie gesagt auch richtigere Ergebnisse). Aber wenn man die basis variieren möchte gibt es die Formel ln(x)/ln(basis)

lg andi


----------



## Spacerat (29. Sep 2009)

virtualAudio hat gesagt.:


> ja, wenn man nur basius 10 verwendet ist log10 die richtige (und liefert wie gesagt auch richtigere Ergebnisse). Aber wenn man die basis variieren möchte gibt es die Formel ln(x)/ln(basis)
> 
> lg andi


Ja neee... is' klar... "Math.log10(x) / Math.log10(basis)" funzt aber auch. Und wenn man bedenkt, dass die Eulersche Zahl, auf welcher ja "Math.log()" aufbaut, in Java schon "ungenau" gespeichert ist, könnte es so genauer werden. Nur rein theoretisch.


----------



## virtualAudio (29. Sep 2009)

Spacerat hat gesagt.:


> Ja neee... is' klar... "Math.log10(x) / Math.log10(basis)" funzt aber auch...



Achso, gut zu wissen 

Also ich mach jetzt bei basis == 10 log10 und sonst die Formel...

Danke für eure unglaublich schnelle Hilfe...wie die Support-Piranhas 

Wenn noch jemandem eine bessere Lösung einfällt...auch gern 

lg Andi


----------



## musiKk (29. Sep 2009)

Spacerat hat gesagt.:


> Ja neee... is' klar... "Math.log10(x) / Math.log10(basis)" funzt aber auch. Und wenn man bedenkt, dass die Eulersche Zahl, auf welcher ja "Math.log()" aufbaut, in Java schon "ungenau" gespeichert ist, könnte es so genauer werden. Nur rein theoretisch.



In dem Fall egal. Das funktioniert zu jeder Basis. Sollte aber in der Schule dran gewesen sein.


----------



## 0x7F800000 (29. Sep 2009)

virtualAudio hat gesagt.:


> Liefert bei x = 1000 und einer Basis = 10 (also 10er Logarithmus von 1000) nicht 3 sondern 2.9999999999999996
> 
> Habt ihr eine Idee wie man diese Ungenauigkeit versteckt oder los wird?


*Vier Zehnmillionenmilliardstel* ist deiner Meinung nach eine "Ungenauigkeit"??!? 
Was zum Teufel sind 4/10000000000000000 bei Rechnereien mit Fließkommazahlen... Wenn du 1/(double)3 hinschreibst, kriegst du das doch auch nur noch auf Rechengenauigkeit richtig, warum hast du dann ausgerechnet am Logarithmus irgendwas auszusetzen? :noe:


----------



## Spacerat (29. Sep 2009)

musiKk hat gesagt.:


> In dem Fall egal. Das funktioniert zu jeder Basis. Sollte aber in der Schule dran gewesen sein.


Ja, war es . Die Ungenauigkeit eines Doubles aber nicht. Und wenn die Konstante "Math.E" als Grundlage für "Math.log()" verwendet wird, wirds da schon ungenau. Die Ergebnisse können deswegen Unterschiedlich sein. Und Wahrhaftig:
	
	
	
	





```
public class LogTest
{
  public static void main(String ... args)
  {
    double lge = Math.log(1000) / Math.log(10);
    double lg10 = Math.log10(1000) / Math.log10(10);
    System.out.println(lge);
    System.out.println(lg10);
  }
}
```
Ausgabe:
	
	
	
	





```
2.9999999999999996
3.0
```
@0x7F800000: Was ist ein Zehnmillionenmillardstel?


----------



## musiKk (29. Sep 2009)

Ok, ich habe schon etwas zu weit (und zu theoretisch) gedacht. In konkreten Fällen (wie in diesem) kann es einen Unterschied machen. Gerade natürlich, wenn es um den dekadischen Logarithmus geht und eine entsprechende Funktion existiert, die bei Zehnerpotenzen ja vielleicht eine Optimierung enthält (_vielleicht_ weil native und ich keine Lust zum Suchen habe ). Die Frage ist, ob es bei allen möglichen Logarithmen (also alle Zahlen zu allen Basen) einen Unterschied macht und welche Variante übers Mittel genauer ist. Da könnte ich mir vorstellen, dass die Ungenauigkeit von _e_ keine Rolle spielt, da beide (die Variante über und unter dem Bruchstrich) gleich ungenau sind.


----------



## virtualAudio (1. Okt 2009)

0x7F800000 hat gesagt.:


> Wenn du 1/(double)3 hinschreibst, kriegst du das doch auch nur noch auf Rechengenauigkeit richtig, warum hast du dann ausgerechnet am Logarithmus irgendwas auszusetzen? :noe:



das Ungenauigkeiten auftreten ist ja jedem klar. Was für meinen Rechner wichtig ist, dass nicht ausgerechnet wenn man log10 von 1000 ausrechnen will als Antwort 2,...irgendwas kommt. Da ist die Ungenauigkeit, so klein sie auch ist, einfach...naja... etwas zu auffällig 

Jetzt bin ich aber schon ganz zufrieden fürn kleines Applet  Was sagt ihr dazu?

Calculate any Logarithm


----------



## 0x7F800000 (1. Okt 2009)

virtualAudio hat gesagt.:


> das Ungenauigkeiten auftreten ist ja jedem klar. Was für meinen Rechner wichtig ist, dass nicht ausgerechnet wenn man log10 von 1000 ausrechnen will als Antwort 2,...irgendwas kommt. Da ist die Ungenauigkeit, so klein sie auch ist, einfach...naja... etwas zu auffällig


Naja, lange kann man sowas eh nicht verschleiern, irgendwann wird die Wahrheit rauskommen^^



> Was sagt ihr dazu?


Da ist mir der permanent laufende scala-interpreter oder google irgendwie doch weniger stressig^^ 

Aber die versetzten editierbaren Formeln sehen imho schon interessanter aus, funzt das nur für diesen einen spezialfall, oder hast du da ein paket zum aufmalen solcher Bäume? Wenn ja: was kann's denn noch alles?

Der Frequenzenrechner ist auch lustig^^


----------



## virtualAudio (1. Okt 2009)

0x7F800000 hat gesagt.:


> Naja, lange kann man sowas eh nicht verschleiern, irgendwann wird die Wahrheit rauskommen^^


Hoffentlich erst wenn ich mich mit dem ganzen Geld, das mir diese kleine Schwindelei zu unrecht einbringen wird, auf eine kleine Südseeinsel vertschüsst habe .




0x7F800000 hat gesagt.:


> Da ist mir der permanent laufende scala-interpreter oder google irgendwie doch weniger stressig^^



Naja, was soll ich sagen... ich bin ein visueller Mensch und fummel auch gern mit der Maus am Bildschirm rum. 



0x7F800000 hat gesagt.:


> Aber die versetzten editierbaren Formeln sehen imho schon interessanter aus, funzt das nur für diesen einen spezialfall, oder hast du da ein paket zum aufmalen solcher Bäume? Wenn ja: was kann's denn noch alles?


Nö, funktioniert nur hier. Sowas hab ich sonst noch nie gebraucht. Aber wenn Du jemanden weißt der viel Geld für sowas ausgeben will.... einfach bescheid sagen 



0x7F800000 hat gesagt.:


> Der Frequenzenrechner ist auch lustig^^


Danke vielmals


----------

