Laden...

genauere Math. Methoden

Letzter Beitrag vor 17 Jahren 12 Posts 4.673 Views
genauere Math. Methoden

Hi@all!

Gibt es ne Möglichkeit die Math. Methoden genauer zu machen. z.B. Math.Sin(x) gibt ein double-Wert zurück. Ich bräuchte aber decimal Genauigkeit; decimal a=(decimal)Math.Sin(x); bringt mir also nichts. Das x soll auch vom Datentyp decimal sein können...

-=MasterMax=-

Hallo MasterMax,

die Math-Methoden gibt es nur so, wie es sie gibt. Wenn du es genauer haben willst, musst du es selbst implementieren oder du guckst mal, ob es schon Bibliotheken von Dritten gibt, z.B auf www.codeproject.com

herbivore

Hallo,

ich dachte, ich hätte so etwas schon einmal auf einer deutschen Seite gesehen, finde es aber nicht mehr (und weiß auch nicht, ob es vielleicht unter Delphi war...).

Aber wie herbivore sagte, findet man bei **CodeProject **A Decimal Class Implementation, das könnte passen.

Gruß Jürgen

hmm..jo, der codeproject artikel geht is die richtige Richtung...aber wenn ich es richtig verstanden habe, wird da eine decimal-class für c++ geschrieben...
ne andere möglichkeit wäre ne für jede funktion ne methode zu schreiben, die die funktion genau nähert: für Math.Pow(a,b) wäre es leicht, so lange b eine natürliche zahl ist, aber wenn ich z.B. die Sinusfunktion nähern sollte, würde das exakte nähern viel zu lange dauern, weil ich ein paar tausend werte brauche

-=MasterMax=-

Hier kannst du dir aber mit Mathematik aushelfen,

Sin(x)=(e^(ix)-e^(-ix))/2i; Cos(x)=(e^(ix)+e^(-ix))/2

//edit: i ist die imaginäre Einheit i der komplexen Zahlen, wenn du nichts über komplexe Zahlen weißt dann ist die Möglichkeit für dich wahrscheinlich nicht das richtige, dann nimm die Taylor-Polynome, ansonsten ist e^(ix) ist ein Punkt im Einheitskreis der Gaußschen Zahlenebene, der der Bogenlänge x zugeordnet ist

oder eine allgemeine Näherungsformel:

f(x)=(Das ist ein Summenzeichen von i=1 bis Unendlich)*(f i mal abgeleitet von x)/i!

oder schau mal unter
http://de.wikipedia.org/wiki/Taylor-Formel

Bei der ersten Variante hast du das Problem das die Exponentialfunktion auch nur für Doubles definiert ist - also Problem verlagert, aber net beseitigt.

Würds wohl auch über die Reihe machen, du weißt ja wie genau der Decimal Wert ist und bis maximal dieser Nachkommastelle rechnest du halt mit dem Näherungspolynom. Was anderes wird bei den mathematischen Funktionen sonst auch net gemacht.

Baka wa shinanakya naoranai.

Mein XING Profil.

@talla: "genauere Math. Methoden" schließen ja wohl die Exponentialfunktion mit ein. Die kann man aber allerdings wirklich auch wieder nur mit der Reihe nähern

Ja okay, aber wenn die e-Funktion schon genähert ist, wird der Ausdruck zur Berechnung des Sinus auch net genauer 🙂

Deshalb würd ich doch eher auf unabhängige Reihen plädieren. Mehr Schreibarbeit, aber denke dürfte im Endeffekt besser sein.

Baka wa shinanakya naoranai.

Mein XING Profil.

Ja, sollte die bessere Variante sein, zumal man sich damit auch die hässlichen komplexen Zahlen spart

Aber Taylor-Reihen sind im Allgemeinen sehr genau (um genau zu sein, beliebig genau, je nach dem, wie groß man den Parameter werden lässt), und absolute Genauigkeit kann man mit Decimal sowieso nicht erreichen...

Danke für die Antworten!

Ich kenne die Formeln Sin(x)=(e^(ix)-e^(-ix))/2i; Cos(x)=(e^(ix)+e^(-ix))/2, aber ich habe sie nicht angewendet, wegen der ungenauigkeit von e^x.

Bei der Taylor-Reihe (die ich noch nicht kannte) habe ich

  1. die Befürchtung, dass sie zu langsam ist und
  2. habe ich keine Ahnung, wie ich schnell den Wert der Ableitung her bekomme...

-=MasterMax=-

Du brauchst keine Ableitungen 😉

Schau mal hier. Und von der Performance dürfts nicht kritisch sein da recht genau zu rechnen, jedenfalls dürfte das noch die schnellste Möglichkeit sein, den Sinus recht genau auszurechnen. Was glaubstn wie in Taschenrechnern die trigonometrischen Funktionen berechnet werden 🙂

Baka wa shinanakya naoranai.

Mein XING Profil.

  1. Musst du selber wissen, aber anders wird's kaum gehen. Bzw. musst mal probieren, bis zu welchem Laufindex du gehen musst...

  2. Bei ex ist die Ableitung ja wieder ex, sodass man, wenn man die Gleichung nach ex umstellt eine ziemlich gute Näherungsgleichung für ex rauskriegt:

ex~(Summe von i=0 bis sonstwohin)(<xi/i!)

Bei Sin(x) ist die Ableitung ja Cos(x), davon wieder -Sin(x) und so weiter, wenn du also eine Näherungsformel für die Umgebung von 0 berechnest hast du keine Probleme mit der Ableitung, weil die Periodisch ist (0;1;0;-1;0;1;-1;0...)

Mit einem Taylorpolynom 8. Grades kannst du so die Sinusfunktion auf

Sin(x)~x-1/6x^3+1/120x5-1/5720*x7 nähern können

//edit: 9 Minuten eher? 🤔