У меня есть две переменные:
size_t a = 63;
size_t b = 32;
Я назвал функцию ceil(a/b)
, Естественно, я бы предположил, что ответ возвращается 2
но вместо этого он возвращает 1
,
Я озадачен Я попытался привести переменные к двойной или же ИНТ и это, похоже, не помогает.
Спасибо за любую помощь.
Давайте разберемся, что происходит, когда вы делаете ceil(a/b)
, Сначала целочисленное деление происходит между a и b, поэтому 63/62 становится 1, а затем 1 приводится к удвоению, чтобы стать 1,0, а затем ceil (1.0), конечно, всего 1,0.
Если вы ожидаете получить 2, вам нужно конвертировать в удвоение до того, как произойдет деление, т.е. ceil(double(a) / double(b))
использует двойное деление.
ceil
а также floor
функции работают на double
типы. Вы сделали целочисленное деление (потому что size_t
целочисленный тип), поэтому результатом является целое число (т.е. это уже целое число, поэтому вы не можете округлить вверх или вниз). Попробуйте привести к double
до деления:
ceil( double(a) / double(b) );
floor( double(a) / double(b) );
Технически вам нужно только разыграть первого, потому что тогда вы получите вместо этого деление с плавающей точкой. Но это хорошо, чтобы быть явным и разыграть оба.
И 63, и 32 являются целыми числами, поэтому результатом будет int (т.е. 1, а не 1,96875).
Либо введите его, как указано Пэдди или
или используйте двойные значения
ceil(63.0/32); // promotes 32 from int to double since one of the operand(63.0) is double.
ceil(63.0/32.0); // both operands are doubles
a/b
будет выполнять целочисленное деление, так как они интеграл типы, которые приведут к 1
это объясняет почему станд :: CEIL возвращает значение, которое вы видите. если мы посмотрим на проект стандарта C ++ раздел 5.6
Мультипликативные операторы параграф 4 говорит (акцент мой):
Двоичный / оператор дает частное, а двоичный оператор% — остаток от деления первого выражения на второе. Если второй операнд / или% равен нулю, поведение не определено. Для целых операндов оператор / дает алгебраический фактор с любой отброшенной дробной частью[…]
приведение любого из операндов двойной будет достаточно из-за арифметические преобразования которые рассматриваются в разделе 5
Выражения параграф 10 который говорит (акцент мой):
Многие бинарные операторы, которые ожидают операнды арифметического или перечислимого типа, вызывают преобразования и выдают типы результатов аналогичным образом.. Цель состоит в том, чтобы получить общий тип, который также является типом результата. Эта модель называются обычные арифметические преобразования, которые определены следующим образом:
и включает в себя эту пулю:
В противном случае, если один из операндов является двойным, другой должен быть преобразован в двойной.
Таким образом, следующее выражение даст желаемый результат:
std::ceil( double(a)/b)