pow() mit ATmega32 ; Problem bei berrechnung

Gast #736274
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
Gast #736362
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
Gast #737998
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
#738697
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.
#739189
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
#739298
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
#739305
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.
#739334
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.
#743519
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

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