Насколько я знаю, для этой цели не существует предопределенной функции.Возможно, понадобится использовать такую функцию, если по какой-то причине вычисления с плавающей точкой не обсуждаются (например, int64_t
имеет более высокую точность, чем double
может представлять без ошибок)
Мы могли бы определить этоФункция выглядит следующим образом:
#include <cmath>
inline long
floordiv (long num, long den)
{
if (0 < (num^den))
return num/den;
else
{
ldiv_t res = ldiv(num,den);
return (res.rem)? res.quot-1
: res.quot;
}
}
Идея состоит в том, чтобы использовать нормальное целочисленное деление, но с учетом отрицательных результатов, чтобы соответствовать поведению функции double floor(double)
.Смысл в том, чтобы всегда усекать до следующего нижнего целого числа, независимо от положения нулевой точки.Это может быть очень важно, если целью является создание интервалов одинакового размера.
Измерения времени показывают, что эта функция создает только небольшие накладные расходы по сравнению со встроенным оператором /
, но, конечно, с плавающей точкойна основе floor
функция значительно быстрее ....