Logarithmus implementieren?
-
das ist so nicht fair.
gebt sidewinder doch wenigstens gescheite schlüssel für google.@sidewinder:
du bist erst in der 10. klasse? uff! also programmiertechnisch hätte ich dich eigentlich ins späte studium eingestuft.evtl fehlen dir dann zu viele begriffe, um "reihen" sauber einzuführen. kennste schon differenzieren? dann hift dir "taylor-reihe" weiter. kannste es noch nicht, aber es fix lernen? dann auch.
-
Danke fürs Lob Und trotzdem trau ich mich schon an GUI-Programmierung :p:)
Ich werd mir das Differenzieren Beibringen versuchen
MfG SideWinder
-
Hallo
EDIT: Sehe grad dein letztes Post. Ich dachte 10 Klasse Österreich == 13. Klasse Deutschland. Und trotzdem nocht keine Analysis gehabt ? Naja vielleicht ist folgendes trotzdem nützlich.
SideWinder schrieb:
Verzeihung aber von Reihenentwicklung hat man hier in der *in deutsche einheit umrechne* 10. Klasse keine Ahnung, geometrische Reihe hat wohl auch nur rein zufällig einen ähnlichen Namen
Geometrische Reihe reicht schonmal aus und mit Integration und Differentiation dürftest du wohl auch schon vertraut sein. Das reicht vielleicht aus um das folgende nachvollziehen zu können. (Und meiner Meinung nach ist es besser eine Herleitung mal gesehen zu haben als stur Formeln anzuwenden)
Es soll eine Reihe für ln(1+x) hergeleitet werden wobei ln der natürliche Logarithmus ist und die Reihe für alle x mit -1<x<1 konvergiert. Das reicht aus um die Logarithmen in bel. Basen und bel. Werte zu berechnen.
Nun gut. Für die Ableitung von ln(1+x) ergibt sich:
Im vorletzten Schritt wurde einfach verwendet, dass für die unendliche geometrische Reihe gilt
und zwar für alle a mit -1<a<1.Diese Reihe ist eine sog. Potenzreihe die gliedweise differenziert und integriert werden dürfen. D.h. wir können die "Summanden" der Reihe einzeln integrieren und erhalten:
für |x|<1Jetzt kannst du den ln einer Zahl näherungsweise berechnen.
Andere Basen erreichst du natürlich mit:
Für größere Zahlen ist folgende Umrechnung nützlich:
Sei
Dann ist
$
für alle x>0.Beweis: Einsetzen und ausrechnen
Warum ist das hilfreich ?
Ganz einfach:
ist eine natürliche Zahl und kann durch wiederholtes Teilen durch 2 errechnet werden,
ist eine Konstante und für
kannst du obige Reihe verwenden.Soviel dazu.
Es ist einfach zu implementieren. Ob es dir genau genug ist musst du selbst wissen. Dass es effizientere Verfahren gibt ist ziemlich sicher....kennen tue ich aber keins davon
Gruß, space
-
Nein ich meine damit die 10. Klasse bei euch == 6. Klasse in österreichischen Schulen == 2. Klasse HTL.
Steht doch sogar drin, dass ich bereits umgerechnet habe
Werde mir deinen Weg morgen ansehen, jetzt ist es mir zu spät um mich mit solch hoher Mathematik auseinanderzusetzen
MfG SideWinder
-
SideWinder schrieb:
Steht doch sogar drin, dass ich bereits umgerechnet habe
Ich seh's.
Sorry, liegt am Bier
-
hier noch ein link zum thema
http://www.mathematik.ch/anwendungenmath/logarithmen/bin grad in ähnlichem am lernen..
-
-
Falls Du nur eine Ganzzahl-Abschätzung für den Zweierlogarithmus brauchst, genügt folgende Funktion:
int ldapprox(BIGINT zahl) { int log2 = 0; BIGINT potenz = 1; while(zahl <= potenz) { potenz << 1; /* oder potenz *= 2 (langsamer?) */ ++log2; } return log2 - 1; }
-
potenz *= 2 ist langsamer als potenz << 1, allerdings ist es irrelevant, was man schreibt, da das sowieso umoptimiert wird.
-
Also den Compiler würde ich schlagen, der mir "*= 2" in "<< 1" umoptimiert :p .
-
Kleiner Flüchtigkeitsfehler:
potenz <<= 1;
Hoffentlich ist der Operator <<= auch für BIGINT implementiert!