Gibt es einen Unterschied zwischen diesen:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
Soweit ich weiß, haben beide Fälle das gleiche Ergebnis. Gibt es einen Unterschied im kompilierten Code?
c++
c
floating-point
OgreSwamp
quelle
quelle
floor
, aber Vorsicht, das istdouble
nicht fürfloat
. C99 hat auchfloorf
fürfloat
.#include<cmath>
und verwendenstd::floor
)bar
?Antworten:
Das Casting auf ein Int wird gegen Null abgeschnitten.
floor()
wird in Richtung negativ unendlich abschneiden. Dies gibt Ihnen unterschiedliche Werte, wennbar
sie negativ waren.quelle
floor()
die Absicht ist, ist, wenn der Wert vonbar
zu groß ist, um in eine zu passenint
.Wie bereits gesagt, sind sie für positive Zahlen gleich, unterscheiden sich jedoch für negative Zahlen. Die Regel ist, dass int gegen 0 rundet, während der Boden gegen negative Unendlichkeit rundet.
Abgesehen davon gibt es auch einen Unterschied in der Ausführungszeit. Auf meinem System habe ich festgelegt, dass das Casting mindestens dreimal schneller ist als der Boden.
Ich habe Code, der den Bodenbetrieb eines begrenzten Wertebereichs einschließlich negativer Zahlen benötigt. Und es muss sehr effizient sein, deshalb verwenden wir die folgende Funktion dafür:
Natürlich schlägt dies bei sehr großen Werten von x (bei einigen Überlaufproblemen) und bei negativen Werten unter -100000 usw. fehl. Aber ich habe es so getaktet, dass es mindestens dreimal schneller als der Boden ist, was sehr kritisch war für unsere Anwendung. Nehmen Sie es mit einem Körnchen Salz, testen Sie es auf Ihrem System usw., aber es lohnt sich, IMHO in Betracht zu ziehen.
quelle
float
, nichtdouble
- vielleichtdouble
war Ihre Anwendung. Wenn in C, verwenden Sie unbedingtfloorf()
mitfloat
s.SO 101, ändern Sie Ihre Frage nicht, nachdem die Leute auf Ihre Frage geantwortet haben, sondern schreiben Sie eine neue Frage.
Warum glauben Sie, werden sie das gleiche Ergebnis haben?
quelle
fabs
? Die Frage war ungefährfloor
. Der Boden von0.33333
... ist0
.BEARBEITEN: Weil die Frage möglicherweise aufgrund von Verwechslungen zwischen
fabs()
und geändert wurdefloor()
.Angesichts der ursprünglichen Frage Beispielzeilen:
Der Unterschied besteht darin, dass bei einem negativen Balken das Ergebnis beim ersten negativ, beim zweiten positiv ist. Der erste wird auf eine Ganzzahl abgeschnitten und der zweite gibt den vollständigen Dezimalwert einschließlich des Bruchteils zurück.
quelle
Ja.
fabs
Gibt den absoluten Wert seines Arguments zurück, und die Umwandlung in int führt zu einer Kürzung der Division (bis zum nächsten int), sodass die Ergebnisse fast immer unterschiedlich sind.quelle
Es gibt zwei Hauptunterschiede:
Wie andere bereits betont haben, wird das Casting auf eine Ganzzahl gegen Null abgeschnitten, wohingegen
floor()
immer gegen negative Unendlichkeit abgeschnitten wird. Dies ist ein anderes Verhalten für einen negativen Operanden.Niemand (noch) scheint auf einen anderen Unterschied hingewiesen zu haben - wenn Ihr Argument größer oder gleich
MAX_INT+1
(oder kleiner als-MAX_INT-1
) ist, führt das Casting auf aint
dazu, dass die obersten Bits gelöscht werden (C, wahrscheinlich) oder undefiniertes Verhalten ( C ++ und möglicherweise C). Wenn Sieint
32 Bit haben, haben Sie nur ein Vorzeichenbit plus 31 Datenbits. Wenn Sie dies also mit einemdouble
großen Gerät verwenden, werden unbeabsichtigte Ergebnisse erzielt.quelle
int
Überlauf ist, dass das Argument größer oder gleichINT_MAX
+1 ist. Symmetrisch ist die Bedingung für den Unterlauf, dass das Argument kleiner oder gleichINT_MIN
-1 ist.(int) x
ist eine Anforderung, den ganzzahligen Teil von beizubehaltenx
(hier gibt es keine Rundung)fabs(x)
= | x | so dass es ist>= 0
;Bsp.:
(int) -3.5
Kehrt zurück-3
;fabs(-3.5)
kehrt zurück3.5
;Im Allgemeinen
fabs (x) >= x
für alle x;x >= (int) x
wennx >= 0
x < (int) x
wennx < 0
quelle