2015-02-02 16 views
7

Ich schreibe einige C-Code zum wiederholten Runden schwimmt auf und ab auf ganzzahlige Werte. Die Standard-C-Math-Bibliothek enthält die Funktionen floor() und ceil(). Ich bemerkte, dass eine viel schnellere Implementierung der Funktionen direkt auf ganze Zahlen zu werfen ist:floor() und ceil() -Funktionen vs Casting zu Integer in C

int up, down; 
float test = 1.3548; 

up = (int)(test + 1); //ceil() 
down = (int)test;  //floor() 

ich eine schnelle Überprüfung tat und das scheint gut zu funktionieren.

  1. Ist dies eine zuverlässige Methode zum Abrunden und Aufrunden, wenn das Ergebnis eine Ganzzahl ist, als Array-Index (d. H. Liefert es immer die korrekten Ergebnisse)?
  2. Gibt es einen starken Grund für die deutliche Steigerung der Geschwindigkeit? (Auf meinem System läuft es etwa 3-mal schneller als die math.h Implementierung)
+7

Keine zuverlässige Methode. Stellen Sie sich den Fall vor, dass "test" ein ganzzahliger Wert ist, z. B. "4.0". In diesem Fall ist "floor (x) == ceil (x)", aber Ihr Code würde "up = 5; runter = 4'. – njuffa

+1

Sind Sie sicher, dass es schneller ist? Zeig uns deinen Leistungstest! – Sulthan

+0

Hängt davon ab, was Sie mit "zuverlässig" meinen. Wenn "zuverlässig" bedeutet "es wird funktionieren", dann, ja. Aber wenn du etwas mehr meinst, wie "es wird immer abgerundet/hoch/am nächsten/zu Null/etc ...", dann, nein ... Achte darauf, dass du deine verschiedenen Methoden sowohl mit positiven als auch mit negativen Zahlen ausprobierst als solche, die außerhalb des Bereichs von "int" liegen könnten, um zu sehen, was passiert, so dass Sie die "richtige" Methode für Ihre spezielle Situation wählen können ... Oh, und das sollte wahrscheinlich sein: up = (int) (test + 0.5) '- Denk darüber nach ... – twalberg

Antwort

7

Die Funktionen ceil() und floor() unterschiedliche Zahlen zurückgeben als das, was erhalten Sie von

up = (int)(test + 1); 
down = (int)test; 

verwenden, wenn Sie einen negativen haben Nummer.

Wenn Sie:

float test = -1.3548; 
up = (int)test;  // ceil() 
down = (int)(test-1); // floor() 

Auch die letzte Aussage ist kein guter Weg, floor() zu berechnen, wenn test eine ganze Zahl ist.

Es sei denn, Sie wollen anders mit positiven und negativen Zahlen behandeln, und den Sonderfällen, wann test ist ganz Zahl, sind Sie besser dran ceil() und floor() verwenden.

+1

und für 'round()' verwenden: '(int) (test + 0.5f)' – Iggy

+3

'(int) (test - 1)' ist nicht äquivalent zu 'floor()' für ganzzahlige negative Zahlen. –

+0

@TheParamagneticCroissant, ausgezeichneter Punkt. –