Forum: Mikrocontroller und Digitale Elektronik Runden in C


von Marcel (Gast)


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)

von Matthias (Gast)


Lesenswert?

Hi

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

  return (int)(x - 0.5);
}

Matthias

von KoF (Gast)


Lesenswert?

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

float f=50.123456;
int x;

x = (int)f;

von Rufus T. Firefly (Gast)


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 ...

von Zotteljedi (Gast)


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.

von KoF (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

Hi

runden != ganzzahliger Anteil

Matthias

von Marko (Gast)


Lesenswert?

Moin,

so hab ichs bei mir gemacht:

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


Gruzz

von ralf (Gast)


Lesenswert?

so wie Zotteljedi hätte ich´s auch gemacht

von Matthias (Gast)


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

von Zotteljedi (Gast)


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.

von Zotteljedi (Gast)


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

von Matthias (Gast)


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

von Zotteljedi (Gast)


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.

von Matthias (Gast)


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

von Zotteljedi (Gast)


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.

von Zotteljedi (Gast)


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 :-)

von xerg (Gast)


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 =)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.