Целочисленная функция пола C ++ - PullRequest
6 голосов
/ 12 апреля 2010

Я хочу реализовать функцию наибольшего целого числа.[«Величайшая целочисленная функция» - это вполне стандартное имя для того, что также известно как функция этажа.]

int x = 5/3;

У меня вопрос с большими числамиможет ли быть потеря точности, так как 5/3 приведет к двойному значению?

РЕДАКТИРОВАТЬ: Величайшая целочисленная функция целое число меньше или равно X. Пример:

4.5 = 4
4 = 4
3.2 = 3
3 = 3

Что я хочузнать, будет ли 5/3 производить двойной?Потому что если так, то при преобразовании в int у меня будет потеря точности.

Надеюсь, это имеет смысл.

Ответы [ 5 ]

6 голосов
/ 12 апреля 2010

Вы потеряете дробную часть частного. Так что да, с большими числами у вас будет больше относительной точности, например, по сравнению с 5000/3000.

Однако 5 / 3 вернет целое число, а не двойное. Чтобы заставить его делиться как двойное, введите дивиденд как static_cast<double>(5) / 3.

3 голосов
/ 12 апреля 2010

Целочисленное деление дает целочисленные результаты, поэтому 5/3 - это 1, а 5% 3 - это 2 (оператор остатка). Однако это не обязательно относится к отрицательным числам. В исходном стандарте C ++ -5 / 3 может быть либо -1 (округление до нуля), либо -2 (пол), но рекомендуется -1. В последнем проекте C ++ 0B (который почти наверняка очень близок к окончательному стандарту) он равен -1, поэтому поиск минимальных чисел более сложен.

2 голосов
/ 12 апреля 2010

5/3 всегда будет давать 1 (целое число), если вы сделаете 5.0 / 3 или 5 / 3.0, результат будет удвоен.

0 голосов
/ 09 января 2011

Насколько я знаю, для этой цели не существует предопределенной функции.Возможно, понадобится использовать такую ​​функцию, если по какой-то причине вычисления с плавающей точкой не обсуждаются (например, 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 функция значительно быстрее ....

0 голосов
/ 12 апреля 2010

Поскольку в C и C ++, как уже говорили другие, / - целочисленное деление, он вернет int. в частности, он вернет слово двойного ответа ... (C и C ++ всегда усекаются) Итак, 5/3 - это именно то, что вам нужно.

Это может стать немного странным в негативах, как -5/3 => -2, что может или не может быть тем, что вы хотите ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...