Frage

Ich arbeite in C Pseudo-Code zu implementieren, die sagt:

delay = ROUND(64*(floatDelay - intDelay))
where intDelay = (int) floatDelay

Die floatDelay wird immer positiv sein. Gibt es einen Vorteil, dass die Rundenfunktion von math.h zu verwenden:

#inlcude <math.h>
delay=(int) round(64*(floatDelay-intDelay));

oder kann ich verwenden:

delay=(int)(64*(floatDelay - intDelay) + 0.5))
War es hilfreich?

Lösung

Sie sollten immer die entsprechenden Mathe Libs verwenden, wenn sie mit Gleitkommazahlen handelt. Ein Schwimmer kann nur eine sehr enge Annäherung des tatsächlichen Wertes sein, und das Seltsamkeit verursachen kann.

Zum Beispiel könnte 5f 4,9999999 angenähert werden ... und wenn Sie versuchen, direkt auf 4 abgeschnitten wird in int zu werfen.

Um zu sehen, warum in der Tiefe, Sie sehen sollen Punktzahl auf wikipedia schwimmen. Aber kurz gesagt, anstatt die Anzahl als eine gerade Reihe von Bits wie ein int zu speichern, wird es in zwei Teilen gespeichert. Es gibt eine „Fraktion“ und ein Exponent, wobei der Endwert des Schwimmers ist Fraktion * (Basis ^ Exponent).

Andere Tipps

Es gibt keine Vorteile, die ich kenne, außer der Tatsache, dass die Umwandlung in anderen Programmierern sofort offensichtlich nicht in int, dass es wie ein trunc funktioniert ...

Während bei der Rundenfunktion, Ihre Absichten sind klar.

Entweder ist in Ordnung, vorausgesetzt, wie Sie sagen floatDelay positiv ist.

Es ist möglich, dass man geringfügig schneller als die andere, wenn es sehr schwierig sein würde, gegeben, die zu erzählen, ohne Benchmarking, dass round() möglicherweise als Compiler intrinsischen implementiert ist. Es ist sogar wahrscheinlicher, dass jede Geschwindigkeitsdifferenz überwältigend unwichtig ist, so verwenden je nachdem, was Sie fühlen, ist klarer.

fand ich „ einen Dezimalwert Kürzen in c ++ “ leisteten einen nützlichen Diskussion von Gleitkommazahlen.

Insbesondere Greg Hewgill diesen Link zu finden: Was jeder Informatiker wissen sollten Gleitpunktarithmetik von David Goldberg

  

Zum Beispiel könnte 5f 4,9999999 angenähert werden ...   und wenn Sie versuchen, direkt zu gieße int es wird bis 4 abgeschnitten.

Ist das wirklich wahr?

Wenn Sie sicherstellen, die Sie die 0,5 hinzufügen, bevor Sie in int gestutzt,
ist wirklich 4,9999 ein Problem dar.

ich meine: 4,9999 + 0,5 = 5,4999 -> 5

/ Johan

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top