C: разница между (int) x и floor (x)?
В C, в чем разница между этими двумя?
float myF = 5.6;
printf( "%i \n", (int)myF ); // gives me "5"
printf( "%ld \n", floor(myF) ); // also "5"?
Когда предпочтительнее другого?
Ответы
Ответ 1
Одно большое отличие от отрицательных чисел; если вы измените myF
на -5.6
, то приведение к int возвращает -5
, а floor(myF)
- -6
.
Что касается предпочтительности, то, как правило, я бы сказал, что только бросать в int, если вы знаете, что вам нужно - и, поскольку вы спрашиваете здесь, скорее всего, вы, вероятно, захотите floor
.
(Также обратите внимание, что при форматировании printf
%ld
- длинное целое число, double - %lf
.)
Ответ 2
floor(n)
возвращает математический пол n
, то есть наибольшее целое число, не большее n
. (int)n
возвращает усечение n
, целое число, абсолютное значение которого не больше, чем значение n
. Аналогично, ceil(n)
возвращает математический потолок n
или наименьшее целое число, не меньшее n
. Как указывал AraK, число, возвращаемое floor()
или ceil()
, может не соответствовать диапазону int
.
Ответ 3
Когда вы получаете двойное значение floor
, это "целое число" double
может или не может быть представлено в переменной типа int
.
Ответ 4
Вы хотите, чтобы результат был целым или двойным?
Если вы хотите целое число, cast; если вы хотите использовать double, используйте floor
.
Например, если вы хотите получить косинус значения, вы должны просто использовать floor
, поскольку cos
принимает двойной.
Но если вы хотите использовать значение для exit
(просто выберите случайный API здесь), вы должны использовать, потому что exit
принимает int.
Ответ 5
Бывший отбрасывает ваше значение float как целое число (и вы используете спецификатор int в вызове printf).
Последний использует пол (из C math lib), чтобы вернуть двойное округление.