mikrocontroller.net

Forum: Compiler & IDEs Rechnen mit hohen Zahlen


Autor: Martin Borner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen
Ich habe bis jetzt nur in ASM programmiert und versuche jetzt ein
Projekt in C (CodeVision) zu schreiben. Ich müsste folgende Formel mit
einem ATmege 163 berechnen.

FTW = (fout/fref) * 2^32

FTW ist ein Frequenzwort mit 4Byte
fout kann von 0 bis 200'000'000 sein
fref kann von 0 bis 400'000'000 sein

Zur Kontrolle habe ich das mit dem Befehl printf("\r\n FTW ist
%x",u); auf das RS232 Terminal vom STK500 gesendet. Wie sag ichs
meinem uP ?
Ansätze in ASM währen vorhanden, aber ich möchte dieses Projekt in C
lösen.
Gruss Martin

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Handelt es sich bei FTW um einen Ganzzahlwert oder einen
Gleitkommawert?

Bei Ganzzahlen würde ich die drei Variablen einfach als unsigned long
int deklarieren:

unsigned long FTW = 0, fout = 0, fref = 0;
[..]

  /* irgendwas in fout/fref schreiben */
  [..]
  FTW = (fout/fref) * (1 << 32);
  [..]

...dann muss in Deiner printf-Anweisung allerdings sowas stehen:

  [..]
  printf("\r\n FTW ist %lx", &FTW);
  [..]

Gruß,
Patrick...

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hau mich tot, da hab ich was verbockt :)
Habs mal getestet, das ist das Ergebnis:

-----8<-----
#include <stdlib.h>
#include <stdio.h>

int
main(void)
{
  unsigned long long FTW = 0;
  unsigned long long fout = 0;
  unsigned long long fref = 0;

  /* irgendwas in fout/fref schreiben */
  fref = 2544368;
  fout = 1235472;

  FTW = (fout/fref) << 32;
  printf("FTW ist 0x%lx (%ld dez)\n", FTW, FTW);

  return 0;
}
-----8<-----

Gruß,
Patrick...

Autor: Martin Borner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Patrick

Wenn fout =5E6 ist und fref =20E6 wird in deiner Berechnung der Wert 0
ausgegeben, sollte aber 1073741824 sein (0.25 * 2^32). fout/fref muss
mit einer möglichst hochen Genauigkeit gerechnet werde, weil danach mit
2^32 multipliziert wird. Das heisst es muss mit kommazahlen gerechnet
werden. FTW kann am Schluss dann schon eine 4 Byte Ganzzahl sein. Ein
Programm in C habe ich schon, nur die Umsetzung auf den ATmega163 ist
nicht so ganz einfach.

Gruss Martin

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn du Probleme mit der Genauigkeit hast, so stell einfach die Formel
ein bischen um, so dass die Division erst zum schluss erfolt:
z.B.  FTW= (fout*(1<<32))/fref

Mathematisch müsste das gleich rauskommen.

Gruß, Florian

Autor: Martin Borner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Florian

Deine Ueberlegungen sind schon richtig, aber fout kann von 0 bis 200E6
sein (siehe erstes Mail) und das mal 2^32 ergibt 8.589934592E17. Eine
unsigned long Zahl (4 Byte) kann aber nur 4.294967296E9 gross sein,
deshalb habe ich das nicht so gerechnet. Bei einem "normalen"
C-Programm würde ich das mit double Zahlen rechnen, funktioniert auch,
wenn das ganze in einem uP laufen soll, sieht das dann schon anders
aus.

Gruss Martin

Autor: Martin Borner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Patrick

wie wird ein "unsigned long long" in CodeVision realisiert?
Dein Programm läuft im normalen C-Code. Der Hex wird ausgegeben dezimal
wird aber immer eine 0 ausgegeben.

Gruss Martin

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.