Lowlevel
Lowlevel => Softwareentwicklung => Thema gestartet von: X-Mind am 02. January 2010, 22:51
-
Aloah
Mir war gerade langweilig, da Habe ich mir gedacht das ich jetzt ein möglichst plattformunabhängiges LIBC schreiben könnte.
(Ok, eigendlich ist es mir nicht langeweilig, aber ich hänge beim multitasking)
Also, Was haltet ihr davon, und wer möchte mitmachen?
<assert.h> <float.h> <math.h> <stdarg.h> <stdlib.h>
<ctype.h> <limits.h> <setjmp.h> <stddef.h> <string.h>
<errno.h> <locale.h> <signal.h< <stdio.h> <time.h>
Das sind alle STD includes, oder giebt es mehr??
Hier mein Beitrag:(math.h)
// double sin(double x)
// double cos(double x)
// double tan(double x)
double asin(double sina)
{
// sina = Sinus Alpha
double sinx;
sinx = sina / 360 * (2 * 3.14159265358979323846264338327950); // Pi mit 32 Nachkommastellen
return sinx; // Sinus x ist gleich sinus Alpha / 360 * 2 * PI
}
// double acos(double x)
// double atan(double x)
// double atan2(double x, double y)
// double sinh(double x)
// double cosh(double x)
// double tanh(double x)
// double exp(double x)
// double log(double x)
// double log10(double x)
// double pow(double x, double y)
double sqrt(double zahl)
{
double wurzel;
wurzel = (zahl * zahl);
return wurzel;
}
// double ceil(double x)
// double floor (double x)
double fabs(double x)
{
double abs;
if (x < 0)
{
abs = 2 * x;
}
else
{
return x;
}
return abs;
}
// double ldexp(double x,n)
// double frexp(double x, int *exp)
// double modf(double x, double *ip)
// double fmod(double x, double y)
das steht natürlich nicht in math.h, sondern wird zu math.o kompiliert
die ganzen *.o dateien Bündeln wir dann mit ar (oder ld) zu einer *.a datei und fertig ist die Homemade LIBC.
MfG X-Mind
Changelog:
sqrt() wurde jetzt so verändert, das es nicht das Quadrat der Zahl, sondern die Quadratwurzel zurüchliefert (Danke XanClic)
-
Nur nebenbei: Es gibt schon Leute, die sich an einer plattformunabhängigen libc versucht haben (z. B. Newlib, theoretisch afaik sogar glibc). Das Problem ist nur, dass die nicht sehr einfach zu portieren sind (vor allem glibc nicht), deshalb wünsche ich dennoch viel Erfolg, ich wollte nur mal gesagt haben, dass es solche Libs schon gibt. :wink:
Das größte Problem ist dabei wohl, dass du irgendein Interface zum Betriebssystem brauchst. Viele existierende libcs gehen da von POSIX-Sachen aus (also z. B. open, close, read, write, fork, ...). Du kannst dir natürlich selbst was überlegen, das Problem ist aber immer, dass du mit den Sachen möglichst alle Funktionen aufbauen können musst und dennoch möglichst portabel bleibst. Das ist zumindest das größte designtechnische Problem. Das größte wirkliche Problem ist natürlich das Schreiben des Codes, weshalb ich mit paloxena2 jetzt ein OS schreibe, dessen Syscalls die gleichen wie die von Linux sind, damit ich dessen libc gleich mit nutzen kann. :wink:
Und zur Frage, ob es noch mehr gibt: Ja. Da gibt es sys/types.h, sys/wait.h, unistd.h, fcntl.h und jede Menge mehr - das gehört zwar strenggenommen nicht mehr zur libc, sondern zu POSIX, aber so gut wie jedes Programm, das ich kenne, nutzt nicht nur die stdlibc, sondern POSIX gleich mit. Und zur libc im engeren Sinn würde auch noch stdint.h gehören, so auf den ersten Blick. Ach, und stdbool.h. Hm, kann man ja alles bei WP nachlesen: http://en.wikipedia.org/wiki/C_standard_library#ISO_C_library_headers :-D
EDIT: Öhm, btw, das ist keine Wurzel, was dein sqrt da macht. Das gibt das Quadrat der Zahl zurück, aber nicht die Quadratwurzel.
EDIT2: Ui, dein fabs ist auch falsch. Das sollte nicht "2 * x" sondern eher "-x" heißen. Und asin() ist btw. nicht "Sinus Alpha", sondern der Arcussinus. Und ob man den so einfach berechnen kann, bezweifle ich (wobei ich grad nicht weiß, wie man ihn "wirklich" berechnet).
-
EDIT2: Ui, dein fabs ist auch falsch. Das sollte nicht "2 * x" sondern eher "-x" heißen. Und asin() ist btw. nicht "Sinus Alpha", sondern der Arcussinus. Und ob man den so einfach berechnen kann, bezweifle ich (wobei ich grad nicht weiß, wie man ihn "wirklich" berechnet).
Mit der FPU natürlich. ;)
-
Ok, gut ich meinte ja nicht das es eine möglichst protzige, aufgeblähte Bibliothek werden soll, sie soll nur möglichst unabhängig von dem os Sein, Natürlich ist es mir klar das komplette unabhängigkeit unmöglich ist
@XanClic
Ich glaube du verstehst da was falsch
double asin(double sina)
{
// sina = Sinus Alpha
double sinx;
sinx = sina / 360 * (2 * 3.14159265358979323846264338327950); // Pi mit 32 Nachkommastellen
return sinx; // Sinus x ist gleich sinus Alpha / 360 * 2 * PI
}
Als Sinus Alpha bezeichnet man in einem rechtwinkligen Dreieck den Winkel
von Ankathete b und Hypotenuse c.
(http://upload.wikimedia.org/wikipedia/commons/5/56/RechtwinkligesDreieck.svg)
EDIT:
So berechnet man den Arkussinus:
_a_
Sin X = 360° x 2PI
-
sin(α) bzw. sin(alpha) wird normalerweise nicht mit sina abgekürzt. asin steht für arcsin und ist der Arkussinus. Und der berechnet sich zum Beispiel wie hier beschrieben: http://de.wikipedia.org/wiki/Arkussinus_und_Arkuskosinus#Reihenentwicklungen Wenn die FPU eine Funktion bereitstellt, die als Näherung in Hardware zu berechnen, dann kann man die natürlich auch nutzen. Deine Formel hingegen rechnet nur einen Winkel, der in Grad angegeben ist, ins Bogenmaß um.
-
Als Sinus eines Winkels bezeichnet man das Verhältnis von Gegenkathete und Hypotenuse. Aber asin() berechnet nicht den "Winkel von Alpha", sondern den Arkussinus, die Umkehrfunktion des Sinus. asin() übergibt man also dieses Verhältnis und es liefert den Winkel.
Wenn du so eine einfache Funktion zum Berechnen entwickelt hast, dann bekommst du demnächst bestimmt einen Nobelpreis. Wikipedia weiß davon nämlich noch nichts (s. hier (http://de.wikipedia.org/wiki/Arkussinus_und_Arkuskosinus#Reihenentwicklungen) oder hier (http://de.wikipedia.org/wiki/Arkussinus_und_Arkuskosinus#Kettenbruchdarstellung_des_Arkussinus)).
-
Als Sinus eines Winkels bezeichnet man das Verhältnis von Gegenkathete und Hypotenuse. Aber asin() berechnet nicht den "Winkel von Alpha", sondern den Arkussinus, die Umkehrfunktion des Sinus. asin() übergibt man also dieses Verhältnis und es liefert den Winkel.
Ok, dan war das ein Denkfehler.
Ich dachte immer das der Arkussinus die Länge des Bogens zurückgiebt
Also sowas
(http://beleidigungen.be.ohost.de/Hosting/X-Mind/M2.5b1.gif)
-
Das macht arcsin auch. Nur gibt man im keinen Winkel als Argument sondern 'sin(⍺)'.
Wobei: Länge des Bogens = Winkel[im Bogenmaß]
-
Ok, wenn es schon nicht stimmt dan helft es zu verbessern
-
Die libm im tyndur-Repository (http://git.tyndur.org/?p=tyndur.git;a=tree;f=src/modules/lib/stdlibc/math;h=b772d484f817c5558b702413e2bda18b71150c26;hb=HEAD) sollte soweit korrekt sein, wenn auch nicht ganz vollständig.
-
@taljeth
Cool, macht ihr das direkt über die FPU??
und nochmal THX an alle die mich berichtigt haben(Noob-wissen hald).
-
Nicht die FPU zu nehmen wäre ziemlicher Blödsinn.