2010-04-08 22 views
17

In C, qual è la differenza tra questi due?C: differenza tra (int) x e floor (x)?

float myF = 5.6; 

printf("%i \n", (int)myF); // gives me "5" 
printf("%ld \n", floor(myF)); // also "5"? 

Quando è preferibile l'uno rispetto all'altro?

+10

try 'floor (-5.5)' – tzenes

+0

Possibile duplicato di [Cast to int vs floor] (http://stackoverflow.com/questions/3300290/cast-to-int-vs-floor) – STF

risposta

29

Una grande differenza è quella dei numeri negativi; se si modifica myF a -5.6, quindi il casting su un int restituisce -5 mentre floor(myF) è -6.

Come al quale è preferibile, come regola generale direi a gettata unica per un int se sa questo è quello che vi serve - e dal momento che stai chiedendo qui, è probabile che probabilmente si desidera floor.

(Si noti inoltre che con printf formattazione, %ld è un intero lungo, una camera è %lf.)

1

Vuoi il risultato come numero intero o doppio?

Se si desidera un numero intero, eseguire il cast; se si desidera un doppio, utilizzare floor.

Ad esempio, se si desidera ottenere il coseno del valore, è sufficiente utilizzare floor come cos come doppio.

Ma se si desidera utilizzare il valore per exit (selezionando solo un'API casuale qui), è necessario eseguire il cast perché exit accetta un numero int.

1

Il primo lancia il valore float come numero intero (e si sta utilizzando un identificatore int nella chiamata printf).

Quest'ultimo utilizza floor (dal valore di matematica C) per restituire un double che è stato arrotondato per difetto.

+4

'Math.floor 'non è in C. –

+2

Beh, sì, sei tecnicamente corretto. "Math.floor" non è in C. Penso che tu sappia cosa intendevo. Controlla la mia modifica. – bdl

+2

Sì, l'ho fatto. Scusa se sono venuto fuori come un coglione. Questo posto tende a rendere le persone un po 'ipocrite ... –

3

Quando si ottiene il floor di doppio, quel "numero intero" può o non può essere rappresentabile in una variabile di tipo int.

5

floor(n) restituisce al piano matematico di n, cioè, il numero intero più grande non superiore n. (int)n restituisce il troncamento di n, il numero intero il cui valore assoluto non è maggiore di quello di n. Allo stesso modo, ceil(n) restituisce il massimale matematico di n o il più piccolo intero non minore di n. Come sottolineato da AraK, il numero restituito da floor() o ceil() potrebbe non rientrare nell'intervallo int.

Problemi correlati