2010-03-20 2 views
3

Как получить верхний предел числа в C?Если я делю 3 на 2, я хочу, чтобы ответ был равен 2 (т. Е. 1,5 округлилось до 2)

Если я делю 3 на 2, я хочу, чтобы ответ был равен 2 (т.е. 1,5 округлилось до 2).

+0

Существенно дубликат SO 2422712 (http://stackoverflow.com/questions/2422712/c-rounding-number-up). Предоставленный этот вопрос упоминает о плавающей запятой, но ответы до сих пор здесь тоже. –

ответ

3
#include <math.h> 
ceil(3.0/2); //2.0 

Обратите внимание, что один операнды должны быть в два раза (или поплавок), потому что 3/2 дает 1

+0

Вы уверены, что '2/3.0' ==' 2.0'? –

+0

Извините, мой плохой, спасибо за комментарий: P – Lombo

1

Чтобы закруглить без использования функции, просто добавьте половину делителя прежде чем вы разделите. Если делитель является константой, компилятор оптимизирует код.

int number = 3; 
int divisor = 2; 
int result = (number + (divisor+1)/2)/divisor; 
13

Если вы просто заинтересованы в делении на 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

1
int i = 3; 
int j = 2; 
int k = (i + j - 1)/j; 
0
int x = 3.0/2 + 0.5; 
+0

OP просит функцию потолка, а не круглую функцию. Я тоже думал об этом, пока не понял, что он всегда хочет следующего наибольшего целого, независимо от его оценки. –

+0

Ах. Это было не совсем ясно для меня. Он использует слово «округлено до ...»: s – wilhelmtell

1

(если это квалифицируется как нить некромантии, любезно уведомили и я удалю это)

Быстрое возвращение к округленному частному отношению - это добавить делитель, минус один, к дивиденду и разделить.

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)).

+0

Более простой подход при работе с положительными числами * на языках, реализующих целочисленное деление с использованием полных или эвклидовых арифметических *, заключается в том, чтобы отрицать дивиденд и результат (т. Е. Округление x/y is - ((- x) // y). К сожалению, многие языки реализуют более менее полезное деление с усечением на нуль, и этот метод не будет работать с ними. – supercat