mikrocontroller.net

Forum: Compiler & IDEs math.h


Autor: Markus Adameck (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Notker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus Adameck (Gast)
Datum:

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

Autor: Notker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter K. (Gast)
Datum:

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

Peter

Autor: Markus Adameck (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: BAB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich habe mal die math fuktionen in winavr3.3 getestet...

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

Autor: BAB (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.