Forum: Compiler & IDEs math.h


von Markus Adameck (Gast)


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?

von Notker (Gast)


Lesenswert?

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

von Markus Adameck (Gast)


Lesenswert?

ich würde mich freuen, wenn mir jetzt noch jemand sagen könnte, welche 
Funktion das sein könnte....

von Notker (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Peter K. (Gast)


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

von Peter K. (Gast)


Lesenswert?

:-(
sehe ich grade: y+=ln2 und y-=ln2 müssen getauscht werden.

Peter

von Markus Adameck (Gast)


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.

von BAB (Gast)


Lesenswert?

also ich habe mal die math fuktionen in winavr3.3 getestet...

drunter fallen log, log10, cos, sin, tan...funktionieren alle 
einwandfrei...

von BAB (Gast)


Lesenswert?

heute habe ich mal pow(x,y); benutzt funktioniert auch bestens..:)...

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
Noch kein Account? Hier anmelden.