Задание такое: написать функцию округлания хитрой величины в большую сторону без использования библиотечных функций. Получение хитрой величины – дело нехитрое, а вот на округлении я застрял. Появилась мысль написать нужный кусок на ассемблере.
Теперь вопрос: можно ли написать округление в большую сторону средствами С++? Если нет, как пользоваться ассемблерными вставками в С++?
10 января 2009 в 18:05
#20 Если нужна именно такая точность, то можно и так.
10 января 2009 в 13:00
#15 Да, на все случаи жизни не подходит. Об этом я как-то не подумал. Но если "хитрая величина" укладывается в диапазон инта, то варианты с интом подходят.
#16 Для отрицательных чисел надо отбрасывать дробную часть.
Т.к. при округлении до большего для -2.3 должно быть -2, а не -3.
#17 floor(x + 0.5) – это округление до ближайшего целого, а надо до наибольшего.
10 января 2009 в 13:00
#19, о_О
округление до наибольшего целого… это до константы, что ли?
типа так: ((~0×0) >> 1)
10 января 2009 в 0:03
ммм…. Валентин! Только задание у Андрея "без использования библиотечных функций" )))
9 января 2009 в 20:04
Самое лучшое округление
x=floor(x+0.5)
9 января 2009 в 19:02
Денис Боенсков про х==2 не подумал.
Для отрицательных чисел, я думаю, надо отнимать.
А про диапазон значеений – long int.
9 января 2009 в 16:05
Приведение к целому типу – не есть решение на все случаи жизни.
Диапазон значений чисел с плавающей точкой значительно шире, чем целых чисел. Так что если число лежит вне диапазона значений типа int, произойдёт ошибка. На выходе тоже должно быть число с плавающей точкой.
9 января 2009 в 16:01
хмммм….. ё-маё!!!! Действительно, int просто отбрасывает дробную часть (((( Признаю ошибку. Пожалуй, y=int(x+0.99999) наиболее приемлемый вариант. Лев +1 ))) Вариант Сергея не пройдет для x==2
….. PS. для отрицательных чисел дает неверный результат
9 января 2009 в 15:04
надо y = int(x+1.0) – и тогда 2.3 -> 3
а y = int(x+0.5) – будет 2.3 -> 2.
9 января 2009 в 15:03
Да е-мое, int(x+0.5) и никак иначе!
int(x+0.99999) округлит 2.9 до 4, а не до 3.
9 января 2009 в 15:02
тогда y = int(x+0.99999)
9 января 2009 в 15:00
Павел! А как тогда будет округлять y=int(x)???
9 января 2009 в 14:01
y = int(x+0.5) – это как раз 2.3 -> 3.
9 января 2009 в 14:00
>Нуу, это неинтересно
Краткость – сестра таланта )))
9 января 2009 в 14:00
> y=int(x+0.5)
Это стандартное округление, т.е. "2.3 -> 2", а надо "2.3 -> 3".
Я бы попробовал так:
if (x > 0)
{
y = (int)x;
if (y < x) // проверяем, что получили число меньшее исходного.
++y;
}
else
{
y = x; // Отбрасываем дробную часть, это как раз будет большее число.
}
9 января 2009 в 13:04
y=int(x+0.5) – округление в большую сторону до целого числа
9 января 2009 в 13:04
Нуу, это неинтересно
9 января 2009 в 13:04
о!) Спасибо большое)
9 января 2009 в 13:03
А как насчет посмотреть исходники ceil() из math.h?
//codesearch.google.com в помощь
9 января 2009 в 13:03
Аа, так оно на асме и написано.
//www.google.com/codesearch/p?hl=en#crzNwex9NZ0...