Autor Thema: LIBC Implementieren  (Gelesen 6956 mal)

X-Mind

  • Gast
Gespeichert
« 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)
« Letzte Änderung: 03. January 2010, 14:13 von X-Mind »

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #1 am: 02. January 2010, 23:00 »
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).
« Letzte Änderung: 02. January 2010, 23:02 von XanClic »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 02. January 2010, 23:13 »
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. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

X-Mind

  • Gast
Gespeichert
« Antwort #3 am: 03. January 2010, 13:49 »
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.



EDIT:

So berechnet man den Arkussinus:
           _a_
Sin X = 360° x 2PI
« Letzte Änderung: 03. January 2010, 13:54 von X-Mind »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 03. January 2010, 14:01 »
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.
Dieser Text wird unter jedem Beitrag angezeigt.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #5 am: 03. January 2010, 14:03 »
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 oder hier).

X-Mind

  • Gast
Gespeichert
« Antwort #6 am: 03. January 2010, 14:30 »
Zitat
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


MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 03. January 2010, 15:00 »
Das macht arcsin auch. Nur gibt man im keinen Winkel als Argument sondern 'sin(⍺)'.

Wobei: Länge des Bogens = Winkel[im Bogenmaß]
« Letzte Änderung: 03. January 2010, 15:04 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

X-Mind

  • Gast
Gespeichert
« Antwort #8 am: 03. January 2010, 17:48 »
Ok, wenn es schon nicht stimmt dan  helft es zu verbessern

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 03. January 2010, 18:07 »
Die libm im tyndur-Repository sollte soweit korrekt sein, wenn auch nicht ganz vollständig.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

X-Mind

  • Gast
Gespeichert
« Antwort #10 am: 04. January 2010, 14:17 »
@taljeth

Cool, macht ihr das direkt über die FPU??

und nochmal THX an alle die mich berichtigt haben(Noob-wissen hald).

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 04. January 2010, 15:54 »
Nicht die FPU zu nehmen wäre ziemlicher Blödsinn.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen