Forum: Compiler & IDEs pow() funktioniert nicht mit Zuweisung


von rubbellos (Gast)


Lesenswert?

Hi,

ich möchte 10^x berechnen. Dazu benutze ich AVR Studio 5, ATMega16 und 
math.h.

pow(10,2), pow(10.0,5.0) funktioniert problemlos.
Auch pow(10, variable) geht, aber sobald ich eine Zuweisung mache mit:
1
double temp1=1;
2
double temp2=2;
3
temp1=pow(10, temp2);
klappt es nicht mehr.

Der Fehler den das AVR Studio auswirfst lautet:

Error  7  R_AVR_13_PCREL against symbol `__addsf3' defined in .text 
section in c:/program files (x86)/atmel/avr studio 5.0/avr 
toolchain/bin/../lib/gcc/avr/4.5.1/avr5\libgcc.a(_addsub_sf.o) 
/home/tools/hudson/workspace/avr8-gnu-toolchain/src/avr-libc/libm/fplib/ 
log.S   96  1  RF-Powermeter


Error  8  R_AVR_13_PCREL against symbol `__addsf3' defined in .text 
section in c:/program files (x86)/atmel/avr studio 5.0/avr 
toolchain/bin/../lib/gcc/avr/4.5.1/avr5\libgcc.a(_addsub_sf.o) 
/home/tools/hudson/workspace/avr8-gnu-toolchain/src/avr-libc/libm/fplib/ 
log.S   100  1  RF-Powermeter


Error  9  R_AVR_13_PCREL against symbol `__divsf3' defined in .text 
section in c:/program files (x86)/atmel/avr studio 5.0/avr 
toolchain/bin/../lib/gcc/avr/4.5.1/avr5\libgcc.a(_div_sf.o) 
/home/tools/hudson/workspace/avr8-gnu-toolchain/src/avr-libc/libm/fplib/ 
inverse.S   50  1  RF-Powermeter


Error  10  R_AVR_13_PCREL against symbol `__subsf3' defined in .text 
section in c:/program files (x86)/atmel/avr studio 5.0/avr 
toolchain/bin/../lib/gcc/avr/4.5.1/avr5\libgcc.a(_addsub_sf.o) 
/home/tools/hudson/workspace/avr8-gnu-toolchain/src/avr-libc/libm/fplib/ 
modf.S   90  1  RF-Powermeter


Mit den Fehlern kann ich auch überhaupt nichts anfangen...

von Walter S. (avatar)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Dass du libm einbinden musst, hast du hoffentlich in der FAQ schon 
gefunden. (Punkt 2 in der FAQ)

Eine Anmerkung noch:
Du solltest dir gut überlegen, ob dein x in 10^x eigentlich immer eine 
ganze Zahl ist. Wenn nicht, dann geht es nicht anders. Aber für zb x^2 
ist pow mit Kanonen auf Spatzen geschossen. pow ist eine teure Funktion. 
Wenn es nicht sein muss, dann benutzt man sie nicht.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Es ist ein Problem in der avr-libc:

https://savannah.nongnu.org/bugs/?33698

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Dass du libm einbinden musst, hast du hoffentlich in der FAQ schon
> gefunden. (Punkt 2 in der FAQ)

Das hilf in den meisten Fällen; nämlich dadurch, daß Sprung-Offsets 
wieder klein genug werden, um in 13 Bits zu passen.

Allerdings hülft es nicht immer, da sich in den Quellen explizite 
RJMP/RCALL zu externen Modulen finden, deren Ablage nicht bekannt ist. 
Werden die so lokatiert, daß der Sprung sich als zu geizig erweist, kann 
der Linker nix anderes machen, als zu meckern.

Der Linker ist nicht in der Lage, kurze Sprünge zu langen zu relaxen; 
dazu müsste viel mehr Logik eingebaut werden, weil sich dadurch auch 
lokale Sprungoffsets ändern können und wegen des breiteren Code u.U. 
nicht mehr passen und der Linker diese ebenso nachflicken müsste.

D.h. auch in

SBRC 1,2
RJMP .label

Müsste das RJMP durch ein JMP ersetzt werden, was weitere 
Codevergrößerung bwirkt, usw, usw.

von rubbellos (Gast)


Lesenswert?

Ja genau das mit der libm.a hab ich grad selbst gefunden. Auch wenn es 
etwas gedauert hat, weil es bei mir keine Liste gab aus der ich wählen 
konnte, so wie ich es im Netz gelesen hab.

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.