Forum: Mikrocontroller und Digitale Elektronik Problem beim Rechnen mit AVR + großen Zahlen


von Matthias (matthiasm)


Lesenswert?

Hallo zusammen,

ich möchte folgendes in meinem AVR Mega1284p berechnen:

1
double temp = 342309/8388607;
2
double intdb = 20*log10(temp);

Leider klappt das nicht...

Wenn ich 342309/8388607 mit dem Taschenrechner rechne und direkt 
einsetze klappt es allerdings:

1
double intdb = 20*log10(0.04080641756);

Es scheint also irgendwas bei der Division schief zu laufen. Nur was?

So klappt es leider auch nicht:

1
double intdb = 20*log10(342309/8388607);

Vielen Dank schon mal für Eure Mithilfe!!
Gruß
Matthias

von Matthias S. (matthias_s)


Lesenswert?

> double temp = 342309/8388607;


Die Division wird in int durchgeführt, entsprechend geht jeder 
Nachkommaanteil flöten. Probier mal

double temp = 342309/8388607d;

von holger (Gast)


Lesenswert?

>ich möchte folgendes in meinem AVR Mega1284p berechnen:
>
>double temp = 342309/8388607;
>double intdb = 20*log10(temp);
>Leider klappt das nicht...

Versuchs mal so:

double temp = 342309.0/8388607.0;
double intdb = 20.0*log10(temp);

Double ist beim AVR-GCC aber auch nur float.
Also Single Precision.

von Matthias (matthiasm)


Lesenswert?

Tatsächlich... logisch... heieiei...

So geht es nun:

1
double intdb = 20*log10(rta1/8388607.0);

Danke vielmals für die Hilfe!!

(rta1 entspricht dem oben genannten Wert)

So nun möchte ich den Wert auf dem Display ausgeben:

So gehts, jedoch ohne Nachkommastellen:

1
double(BUFFER, "VALUE: %d",(int)intdb);

bei %f, %lf kommt immer ein ? als Ausgabe...

z.B.:

1
double(BUFFER, "VALUE: %f",intdb);

Vielleicht könnt ihr mir dabei auch noch helfen?
Danke!

von Peter II (Gast)


Lesenswert?

Matthias M. schrieb:
> Vielleicht könnt ihr mir dabei auch noch helfen?

libm vergessen

von Matthias (matthiasm)


Angehängte Dateien:

Lesenswert?

Peter II schrieb:
> Matthias M. schrieb:
>> Vielleicht könnt ihr mir dabei auch noch helfen?
>
> libm vergessen

Ist bereits eingebunden ... siehe Screenshot.

von Matthias (matthiasm)


Lesenswert?

Habs gefunden, läuft nun.

Folgendes hat's gefixed: -Wl,-u,vfprintf -lprintf_flt -lm

Danke für den Hinweis, da wär ich ja nie drauf gekommen.

von Peter II (Gast)


Lesenswert?

Matthias M. schrieb:
> Ist bereits eingebunden

aber falsch, dort muss es ohne lib rein als nur m

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Matthias M. schrieb:
> Folgendes hat's gefixed: -Wl,-u,vfprintf -lprintf_flt -lm

Und DAS ist wirklich einfacher/logischer, als die Zahlen in Assembler 
kleinzuhacken?
(Ok, LOG müsste ich schauen, wie man Das berechnet, aber bis akut 40bit 
kann ich mir zusammen schreiben - wird aber eher selten gebraucht, 
zugegeben)

MfG

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.