Отговори на тема  [ 23 мнения ]  Отиди на страница 1, 2  Следваща
Закръгляване 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Закръгляване
... до най-близка граница.
Примерно при граница 0.5 всички резултати от закръгляването завършват или на .0, или на .5, при граница 0.25 всички резултати са или .0 или .25 или .5 или .75, и т.н...
Някакви идеи как стане?

ПС.... погрешка пуснах темата в грешен раздел. Рек или някой друг админ ако може да я премести в "Програмиране..."

_________________
'просто' е технически синоним на 'красиво'


Сря Юни 21, 2017 10:51 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Закръгляване
Класическия алгоритъм е с изваждане на остатъка от делене като предварително е добавен половин делител за да закръгли към по близкия резултат. Т.е.

int round(v, r) { return v - (v+r/2) % r; }

_________________
Мразя да мразя ...


Сря Юни 21, 2017 11:04 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение Re: Закръгляване
Ако работиш компилатор на микрочеп, не търси round() функция - няма...


Сря Юни 21, 2017 2:50 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Закръгляване
Gogo написа:
Ако работиш компилатор на микрочеп, не търси round() функция - няма...


double ceil(double);
double floor(double);

http://www.cplusplus.com/reference/cmath/floor/
http://www.cplusplus.com/reference/cmath/ceil/

ма не са на 0.5

_________________
main[-1u]={1};


Сря Юни 21, 2017 3:47 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Закръгляване
Абе забравих да спомена. Сигурно е забавно, но това ми трябва на бъзик (разбирай "бейсик" :))

_________________
'просто' е технически синоним на 'красиво'


Сря Юни 21, 2017 3:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Фев 13, 2013 3:35 pm
Мнения: 1803
Мнение Re: Закръгляване
Ako са такива кратни- умножаваш по 2|4 закръгляш и делиш на толкова.


Сря Юни 21, 2017 5:39 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Апр 17, 2005 9:23 am
Мнения: 112
Мнение Re: Закръгляване
palavrov написа:
Класическия алгоритъм е с изваждане на остатъка от делене като предварително е добавен половин делител за да закръгли към по близкия резултат. Т.е.
int round(v, r) { return v - (v+r/2) % r; }

Не съм убеден, че това работи. По-практичен е следният алгоритъм:
Код:
int(v/r+0.5).r


Чет Юни 22, 2017 8:30 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Закръгляване
Reader написа:
palavrov написа:
Класическия алгоритъм е с изваждане на остатъка от делене като предварително е добавен половин делител за да закръгли към по близкия резултат. Т.е.
int round(v, r) { return v - (v+r/2) % r; }

Не съм убеден, че това работи. По-практичен е следният алгоритъм:
Код:
int(v/r+0.5).r

Колега, хайде да го разнищим това което си написал:
(v/r + 0.5)*r = (v/r +1/2)*r = (r*v/r + r/2) = v+r/2 - до тук същото само, че с различна формула :)
int(v+r/2) има същият ефект като v-(v+1/2)%1 само, че в случая приравняваш r=1 и то не за цялата формула която съм написал т.е. така като си го написал няма да работи вярно за 0.25 примерно. В моя пример единственото грешно нещо е, че използвам % вместо fmod() - но все пак предполагам, че четящите тук са достатъчно компетенти по отношение на C/C++ оператори и RTL за се сетят и сами как да го модифицират за double. Ако числата на които трябва да се закръгля са винаги във формата 1/n тогава може да се избяга от сметки с плаваща запетая като се умножава и дели на n - едва ли обаче се налага да се оптимизира чак дотолкова, че да се цепи инструкцията и/или такт-а.

_________________
Мразя да мразя ...


Чет Юни 22, 2017 8:51 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Закръгляване
е, в крайна сметка с идеи оттук стигнах до приемливо решение. Ето как изглежда на бейсика: float v=int(v/r)/(1/r)

_________________
'просто' е технически синоним на 'красиво'


Чет Юни 22, 2017 11:40 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Апр 17, 2005 9:23 am
Мнения: 112
Мнение Re: Закръгляване
palavrov написа:
Колега, хайде да го разнищим това което си написал:

Хайде да не спорим, а просто да заместим например v=0.8 и r=0.5 в твоята формула. Получаваме:
0.8 - (0.8 + 0.25) % 0.5 = 0.8 - (1.05 % 0.5) = 0.8 - 0.05 = 0.795
т.е. нищо близко до правилния отговор.
А грешката в преобразуванията, които правиш, е че приравняваш x.int(y) на int(x.y), което не е коректно.

И изобщо – темата е приключена; отворилият я е стигнал до приемливо за него решение.


Чет Юни 22, 2017 12:29 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Апр 17, 2005 9:23 am
Мнения: 112
Мнение Re: Закръгляване
Н'бабане Гт'муан'га написа:
е, в крайна сметка с идеи оттук стигнах до приемливо решение. Ето как изглежда на бейсика: float v=int(v/r)/(1/r)

Липсва ти добавянето на половинката в int-а; в момента формулата ти реализира floor(), а не round(). И ако r е float, защо да не е v = r*int(v/r + 0.5)


Чет Юни 22, 2017 12:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Закръгляване
Reader написа:
Н'бабане Гт'муан'га написа:
е, в крайна сметка с идеи оттук стигнах до приемливо решение. Ето как изглежда на бейсика: float v=int(v/r)/(1/r)

Липсва ти добавянето на половинката в int-а; в момента формулата ти реализира floor(), а не round(). И ако r е float, защо да не е v = r*int(v/r + 0.5)


Във версията която ползвам INT() закръглява а не реже целочислено

_________________
'просто' е технически синоним на 'красиво'


Чет Юни 22, 2017 1:43 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Апр 17, 2005 9:23 am
Мнения: 112
Мнение Re: Закръгляване
Тогава извинявай – всичко е точно! :)


Чет Юни 22, 2017 1:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Закръгляване
Reader написа:
palavrov написа:
Колега, хайде да го разнищим това което си написал:

Хайде да не спорим, а просто да заместим например v=0.8 и r=0.5 в твоята формула. Получаваме:
0.8 - (0.8 + 0.25) % 0.5 = 0.8 - (1.05 % 0.5) = 0.8 - 0.05 = 0.795
т.е. нищо близко до правилния отговор.
А грешката в преобразуванията, които правиш, е че приравняваш x.int(y) на int(x.y), което не е коректно.

И изобщо – темата е приключена; отворилият я е стигнал до приемливо за него решение.

Мдам - прав си, че имам грешка но не е в това което казваш и е сравнително лесна за оправяне:

(v+r/2)-(v+r/2)%r

А твоята формулата също става, че е и по елегантна, евала:

round(v/r) * r

_________________
Мразя да мразя ...


Чет Юни 22, 2017 3:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Закръгляване
А как се изчислява ДДС на касова бележка от 1 стотинка?


Пет Юни 23, 2017 11:10 am
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 23 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни