Math.log auf meine Art zu ungenau

Status
Nicht offen für weitere Antworten.

virtualAudio

Aktives Mitglied
Hi Leute,

folgendes Problem:
Java:
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

Gesperrter Benutzer
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:
Java:
double result = Math.log(x) / Math.log(basis);
result = Math.round(result * 100) / 100; // hier auf 2 stellen
 
S

SlaterB

Gast
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

Aktives Mitglied
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
 
S

Spacerat

Gast
Ist "Math.log()" (natürlicher Logarithmus) nicht ohnehin die "falsche" Methode? Muss das nicht "Math.log10()" (Logarithmus zur Basis 10) sein?
 
Zuletzt bearbeitet von einem Moderator:

virtualAudio

Aktives Mitglied
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

Aktives Mitglied
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
 
S

Spacerat

Gast
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.
 
Zuletzt bearbeitet von einem Moderator:

musiKk

Top Contributor
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

Top Contributor
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"??!? :eek:
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:
 
S

Spacerat

Gast
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:
Java:
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:
Code:
2.9999999999999996
3.0
@0x7F800000: Was ist ein Zehnmillionenmillardstel? :D
 
Zuletzt bearbeitet von einem Moderator:

musiKk

Top Contributor
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

Aktives Mitglied
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 :D

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

Calculate any Logarithm
 

0x7F800000

Top Contributor
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 :D
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

Aktives Mitglied
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 ;).


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

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 ;)

Der Frequenzenrechner ist auch lustig^^ :)
Danke vielmals :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Potenzieren mit rationalen Potenzen ohne Math.pow Allgemeine Java-Themen 16
Arif Math.cos liefert komische Werte Allgemeine Java-Themen 8
T Math.random Allgemeine Java-Themen 9
Javafan01 Deklarieren einer Math.random() Zufallszahl Allgemeine Java-Themen 16
O Best Practice Laufzeitvergleich Math.sqrt() aus Java und sqrt() aus C++ Allgemeine Java-Themen 1
J Methoden Math.abs Allgemeine Java-Themen 3
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J Commons Math 3.0 Multiple Regression Allgemeine Java-Themen 4
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
U Math.Random anders verteilen Allgemeine Java-Themen 4
H Math.acos(10) => NaN Allgemeine Java-Themen 11
E Warum kann Math nicht instanziert werden? Allgemeine Java-Themen 17
h0b0 WTF? - Problem mit Math.pow() Allgemeine Java-Themen 6
A Wird Math.sin bzw. sinus auf Maschinencode abgebildet Allgemeine Java-Themen 6
isowiz Unerklärliches Problem mit Math.pow :( Allgemeine Java-Themen 4
M Math-String-Formel berechnen lassen Allgemeine Java-Themen 4
C Math.random() vs Random Allgemeine Java-Themen 5
S Random() vs Math.random Allgemeine Java-Themen 4
H Math.random() Allgemeine Java-Themen 3
D java.lang.Math fehlerhaft? Allgemeine Java-Themen 18
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
X Wie kann ich meine Stdlib in Intelliji benutzen? Allgemeine Java-Themen 3
B Wie kann ich meine Pläne am besten umsetzen? Allgemeine Java-Themen 2
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
Thallius Warum ist meine private porperty public? Allgemeine Java-Themen 7
V Threads Weshalb funktionieren meine Threads nicht? Allgemeine Java-Themen 2
A Eine Spezifikation für meine Bachelorarbeit! Allgemeine Java-Themen 3
B Schnittstelle von Facebook zu Java(Eclipse) für meine Internetseite Allgemeine Java-Themen 20
S import meine.eigenes.import Allgemeine Java-Themen 6
Luk10 Factory auf meine Situaion anwendbar? Allgemeine Java-Themen 14
S HTML => DOM - Welcher Parser für meine Zwecke? Allgemeine Java-Themen 3
S ThreadPoolExecutor: wie stelle ich fest dass meine Threads im Pool mit ihrer Arbeit fertig sind? Allgemeine Java-Themen 3
D Ich möchte meine *.java Dateien in Applets "umschreiben. Aber wie? Allgemeine Java-Themen 3
B log4j löscht meine Logdateien Allgemeine Java-Themen 2
E JFreeChart jars mit in meine Jar packen Allgemeine Java-Themen 6
T NetBeans: Ist meine Konfiguration falsch? Allgemeine Java-Themen 7
M Windows: Start --> Ausführen --> [url]http://meine.url.com[/url] Allgemeine Java-Themen 3
J Was ist genauer: Thread.sleep() oder meine Variante? Allgemeine Java-Themen 64
E Was ist ein gutes Design fuer meine Programm? Allgemeine Java-Themen 3
S Ich verstehe meine Java-Version nicht Allgemeine Java-Themen 6
P meine selectAll methode makiert text nicht? Allgemeine Java-Themen 9
S Paar Infos für meine Dokumentation. Allgemeine Java-Themen 5
H Java mag meine Klasse nicht, Identifier expected Allgemeine Java-Themen 6
T Soll ich meine Software als freeware zum download geben? Allgemeine Java-Themen 15
D Laufen meine alten progs auf java 5 noch? Allgemeine Java-Themen 7
P Welches JRE braucht meine Applikation? Allgemeine Java-Themen 3
B Meine Hausaufgaben... Allgemeine Java-Themen 14
S meine java laufschrift funzt auf meinem NB teilweise schrott Allgemeine Java-Themen 2
R Java rechnent ungenau, problemlösung? Allgemeine Java-Themen 33
S currentTimeMillis() ungenau? Allgemeine Java-Themen 8
P Thread.sleep() ungenau??? Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben