Martin schrieb:
>> wrden weder Nachkommastellen berechnet, noch wird gerundet.
>
> Und wie lös ich das Problem?
Indem zu zb selber für eine Rundung sorgst.
Nach dem Muster:
a / b als ganzzahlige Division gerundet wird als (a + b/2) / b
gerechnet.
1 | uint32_t deltaX = x2 - x1;
|
2 | uint32_t deltaY = y2 - y1;
|
3 |
|
4 | for( time = 0; time < x2; time++ ) {
|
5 | result = ( deltaY * time + deltaX / 2 ) / deltaX;
|
Man kann sich das so vorstellen:
angenommen du hättest eine Gleitkommadivision
c = a / b
dann hat c Nachkommastellen. Weist du c einem int zu
int d = c
dann werden Nachkommastellen einfach abgeschnitten. Aus 1.9 wird so 1
Um das zu vermeiden musst du runden
int d = c + 0.5
Die Rundungskorrektur von 0.5 sorgt jetzt dafür, dass das Ergebnis
soweit erhöht wird, dass alle Werte > x.5 über die nächste ganze Zahl
kommen und wenn dann die Nachkommastellen einfach weggeworfen werden,
kommt x+1 raus.
Aus 1.6 wird so 2 und nicht 1
Und jetzt wird rückwärts eingesetzt
int d = a / b + 0.5
wir wollen die Kommazahl loswerden.
int d = a / b + 1 / 2
auf gemeinsamen Nenner gebracht
int d = a / b + b / 2b
int d = a / b + ( b/2 ) / b
int d = ( a + b/2 ) / b
voila. Du Rundungskorrektur wurde soweit nach vor gezogen, dass alles
ganzzahlig ist. Auch die Division muss jetzt nicht mehr in Gleitkomma
erfolgen sondern kann ganzzahlig gemacht werden.
Soweit zum runden. Allerdings: mit deinen originalen Zahlen, ist das
Problem nicht das runden :-)
adfix hat, denk ich, auch recht. Aber sein Fix ist falsch.
Wenn du den Endpunkt erreichen willst, dann muss es lauten
for( time = 0; time <= x2; time++ ) {