Есть ли разница между ними:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
Насколько я понимаю, в обоих случаях результат одинаковый. Есть ли разница в скомпилированном коде?
c++
c
floating-point
OgreSwamp
источник
источник
floor
, но будьте осторожны, этоdouble
не дляfloat
. C99 также имеетfloorf
дляfloat
.#include<cmath>
используйтеstd::floor
)bar
?Ответы:
Приведение к int будет усечено до нуля.
floor()
будет усекаться до отрицательной бесконечности. Это даст вам другие значения, если ониbar
будут отрицательными.источник
floor()
таково намерение, заключается в том, что значениеbar
слишком велико, чтобы поместиться вint
.Как было сказано ранее, для положительных чисел они одинаковы, но для отрицательных чисел они отличаются. По правилу int округляется в сторону 0, а пол - в сторону отрицательной бесконечности.
При этом также есть разница во времени выполнения. В моей системе я рассчитал, что заброс как минимум в 3 раза быстрее, чем на полу.
У меня есть код, который требует работы с ограниченным диапазоном значений, включая отрицательные числа. И он должен быть очень эффективным, поэтому мы используем для этого следующую функцию:
Конечно, это не сработает для очень больших значений x (вы столкнетесь с некоторыми проблемами переполнения) и для отрицательных значений ниже -100000 и т. Д. Но я установил, что он будет как минимум в 3 раза быстрее, чем пол, что было действительно критично. для нашего приложения. Отнеситесь к нему с недоверием, протестируйте его на своей системе и т. Д., Но это стоит рассмотреть ИМХО.
источник
float
, а неdouble
- возможно,double
ваше приложение. Если в C, обязательно используйтеfloorf()
сfloat
s.SO 101, не меняйте свой вопрос после того, как люди ответят на ваш вопрос, вместо этого напишите новый вопрос.
Как вы думаете, почему у них будет такой же результат?
источник
fabs
? Вопрос был о томfloor
. Этаж0.33333
... есть0
.РЕДАКТИРОВАТЬ: потому что вопрос мог быть изменен из-за путаницы между
fabs()
иfloor()
.Учитывая исходные строки примера вопроса:
Разница в том, что если столбец отрицательный, результат будет отрицательным для первого и положительным для второго. Первое будет усечено до целого числа, а второе вернет полное десятичное значение, включая дробную часть.
источник
Да.
fabs
возвращает абсолютное значение своего аргумента, а приведение к int вызывает усечение деления (до ближайшего целого числа), поэтому результаты почти всегда будут разными.источник
Есть два основных отличия:
Как указывали другие, приведение к целому числу будет усекаться до нуля, тогда как
floor()
всегда будет усекаться до отрицательной бесконечности; это другое поведение для отрицательного операнда.Никто (пока), похоже, не указал на другое различие - если ваш аргумент больше или равен
MAX_INT+1
(или меньше-MAX_INT-1
), то приведение к anint
приведет к отбрасыванию самых верхних битов (C, вероятно) или неопределенному поведению ( C ++ и, возможно, C). Например, если у васint
32 бита, у вас будет только знаковый бит плюс 31 бит данных. Таким образом, использование этого сdouble
большим размером приведет к непредвиденным результатам.источник
int
переполнение - аргумент больше или равенINT_MAX
+1. Симметрично, условие потери значимости состоит в том, что аргумент меньше или равенINT_MIN
-1.(int) x
это просьба сохранить целую частьx
(здесь нет округления)fabs(x)
= | x | так что это>= 0
;Пример:
(int) -3.5
возврат-3
;fabs(-3.5)
возвращается3.5
;В общем,
fabs (x) >= x
для всех x;x >= (int) x
еслиx >= 0
x < (int) x
еслиx < 0
источник