PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fließkommazahlen in CCI implementieren



Tappi
08.08.2004, 17:34
Hallo,

ich will für die C-Control I ein paar Funktionen schreiben, die das Hantieren mit Fließkommazahlen ermöglichen.

Zum Aufbau: Die C-Control ist ein 8 Bit Mikrocontroller, kann aber einfach mit Integer Werten hantieren.

Ich habe festgelegt, dass eine Fließkommazahl ein Integer Wert ist:

0,1 > 01000
2,0 > 20000
1,5 > 15000
0,0003 > 00003

Plus und Minut kann man damit wunderbar rechnen. Als Print Ausgabe nutze ich folgende Routine:



define dummy as word
define dummy2 as word
define dummy3 as word

function print_single(x ref dummy)
print (x/10000) & "." & (x mod 10000)
end function


Das läuft auch wunderbar. Natürlich kann ich keine Negativen Werte darstellen, das ist aber egal.

Jetzt arbeite ich an eine Methode um multiplizieren und dividieren zu können:



function mul_singe(x ref dummy, y ref dummy2)

dummy3 = (...)

return dummy3
end function


function div_singe(x ref dummy, y ref dummy2)

dummy3 = (...)

return dummy3
end function


... Soweit so gut.

In Visual Basic funktioniert folgender Code für Multiplikation:


d = (x * (y Mod 10000)) / 10000

und für Division:


d = ((y Mod 10000) / x) * 10000

(Fragt mich nicht mehr wie ich drauf gekommen bin ... ist schon was länger her).

Leider geht das auf der C-Control nicht, da immer abrundet:

5000 / 10000 = 0 u.s.w.

Kennt jemand einen alternativen Code?

apfelgriepsch
02.11.2004, 20:59
1. das sind keine fließkommerzahlen, sondern festkommerzahlen, da das kommer ja an einer bestimmten stelle ist.
2. probiers mal mit brüchen! fur eine zahl brauchst du zb ein 16 bit wort. die ersten 8bit sind der zähler, die zweiten der nenner.
wenn du nun eine zahl mit einer anderen multiplizieren willst rechnest du zähler mal zähler und nenner mal nenner. zum diviedieren nenner mal zähler und zähler mal nenner.

Tappi
03.11.2004, 01:01
1. das sind keine fließkommerzahlen, sondern festkommerzahlen, da das kommer ja an einer bestimmten stelle ist.



Ja ich weiß; das war ein "Tippfehler".



2. probiers mal mit brüchen! fur eine zahl brauchst du zb ein 16 bit wort. die ersten 8bit sind der zähler, die zweiten der nenner.
wenn du nun eine zahl mit einer anderen multiplizieren willst rechnest du zähler mal zähler und nenner mal nenner. zum diviedieren nenner mal zähler und zähler mal nenner.

Ich habe eine deutlich trivialere Lösung gefunden (siehe www.fdos.de/ccbpp), obwohl Dein Gedanke sehr gut ist. Aber Danke ;o)