Forum: Compiler & IDEs Kehrwert bilden?


von Hr V. (hr_vorragend)


Lesenswert?

Hallo,

Wenn ich beim AVR bisher Zahlen mit Kommastellen die relevant waren 
hatte, habe ich die Zahl mit 10^x Multipliziert und dann bei der AUsgabe 
das Komma richtig gesetzt.

Nun muss ich bei einer Berechnung einen Kehrwert einer Zahl > 1 bilden. 
Da kommt dann ja Zwangslaeufig was < 1 mit Komma raus. Wie kann ich das 
im AVR Speichern?

Wuerde sowas gehen?
x=879;
y = (1/x)*1000;

Ich denke da wuerde 0 rauskommen da der erste Teil der Multi 0 ist, 
richtig?


Gruss


H:V

von Εrnst B. (ernst)


Lesenswert?

Einfach umformen in y = (10^e / x);

in deinem Beispiel:

x = 879;
y = 1000/879;

dann ist y = 1; dargestellt mit deinem um 1000 verschobenen 
dezimalpunkt:
0.001;

Für mehr genauigkeit:
y = 1000000 / 879; // Achtung, 32bit int nötig!
y == 1137; // entspricht 0.001137

/Ernst

von Stefan (Gast)


Lesenswert?

1
int x = 879;
2
int y = (1/x) * 1000;          // geht nicht, Ergebnis = 0
3
float y = (1/(float)x) * 1000; // geht
4
float y = (1.0/x) * 1000;      // geht auch

von Hr V. (hr_vorragend)


Lesenswert?

@Ernst - hm einfach - da haette ich auch selber draufkommen muessen 
peinlich

Danke

@ Stefan
Gibt es im AVR GGC denn float?


Gruss

von Karl H. (kbuchegg)


Lesenswert?

> Gibt es im AVR GGC denn float?

Ja, gibt es.
Wenn es aber nicht unbedingt sein muss, verwende es
nicht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Karl heinz Buchegger wrote:

> Wenn es aber nicht unbedingt sein muss, verwende es
> nicht.

Kann man so allgemein auch nicht sagen.  Hängt einfach von der Aufgabe
und den verfügbaren Ressourcen ab.  Wenn die Plattform ohnehin ein nur
zu 20 % ausgelasteter ATmega128x ist und der Rechenzeitbedarf keine
Rolle spielt, warum nicht?  Es macht ja zumindest Dinge einfacher und
übersichtlicher, ergo vermeidet es Bugs.  Für den ungenutzten ROM
bekommst du von Atmel auch kein Geld zurück. ;-)

Eine andere Epsiode, wo floats besser als scaled integers funktionieren,
hat Luke Morrison hier aufgeschrieben:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=43970#271216

Klar, es hätte nicht unbedingt sein müssen, war aber letztlich die
bessere Lösung.

von Karl heinz B. (kbucheg)


Lesenswert?

> Kann man so allgemein auch nicht sagen.

Agreed :-)
(Um auch mal etwas internat. Flair in das Forum zu bringen)

> Hängt einfach von der Aufgabe und den verfügbaren Ressourcen ab

Klar.
Hängt aber auch davon ab, ob der Programmierer weiss, welchen
Sack von möglichen Problemen er mit float aufmacht. Speziell
mit float, double ginge ja noch. Ich hab schon so manche
Stunde über double Berechnungen gebrütet und Formeln
wie wild umgestellt, Verfahren gewechselt, um Rechenungenaugkeiten
in den Griff zu kriegen. (Ich komme aus der CAD Ecke. Ein
schleifender Schnitt 2-er Geraden ist so ziemlich das
Heimtückischte und Eckelhafteste was man sich vorstellen kann).

Man sollte besser sagen: float bzw. double ist auch kein
Allheilmittel. Und da rede ich noch nicht mal von der
auf AVR verringerten Rechengeschwindigkeiten. Mit 5, 6, 7
Stellen Genauigkeit ist halt schnell Schluss mit lustig.

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.