math.h

Gast #6314
Lesenswert?

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?
Gast #6317
Lesenswert?

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
Gast #6319
Lesenswert?

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
Gast #6321
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren