Как получить верхний предел числа в C?Если я делю 3 на 2, я хочу, чтобы ответ был равен 2 (т. Е. 1,5 округлилось до 2)
Если я делю 3 на 2, я хочу, чтобы ответ был равен 2 (т.е. 1,5 округлилось до 2).
Как получить верхний предел числа в C?Если я делю 3 на 2, я хочу, чтобы ответ был равен 2 (т. Е. 1,5 округлилось до 2)
Если я делю 3 на 2, я хочу, чтобы ответ был равен 2 (т.е. 1,5 округлилось до 2).
#include <math.h>
ceil(3.0/2); //2.0
Обратите внимание, что один операнды должны быть в два раза (или поплавок), потому что 3/2 дает 1
Вы уверены, что '2/3.0' ==' 2.0'? –
Извините, мой плохой, спасибо за комментарий: P – Lombo
int x= ceil((float)3/2);
Чтобы закруглить без использования функции, просто добавьте половину делителя прежде чем вы разделите. Если делитель является константой, компилятор оптимизирует код.
int number = 3;
int divisor = 2;
int result = (number + (divisor+1)/2)/divisor;
Если вы просто заинтересованы в делении на 2, а затем просто взять (п + 1)/2, чтобы сохранить его в целочисленной математике. Например, (3 + 1)/2 дает 2. Для большего числа x используйте x - 1. Например, (3 + 7)/8 = 1, для 3, деленное на 8.
Для общего случая , вы ищете функцию потолка - потолок. Быстрый поиск Google для «математика CEIL C» дал эту страницу в верхней части результатов: http://www.elook.org/programming/c/ceil.html
int i = 3;
int j = 2;
int k = (i + j - 1)/j;
int x = 3.0/2 + 0.5;
OP просит функцию потолка, а не круглую функцию. Я тоже думал об этом, пока не понял, что он всегда хочет следующего наибольшего целого, независимо от его оценки. –
Ах. Это было не совсем ясно для меня. Он использует слово «округлено до ...»: s – wilhelmtell
(если это квалифицируется как нить некромантии, любезно уведомили и я удалю это)
Быстрое возвращение к округленному частному отношению - это добавить делитель, минус один, к дивиденду и разделить.
int ceil_div(int dividend, int divisor) {
return (dividend + divisor - 1)/divisor;
}
или в качестве альтернативы,
int ceil_div(int dividend, int divisor) {
return (dividend - 1)/divisor + 1;
}
как следствие, вы будете работать путем вычитания 1 из 3, разделив на 2, и добавление 1.
Я попытаюсь объяснить, почему это работает , Если дивидендов и делитель оба были поплавки, то усеченный целое число эквивалента (дивидендов/делителей) было бы равен к потолку фактора, если делителя идеально делят дивиденды, или один меньше, если он не разделяет дивиденды. Вычитая 1, мы гарантируем, что новый дивиденд, дивиденд - 1, при делении на делитель, всегда будет возвращать значение, меньшее, чем потолок коэффициента с плавающей запятой.
Все, что осталось сейчас, добавляет 1 к этому частному, что, кстати, является делителем ((float) divend/(float)).
Более простой подход при работе с положительными числами * на языках, реализующих целочисленное деление с использованием полных или эвклидовых арифметических *, заключается в том, чтобы отрицать дивиденд и результат (т. Е. Округление x/y is - ((- x) // y). К сожалению, многие языки реализуют более менее полезное деление с усечением на нуль, и этот метод не будет работать с ними. – supercat
Существенно дубликат SO 2422712 (http://stackoverflow.com/questions/2422712/c-rounding-number-up). Предоставленный этот вопрос упоминает о плавающей запятой, но ответы до сих пор здесь тоже. –