Rechnen mit hohen Zahlen

Gast #77173
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
Gast #77174
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...
Gast #77175
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...
Gast #77176
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
Gast #77177
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
Gast #77178
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
Gast #77179
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

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