www.mikrocontroller.net

Forum: Compiler & IDEs Funktion liefert falsche werte


Autor: karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,


die funktion:
//Zykluszeit = 0.01593752490238265997290620
//Tickspermeter = 96000
//ausgabe soll die schrittgeschwindigkeit eines steppers in µm/s sein
unsigned long Calc_speed(unsigned long Value, unsigned long Tickspermeter)
{
  //unsigned long result;
  return ( 1000000 / Zykluszeit / Tickspermeter * (1/Value));
  // result;
}
auf gerufen wird sie wie folgt
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?

Autor: DirkB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(1/Value) ist für Value > 1 immer 0

Ich komme bei deinen Werten auf 0.6irgendwas und das ist als unsigned 
long auch 0.

Autor: kask (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kask schrieb:
> aber das ist mitten in der berrechnung. da sollte das value als unsigned
> gesehen werden. die ausgabe "1/unsigned" aber nicht.

Das hat nichts mit "unsigned" zu tun, sondern damit, daß Du hier 
integer-Arithmetik betreibst.

Und für die ist 1/2 = 0.

Autor: kask (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok,
aber was muß ich machen damit es funktioniert und die funktion mir eine 
(unsigned) long ausgibt aber mit z.b. einer gleitkommazahl rechnet?

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kask schrieb:
> aber mit z.b. einer gleitkommazahl rechnet?

warum willst du mit gleitkommazahl rechen wenn du am ende long 
rausbekommen willst?

Wechen wert erwartest du denn?

Autor: kask (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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/value)
 statt gleich
/value
zu schreiben?

Autor: 4???? (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kask schrieb:
> mehr will ich nicht

dann mach es dem compiler doch nicht so schwer


return 653594 / value;

(runden fehlt noch)

Autor: kask (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, da is was faul.

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

oder
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 ;)

Autor: kask (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: 4???? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber auch bei
return ( 1000000000 / Zykluszeit / Tickspermeter * (1/(Value)));

würde 0 rauskommen, da (1/value) als Ganzzahlwert berechnet wird, und 
das ist 0.
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.

Autor: kask (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich brauche aber die "1/"..

weil sonst wir der ausgage wert immer größer bei größer werden der 
eingabe.
es muß aber kleiner werden bei größer werdender eingabe.

Autor: kask (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okok, dank dir hast recht ich falsch gedacht ;)

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kask schrieb:
> ich brauche aber die "1/"..

Schmarren.

Autor: 4???? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kask schrieb
> ich brauche aber die "1/"..

Dein Problem war nicht unbedingt die 1/ sondern die Klammern drum herum.

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.