Funktion liefert falsche werte

Gast #2104673
Lesenswert?

hallo,


die funktion:
1
//Zykluszeit = 0.01593752490238265997290620
2
//Tickspermeter = 96000
3
//ausgabe soll die schrittgeschwindigkeit eines steppers in µm/s sein
4
unsigned long Calc_speed(unsigned long Value, unsigned long Tickspermeter)
5
{
6
  //unsigned long result;
7
  return ( 1000000 / Zykluszeit / Tickspermeter * (1/Value));
8
  // result;
9
}
auf gerufen wird sie wie folgt
1
stepwartezeit = Calc_speed(meinSpeedlong, Tickspermeterlong);

wenn ich es mit dem wert 1000 (ist 1mm/sek) mache, geht es.
bei mehr oder weniger kommt nur mist raus. woran kann das liegen?
Gast #2105612
Lesenswert?

ja, schon.

aber das ist mitten in der berrechnung. da sollte das value als unsigned 
gesehen werden. die ausgabe "1/unsigned" aber nicht.

steht doch in klammern und der variabelen "Value" wird der wert nicht 
zugewiesen.

oder sehe ich das total falsch?
Gast #2105670
Lesenswert?

ich erwarte wenn ich folgendes eingebe z.b.:
value = 500 das ca. 1308 rauskommt,
value = 1000 das ca. 654 rauskommt,
value = 2000 das ca. 327 rauskommt.

so wie es jeder taschenrechner macht. mehr will ich nicht ;)
#2105677
Lesenswert?

kask schrieb:
> ich erwarte wenn ich folgendes eingebe z.b.:
> value = 500 das ca. 1308 rauskommt,
> value = 1000 das ca. 654 rauskommt,
> value = 2000 das ca. 327 rauskommt.
>
> so wie es jeder taschenrechner macht. mehr will ich nicht ;)

komisch, mein Taschenrechner kommt auf 1.308, 0.654 und 0.327 und damit 
als long 1, 0 und 0

und hat es einen tieferen Sinn
1
 *(1/value)
 statt gleich
1
/value
zu schreiben?
Gast #2105678
Lesenswert?

Dann Stimmen deine Werte aber nicht:

1000000 / Zykluszeit = 62745000
                       62745000 / 96000 = 653,6
                                          653,6 * (1/1000) = 0,653


Du musst Umstellen und Klammern:
1000000  Zykluszeit  Tickspermeter * (1/Value) =
1000000 / ( Zykluszeit  Tickspermeter  Value) =
1000000  Zykluszeit  (Tickspermeter * Value)


Wobei du 1000000 / Zykluszeit evtl. schon vorher ausrechnen kannst.
Denn deine Zykluszeit sieht sehr berechnet aus :-)
Gast #2105695
Lesenswert?

ups, da is was faul.

richtiger wäre
1
return ( 1000000 / Zykluszeit / Tickspermeter * (1/(Value/1000)));

oder
1
return ( 1000000000 / Zykluszeit / Tickspermeter * (1/(Value)));

wobei es sicher besser wäre "1000000000 / Zykluszeit" vorher zu 
berrechnen. macht sinn ;)

und jepp, die zykluszeit is berrechnet bzw. gemessen.
100%ige genauigkeit ist nicht primär.

aber haste auch wieder recht. feste werte und gut ist. wenn sich die 
hardware ändert kann man auch neu compilieren ;)
Gast #2105703
Lesenswert?

jepp runden fehlt noch..das ist das nächste thema..wie?
ich suche mir in sachen c nen kippar***. bei simpelen sachen.

so wie ich es erlesen habe macht er es automatisch wenn ich der ausgabe 
ganzzahl eine gleitkommazahl zuweise. (wie in bascom z.b.)
Gast #2105707
Lesenswert?

Aber auch bei
1
return ( 1000000000 / Zykluszeit / Tickspermeter * (1/(Value)));

würde 0 rauskommen, da (1/value) als Ganzzahlwert berechnet wird, und 
das ist 0.
1
return ( 1000000000 / Zykluszeit / Tickspermeter / Value);
macht das was du brauschst.

Oder du hast ein Zykluszeit als #define. Dann rechnet der Compiler das 
schon vorher aus.

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