Если я разделю 3 на 2, я хочу, чтобы ответ был 2 (то есть 1,5 округляется до 2) - PullRequest
3 голосов
/ 20 марта 2010

Как получить верхний предел числа в С?

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

Ответы [ 8 ]

13 голосов
/ 20 марта 2010

Если вы просто заинтересованы в делении на 2, то просто возьмите (n + 1) / 2, чтобы сохранить его в целочисленной математике. Например, (3 + 1) / 2 дает 2. Для большего числа x используйте x - 1. Например, (3 + 7) / 8 = 1, для 3, деленного на 8.

В общем случае вы ищете функцию потолка - потолок. Быстрый поиск в Google по запросу "math ceil C" дал эту страницу вверху результатов: http://www.elook.org/programming/c/ceil.html

4 голосов
/ 20 марта 2010
3 голосов
/ 20 марта 2010
#include <math.h>
ceil(3.0/2); //2.0

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

2 голосов
/ 20 марта 2010
int x= ceil((float)3/2);
1 голос
/ 22 марта 2010

(Если это квалифицируется как некромантия потока, пожалуйста, сообщите, и я удалю это)

Быстрый способ вернуть округленное вверх число - это добавить делитель минус один к дивиденду и разделить.

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, мы гарантируем, что новый дивиденд, divind - 1 , при делении на divisor , всегда будет возвращать значение, меньшее, чем потолок отношения с плавающей запятой.

Все, что осталось теперь, это добавить 1 к этому частному, который, кстати, является дивизором пола ((с плавающей запятой) / (с плавающей запятой)).

1 голос
/ 20 марта 2010
int i = 3;
int j = 2;
int k = (i + j - 1) / j;
1 голос
/ 20 марта 2010

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

int  number = 3;
int  divisor = 2;
int  result = (number + (divisor+1)/2) / divisor;
0 голосов
/ 20 марта 2010
int x = 3.0/2 + 0.5;
...