mikrocontroller.net

Forum: Compiler & IDEs pow() mit ATmega32 ; Problem bei berrechnung


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
double SDD = 0.0;
double SDDpow = 0.0;
double SDDx = 10.0;
double SDDy = 0.5;


double SDD_fkt (void)
{
  SDDpow = pow(SDDx, SDDy);
  return  SDD = 6.1078 * SDDpow;
}


//***************************

Kann mir jemand erklären warum ich bei den Werten SDDx = 10 und SDDy = 
0.5 den Wert für "2" SDDpow bekomme? was läuft da schief? eigentlich 
müßte doch 3.16227.. herauskommen.

Wenn ich die Werte SDDx = 10 und SDDy = 2 einsetze, bekomme ich für 
SDDpow "64".  was läuft da schief? eigentlich müßte doch 100 
herauskommen.

Was läuft bei mir schief? oder kann man keine Flieskomma zahlen mit 
pow(); berechnen???

Meine Berechnung die ich machen wollte liegt so im bereich von
 SDDpow = 10^(0,0310)  bis  SDDpow = 10^(0,787).  Oder kann man das noch 
anderst ausrechnen?


Gruß Andreas

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welche Umgebung, welcher Prozessor?
hast Du
#include <math.h>
gemacht?

evtl. Umweg über Multiplikation der Logarithmen

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste mal den kompletten Code... koennte ein Fliesskommaproblem sein. 
Was genau willst Du denn alles berechnen? Kannst Du die Parameter 
eingrenzen? Dann gibt es vielleicht alternative Moeglichkeiten, z.B. 
eine Reihenentwicklung.

Michael

Autor: 2923 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So'n Problem kann man doch im Simulator Singlesteppen....

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich will einen ATmega32 mit dem AVRStudio und dem GCC-Complier 
programmieren. Als Emulator habe ich den AVR-Dragon.

Gruß Andreas

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt alles als Funktion geschrieben,  die Berrechnung 
funktioniert auch in einem kleinen Testprofjekt, nur wenn ich die 
Funktion dann in das eigentliche Projekt einfüge, eght die berrechnung 
irgendwie schief. Mal schauen, vielleicht finde ich das Problem noch in 
dem Projekt.

Gruß Andreas

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja gut wenn Du keinen Code posten willst kann ich Dir nicht helfen. 
Dann noch viel Erfolg.

Michael

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, hab den fehler gefunden. In der ISR der Analogmessung ging wohl 
irgendetwas schif.

Aber trotzdem Danke für eure Schnellen Antworten.

Gruß Andreas

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann verstehe ich aber den Zusammenhang ueberhaupt nicht... aber wie 
auch, ohne Code. Das naechste mal, wenn Du postest, sei mal bitte 
ausfuehrlich genug, dass man helfen kann.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen, das Problem ist noch nicht ganz weg.

Wenn ich im Programm diese Zeile aktiviere geht die Berrechnung wieder 
schief:
gemesseneSpannungFeucht = FeuchtigkeitADwert;

Die Daten Typen sind (float = int):
float gemesseneSpannungFeucht = 0;
int   FeuchtigkeitADwert      = 0;

Muß ich da ein Type-Cast machen oder?
gemesseneSpannungFeucht = (float)FeuchtigkeitADwert;

aber mit dieser Zeile funtioniert es auch nicht. Was mach ich da falsch?

Gruß Andreas

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CODE ... ohne geht nix -.-

Autor: Andreas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

hier hab den Code auf das wesentliche Problem reduziert, ich hoffe es 
kann mir jemand helfen.

Gruß Andreas

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann das Problem jemand nachvollziehen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs mal duchgesteppt.

SDD = pow(SDDx, SDDy);

SDDX ist 10
SDDY ist 0.583045646

Das Ergebnis von pow ergibt sich zu 1.0005536

Laut Taschenrechner sollte es aber 3.828549 rauskommen.

Hmmm....

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Komentier mal diese Zeile aus:

// return gemesseneSpannung = (double) TemperaturADwertxx / 5;

dann müßte das Richtige Ergebniss raus kommen.


Hab ich da ei Problem mit den Daten-Typen?

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas wrote:
> Komentier mal diese Zeile aus:
>
> // return gemesseneSpannung = (double) TemperaturADwertxx / 5;
>
> dann müßte das Richtige Ergebniss raus kommen.
>
>
> Hab ich da ei Problem mit den Daten-Typen?

