Ich hab mich nochmal an meinen "mini Rechner" gesetzt und festgestellt dass unter anderem die Phytagoras-Berechnung fehlt. Wollte das ganze ohne den math.h machen.
Naja, du könntest inline ASM nutzen und das Zeug somit berechnen.
Code:
int main()
{
auto a = 2 * 2;
auto b = 3 * 3;
auto c = a * b;
double c_root = 0.0f;
__asm
{
fild c;
fsqrt;
fst c_root;
}
}
Ist jedoch ziemlich unflexibel und lässt sich nur mit vergleichbar viel Aufwand erweitern. Abgesehen davon ist das der totale Overkill! Was spricht gegen math.h?
Ansonsten gibt es für sin, cos, sqrt und Konsorten afaik auch gute Näherungspolynome. Muss es denn so dermaßen exakt sein, dass du in deiner Schleife so kleinschrittig vorgehst? Nicht umsonst rechnen Physiker nicht genauer, als sie messen können
Näherungspolynome sind eher ungeeignet. Man entwickelt hier um einen bestimmten Punkt und erhält dann für genau diesen Punkt genaue Ersatzpolynome. Werte, die weiter weg von diesem Punkt liegen kriegen einen mehr oder weniger großen Fehler mit. Das hängt zum einem vom Grad des Ersatzpolynoms ab zum anderen kommts auch wirklich drauf an, wie weit weg man vom Entwicklungspunkt ist. Iterationsverfahren sind hier weitaus komfortabler.
Bei Sinus (und cos dann auch) verhält sich das nochmal anders. Hier herrscht eine engere Verbindung zur e-Funktion, sprich man kann einen sinus 1:1 in eine Kombination aus e-Funktionen übersetzen. Zum programmieren hilft das allerdings auch nicht wirklich weiter.
Ich werbe an dieser Stelle nochmal für das Heronverfahren ;O
Ist dir die Rekursion bekannt? Wenn nein, solltest du es evtl. so machen, wie du es bisher gemacht hast.
Code:
double x(n, a)
{
double y = 0;
if (n == 0) // für x(0) kann man a nehmen, statt x(n) + a / x(n) können wir hier also a + a / x einsetzen
y = a;
else
y = x(n - 1, a); // y ist das Ergebnis von x(n -1)
return (y + a / y) / 2; // y in die Formel einsetzen
}
Schwierig zu verstehen, das stimmt. :/
Über eine Iteration ist es evtl. einfacher:
Code:
double wurzel = 0;
for (int i = 0; i < MAX_DURCHLAUF; i++) {
if (i == 0) // wenn es der erste Durchlauf, also x(0) ist
wurzel = (buffer + 1) / 2;
else
wurzel = (wurzel + buffer / wurzel) / 2; // x(nächstes) = (x(aktuelles) + a / x(aktuelles)) / 2
}
printf("Die Wurzel von c beträgt %lf", wurzel);
Keine Ahnung, ob das klappt, hocke hier gerade in der Vorlesung.
Näherungspolynome sind eher ungeeignet. Man entwickelt hier um einen bestimmten Punkt und erhält dann für genau diesen Punkt genaue Ersatzpolynome. Werte, die weiter weg von diesem Punkt liegen kriegen einen mehr oder weniger großen Fehler mit. Das hängt zum einem vom Grad des Ersatzpolynoms ab zum anderen kommts auch wirklich drauf an, wie weit weg man vom Entwicklungspunkt ist. Iterationsverfahren sind hier weitaus komfortabler.
Bei Sinus (und cos dann auch) verhält sich das nochmal anders. Hier herrscht eine engere Verbindung zur e-Funktion, sprich man kann einen sinus 1:1 in eine Kombination aus e-Funktionen übersetzen. Zum programmieren hilft das allerdings auch nicht wirklich weiter.
Ich werbe an dieser Stelle nochmal für das Heronverfahren ;O
e-Funktion, trigonometrische Funktionen etc. werden vom Taschenrechner und PC alle über Taylor-Reihen berechnet. Die Wurzel kann man dann über diese grundlegenden Funktionen annähern.
Bei Sinus und Co kann ich mir noch vorstellen, dass mit Taylorpolynomen das ganze ausgerechnet wird. Hier genügt es ja eine Periode anzunähern. Werte größer 2pi oder kleiner 0 kann man dann immer auf diese Periode abbilden.
Bei "komplexeren" Funktionen bin ich mir nicht ganz sicher. Die zu verwendenden Taylopolynome müssten hier schon von höherer Ordnung sein, um genaue Ergebnisse zu bekommen. Das Heron-Verfahren wäre im Beispiel der Wurzelfunktion imho einfacher und genauer. Aber ich kenne das Problem mit dem Verschlafen..
Kommt drauf an was du mit komplexeren Funktionen meinst. Im Prinzip ist es doch meistens möglich, eine Funktion durch sin, cos, exp oder log anzunähern. Zu denen kennt man die passenden Reihen-Entwicklungen und somit kann man dann alles in vergleichsweise wenig Iterationsschritten recht genau berechnen.
Wobei mir das Heron-Verfahren eig ganz gut gefällt. Nur gibt es eben nicht immer für jede komplexe Funktion eine so "einfache" Iterationsvorschrift.
Naja im Gegensatz zu sin, cos, etc. die periodisch sind und man deshalb nur eine Periode annähern muss, muss man bei ln, e, etc. über den gesamten Definitionsbereich annähern. Und als Nutzer möchte ich dann natürlich genauso genaue ergebnisse für extrem kleine Werte, wie für extrem große Werte erhalten. Sprich mein Taylorpolynom müsste von höherer Ordnung als die gewohnten ersten zwei Glieder sein, die man so immer mal schriftlich ausrechnet. Ergebnisse auf 9Stellen genau sind meistens genug. Das schafft auch mein Taschenrechner. Jetzt müsste man eben ausrechnen, bis zur welchen Ordnung man entwickeln muss. Mein Gefühl sagt mir, dass das nicht wenig sein wird.
Den Aufwand könnte man sich eben durch z.b. ein Heron Verfahren sparen.
[Quest]math.cos und math.sin 08/22/2010 - Metin2 Private Server - 10 Replies Hallo, anscheinend kennt Metin2 die Funktionen math.cos und math.sin nicht, gibt es trotzdem eine Möglichkeit die irgendwie zu benutzen? (Für den DT ;))
iSRO Math 08/03/2009 - Silkroad Online - 30 Replies Close
Math/var help 07/02/2009 - CO2 Private Server - 1 Replies Ok simplifying this post alot.
How do I transfer things already loaded into the source from a database into the useitem area?
Maybe I'm over complicating things but I am not able to do it..
In my Database.cs I have Struct.SPoints Port = new Struct.SPoints(); loading in things from the database. I need a way to apply those values to a similar code in UseItem.cs where I have my public static void ScrollPointTele(int PointId, int MapEnd, int PointX, int PointY, ClientSocket CSocket)
Any good at math 12/11/2006 - Eudemons Online - 3 Replies Ok I posted a mesage earlier saying im wanting to hack this game. If you want email me for the VB code and i will send you a sample program (not compiled so its 100% virus free) to help you adjust game values. My program will be more usefull however when I find the real address for the character position. Now in replies to my earlier posts some dummy tried saying rotate 45 degrees bla bla bla. I've tried this and still havent got it right. Besides if you notice as you walk around there are no...