www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Runden in C


Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es eine Funktion mit der ich Zahlen runden kann?
Konkret, ich habe z.B. eine float Zahl 50.35647 und möchte sie auf
50 runden, also ohne Nachkommastellen und möchte sie dann als unsigned
int abspeichern.

IAR C/C++ Compiler for MSP430
V3.20A/W32 [Kickstart] (3.20.1.3)

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

int round(float x)
{
  if(x>0) return (int)(x + 0.5);

  return (int)(x - 0.5);
}

Matthias

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eventuell so (ausprobieren): es speichert den ganzzahligen anteil in
eine int-variable

float f=50.123456;
int x;

x = (int)f;

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Ansatz von Matthias ist dem von KoF gegenüber zu bevorzugen - KoF
schneidet alles hinter dem Komma ab, so daß aus 4.9 4 wird, während
eine Rundung korrekt 5 ergeben sollte ...

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und weil das Ergebnis sowieso in einer unsigned Variable gespeichert
werden soll darf man wohl davon ausgehen, daß nur positive Werte
übergeben werden. Also schreit's nach einem Makro:

#define round(x)    ((unsigned) ((x) + .5))

Man spart sich damit den Overhead eines Funktionsaufrufs, und spielt
ggf. dem Compiler in puncto Optimierung noch in die Karten.

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rufus T. Firefly
das habe ich doch gesagt! es speichert lediglich den ganzzahligen
anteil!!!

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

runden != ganzzahliger Anteil

Matthias

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

so hab ichs bei mir gemacht:

#define ROUND_INT(d) ( (int) ((d) + ((d) > 0 ? 0.5 : -0.5)) )


Gruzz

Autor: ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so wie Zotteljedi hätte ich´s auch gemacht

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

das ist aber nicht ganz ungefährlich da das Makro für negative Zahlen
falsche Ergebnisse liefert. Wenn man das schon so machen will (spart ja
immerhin eine Abfrage) sollte man das Makro nicht round(x) sondern
ROUND_US(x) oder so nennen. Makros sollte man immer groß schreiben um
sie eindeutig von normalen Funktionen abzugrenzen und der Anhang US
soll darauf hinweisen das dieses spezielle Makro eben nur für
vorzeichenlose (-> positive) Zahlen funktioniert.

Matthias

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias:

im OP stand:
| Konkret, ich habe z.B. eine float Zahl 50.35647 und möchte sie auf
| 50 runden, also ohne Nachkommastellen und möchte sie dann als
| unsigned int abspeichern.

Und genau für diese und keine andere Aufgabe ist mein Makro die Lösung.
Wer das Ergebnis in unsigned int speichern will, der gibt sicher keine
negativen Werte zum Runden an, es sei denn sie würden garantiert auf 0
aufgerundet werden - und das wäre bei meinem Makro der (Grenz-)Fall.

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, wegen Abgrenzen von normalen Funktionen: das ist nichts weiter
als eine Empfehlung. Die Standard Bibliothek von ANSI-C macht's vor,
dort darf getc() und putc() als Makro implementiert sein (steht im
Standard), und die Namen sind klein geschrieben.

Ansonsten gebe ich Dir natürlich Recht, normalerweise schreibe ich sie
auch groß, weiß ehrlich gesagt nicht, warum ich es klein geschrieben
habe g

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

natürlich ist es nur eine Empfehlung Makros grundsätzlich groß zu
schreiben. Diese Empfehlung ließt man aber dauernd. Also muß da wohl
irgendwas dran sein. Wer Präprozessor Makros verwendet sollte sich im
Klaren darüber sein das er sie benutzt. Und das macht man am
einfachsten deutlich indem man das Ding einfach groß schreibt. Wenn mal
mehr als eine Person am Projekt arbeiten werden solche Regeln
unverzichtbar.

Matthias

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Tat glaube ich, daß putc() und getc() in Projekten eingesetzt
werden, an denen mehr als eine Person arbeitet... ;-)