Nein.
Das interessante ist, dass diese Funktion noch nicht mal
aufgerufen werden muss. Die blose Anwesenheit dieser
Funktion genügt.
Sieht tatsächlich nach einem Compilerfehler aus.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, hat jemand eine Idee wie man das Problem lösen kann?

Gruß Andreas

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab das jetzt nicht weiter untersucht, was die genaue
Ursache dafür ist.

Aber hast du schon versucht, dir selbst eine pow() Funktion
zu schreiben?

  pow(x,y) = exp( log(x) * log(y) )

Autor: Uwe Nagel (ulegan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst die libm dazulinken!
Unter Program - Configuration Options - Libraries die libm.a auswählen, 
dann klappts auch mit der power...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Uwe Nagel (ulegan)

>Du musst die libm dazulinken!
>Unter Program - Configuration Options - Libraries die libm.a auswählen,
>dann klappts auch mit der power...

OK, aber was landet denn OHNE das Linken der libm in den Funktionen? 
Eigentlich dürfte der Linker doch gar nicht durchlaufen, weil die 
Funktionen fehlen? Oder stecken in den "Standardroutinen" mieserable, 
buggy Gerüste drin, damit es wenigstens fehlerfrei gelinkt wird? Das 
wäre ziemlich link :-(

MFG
Falk

Autor: Uwe Nagel (ulegan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dsa sollte uns mal einer der C-Gurus erklären...
Lass mal ein Listfile erzeugen. Dann siehst du, dass sehr wohl auch ohne 
libm die Fliesskomma-Funktionen eingebunden werden. Allerdings eine 
andere, sogar größere, Version. Die pow() Funktion ist allerdings auf 
den ersten Blick identisch und macht fast dass, was Karl heinz Buchegger 
vorschlägt:
pow(x,y) = exp( log(x) * y )

Mit der auskommentierten Zeile geht es dann schief, wenn die übergebene 
Variable verwendet wird. Ein einfaches
return (double) gemesseneSpannung;
erzeugt den Fehler nicht!
Es wird aber bis dahin identischer Code erzeugt????

Gruß
Uwe

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uwe Nagel wrote:
> Du musst die libm dazulinken!
> Unter Program - Configuration Options - Libraries die libm.a auswählen,
> dann klappts auch mit der power...

Nein. Hab ich definitiv probiert bzw. ich hatte die libm definitiv
drinnen.
Der Fehler ist eigenartig. Die Funktion mit der vorgeschlagenen
Auskommentierung muss noch nicht mal aufgerufen werden um den
Fehler zu erhalten.
Normalerweise würde ich mal auf Stackoverflow oder sowas tippen.
Aber der Mega32 ist ja mit dem Testprogramm praktisch leer.

Autor: Uwe Nagel (ulegan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann den Effekt nur ohne libm nachvollziehen. Mit libm geht es mit 
und ohne Auskommentierung. Mit Auskommentierung wird der Typecast 
(double) in der Funktion TemperaturBerechnung nicht verwendet. Das ist 
die einzige Verwendungsstelle des Typecasts im ganzen Programm. Im 
erzeugtem Code  steht dann komischerweise die Funktion <__floatsisf> 
(das ist der Typecast) an anderer Stelle in den Fliesskomma-Funktionen 
und sieht auch anders aus. Seltsam...
Mit libm gehts (jedenfalls in meinem Simulator) immer, die 
Fliesskomma-Bibliothek sieht ganz anders und vorallem viel kürzer aus.
Es hat schon seinen Grund, dass in den Standard Makefiles von Win-AVR 
die libm immer eingebunden wird.
Ich verwende WinAVR-20070525 und AVR-Studio 4.13Build 557.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe.

Für was stehen die Libaries "libc.a" und "libm.a"?
Ist "libm.a" für Mathematik Funktionen?
Muß ich die "libc.a" auch einbinden?

Gruß Andreas

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
???

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat jemand eine Antwort auf die Frage?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AFAIK ist die libc.a die Standard-C Library, die sowieso
immer mit eingebunden wird.
Die libm.a enthält die Mathematischen Funktionen. Grob gesagt:
alles was in math.h drinnen ist. Darüber hinaus ist es immer
gut, die libm.a anzugeben, wenn floating pointer verwendet wird.

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.