Hallo! Ich habe ein Problem mit dem avrgcc 3.2 und math.h Ich benötige für Temperaturfühlerkennlinienberechnungen den Logarithmus. Also hab ich math.h inkludiert, da es ja da die funktion log(double) gibt. Nur beim kompilieren meckert dann der gcc, daß die Funktion nicht existieren würde. Auf Wunsch poste ich auch nochmal die genaue Fehlermeldung. Woher kommt denn das? Ich kann übrigens keine Funktion der math.h verwenden, nur die Konstanten (PI, usw) funktionieren. Getestet habe ich auf ATMega163 und AT90S4433 (bzw versucht für die beiden uC zu kompilieren). Jemand ne Idee, wieso die Funktionien nicht gehen?
Das ist ein bekannter Bug des avrgcc. log10 funktioniert z.B. auch nicht. Hier muss man sich selbst helfen, indem man den Logarithmus durch eine äquivalente Funktion ersetzt. Notker
ich würde mich freuen, wenn mir jetzt noch jemand sagen könnte, welche Funktion das sein könnte....
Da gibt es mehrere Möglichkeiten. Eine davon wäre z.B. eine Annäherung mit einer Taylor-Reihe, die man, je nach erforderlicher Genauigkeit, bei beliebigen Koeffizienten abbrechen kann. Oder man könnte auch mittels der Eulerschen Formel das Ganze aus Sinus und Cosinus berechnen. Der Phantasie des Mathematikers sind hier keine Grenzen gesetzt. Das sollen aber nur Vorschläge sein, denn viele Wege führen nach Rom. Vielleicht hat jemand ja auch eine bessere Idee. Notker
Am einfachsten wäre es eine Tabelle mit den Funktionswerten anzulegen und dazwischen ggf. linear zu interpolieren. So kann man sich außerdem die Verwendung von Gleitkommazahlen und damit eine Menge Speicherplatz sparen.
Ich halte es für einfacher in die Tabelle nur 2 Werte zu nehmen (0 und ln2 zum Beispiel). Aufpassen: bei x<=0 produziert man eine Endlosschleife... #define ln2 0.69314718056 /* Logarithmus a zur Basis b */ #define log(a,b) (ln(a)/ln(b)) float ln(float x) /* natürlicher Logarithmus */ { float y=0; while(x<1) { x*=2; y+=ln2; } /* Log-Gesetze */ while(x>2) { x/=2; y-=ln2; } return y+(x-1)*ln2; /* linear approx */ } Peter
danke für eure hilfe. aber ich habe die funktion der math.h zum laufen gebracht und daher brauche ich keine eigene schreiben. Wen's interessiert wie: Einfach libm.a dazulinken lassen und math.h ganz normal inkludieren.
also ich habe mal die math fuktionen in winavr3.3 getestet... drunter fallen log, log10, cos, sin, tan...funktionieren alle einwandfrei...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.