Das widerspricht Deiner Ausführung aber keineswegs, denn die meisten
Leute wissen gerade daher nicht, daß sie mit getc und putc Makros
aufrufen, sondern halten es für ganz normale Funktionen.

Was Regeln für große Projekte angeht: generell Geschmackssache. Andere
sagen, daß große Projekte unweigerlich in den Arsch gehen, wenn man
nicht die polnische Notation (das war der Spaß mit nCount, szName und
pVars) verwendet. Wiederum andere bestehen darauf, daß Funktionen mit
mehr als 50 Zeilen in Unterfunktionen aufgebrochen werden müssen (um
irgendeinen unflexiblen Designstandard einzuhalten), auch wenn es
keiner natürlichen Zerlegung gleichkommt. Dann gibt's noch die
Fraktion die einem einreden will ohne Objektorientierung könne man
Projekte mit mehr als 20000 Zeilen gar nicht durchziehen.

Vom besten Einrückstil [TM] und dem Wählen von Funktions-Namen
(print_to_stdout vs. PrintToStdout) wollen wir gar nicht mal anfangen.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

über den Stil Einrückung hat man nicht zu diskutieren. Man hat den
vorgegebenen Stil zu aktzeptieren oder alternativ
http://www.gnu.org/software/indent/indent.html nach dem auschecken und
vor dem einchecken zu benutzen :-)

Dito für Funktions/Methodennamen. Man hält sich einfach an das was die
Firma vorgibt. Wenn das nicht dem eigenen Stil entspricht muß man sich
eben umgewöhne. An sowas sollte man sich aber nicht aufhängen.

Du willst jetzt aber nicht der objekorientierten Programmierung, und
die damit einhergehende bessere Kapselung, die Vorteile bei größeren
Projekten absprochen oder etwa doch?

BTW:
Objektorientiert kann man auch in C programmieren. Wenns auch nicht
wirklich Spaß macht.

Matthias

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich rede ja von nichts anderem, Du liest es nur anders g

Ich meinte nicht, daß man gegen vorgegebene Richtlinien verstoßen soll,
sondern daß es Bullshit ist zu behaupten, daß z.B. ohne polnische
Notation alles a priori zum Scheitern verurteilt ist (ja, es gibt Leute
die das predigen!). Es gibt Millionen Programmierer, die es anders
machen, und nicht scheitern. Das soll jede Firma/Projektgruppe/Sonstwas
für sich ausmachen, und sich dann möglichst konsistent daran halten.
Aber als efltes Gebot für alle Programmierer dieser Welt "Du mußt
Deinen Code so schreiben" aufzunehmen ist was für religiöse
Fanatiker.

Ich will auch die Vorteile nicht absprechen, aber mir gehen Leute sowas
von tierisch auf den Sack, die zwei oder drei Vorlesungen Software
Engineering gehört haben, und dann meinen, daß OO jedes Problem von
alleine löst, und man im Umkehrschluß ohne OO gar nichts auf die Beine
Stellen kann. (Die glauben einem dann auch nicht, daß man in C OO
programmieren kann, weil man sonst ja C++ nicht erfunden hätte...)

Das sind solche verblendeten Zeloten deren Horizont gemeinsam mit ihrem
Schatten in der Mittagssonne endet.

Jedoch bin ich im Unterschied zu Dir der Meinung, daß OO programmieren
in C Spaß macht. Mir jedenfalls. YMMV.

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoppla, ich bin schon wieder drauf reingefallen. Es ist die ungarische
Notation, nicht die polnische. Ich bringe die jedes mal wieder
durcheinander. Naja, solange ich nicht einen Taschenrechner mit
umgekehrter ungarischer Notation suche sollte es ja keine Probleme
geben :-)

Autor: xerg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab ganz einfach schnell ne eigene funktion getippt...

int runden(double n)
{
  if (n-(int)(n) >= 0.5)
    return (int)(n+1);
  else
    return (int)(n);
}

mfg =)

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.