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)
Hi int round(float x) { if(x>0) return (int)(x + 0.5); return (int)(x - 0.5); } Matthias
eventuell so (ausprobieren): es speichert den ganzzahligen anteil in eine int-variable float f=50.123456; int x; x = (int)f;
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 ...
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.
@Rufus T. Firefly das habe ich doch gesagt! es speichert lediglich den ganzzahligen anteil!!!
Moin, so hab ichs bei mir gemacht: #define ROUND_INT(d) ( (int) ((d) + ((d) > 0 ? 0.5 : -0.5)) ) Gruzz
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
@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.
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
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
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.
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
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.
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.