| Автор |
Съобщение |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 Закръгляване
... до най-близка граница. Примерно при граница 0.5 всички резултати от закръгляването завършват или на .0, или на .5, при граница 0.25 всички резултати са или .0 или .25 или .5 или .75, и т.н... Някакви идеи как стане?
ПС.... погрешка пуснах темата в грешен раздел. Рек или някой друг админ ако може да я премести в "Програмиране..."
_________________ 'просто' е технически синоним на 'красиво'
|
| Сря Юни 21, 2017 10:51 am |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Закръгляване
Класическия алгоритъм е с изваждане на остатъка от делене като предварително е добавен половин делител за да закръгли към по близкия резултат. Т.е.
int round(v, r) { return v - (v+r/2) % r; }
_________________ Мразя да мразя ...
|
| Сря Юни 21, 2017 11:04 am |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
 Re: Закръгляване
Ако работиш компилатор на микрочеп, не търси round() функция - няма...
|
| Сря Юни 21, 2017 2:50 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
 Re: Закръгляване
_________________ main[-1u]={1};
|
| Сря Юни 21, 2017 3:47 pm |
|
 |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 Re: Закръгляване
Абе забравих да спомена. Сигурно е забавно, но това ми трябва на бъзик (разбирай "бейсик"  )
_________________ 'просто' е технически синоним на 'красиво'
|
| Сря Юни 21, 2017 3:54 pm |
|
 |
|
bobihot
Ранг: Форумен бог
Регистриран на: Сря Фев 13, 2013 3:35 pm Мнения: 1803
|
 Re: Закръгляване
Ako са такива кратни- умножаваш по 2|4 закръгляш и делиш на толкова.
|
| Сря Юни 21, 2017 5:39 pm |
|
 |
|
Reader
Ранг: Новодошъл
Регистриран на: Нед Апр 17, 2005 9:23 am Мнения: 112
|
 Re: Закръгляване
Не съм убеден, че това работи. По-практичен е следният алгоритъм:
|
| Чет Юни 22, 2017 8:30 am |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Закръгляване
Колега, хайде да го разнищим това което си написал: (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 |
|
 |
|
Reader
Ранг: Новодошъл
Регистриран на: Нед Апр 17, 2005 9:23 am Мнения: 112
|
 Re: Закръгляване
Хайде да не спорим, а просто да заместим например 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 |
|
 |
|
Reader
Ранг: Новодошъл
Регистриран на: Нед Апр 17, 2005 9:23 am Мнения: 112
|
 Re: Закръгляване
Липсва ти добавянето на половинката в int-а; в момента формулата ти реализира floor(), а не round(). И ако r е float, защо да не е v = r*int(v/r + 0.5)
|
| Чет Юни 22, 2017 12:38 pm |
|
 |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 Re: Закръгляване
Във версията която ползвам INT() закръглява а не реже целочислено
_________________ 'просто' е технически синоним на 'красиво'
|
| Чет Юни 22, 2017 1:43 pm |
|
 |
|
Reader
Ранг: Новодошъл
Регистриран на: Нед Апр 17, 2005 9:23 am Мнения: 112
|
 Re: Закръгляване
Тогава извинявай – всичко е точно! 
|
| Чет Юни 22, 2017 1:49 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Закръгляване
 |  |  |  | Reader написа: Хайде да не спорим, а просто да заместим например 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 |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
 Re: Закръгляване
А как се изчислява ДДС на касова бележка от 1 стотинка?
|
| Пет Юни 23, 2017 11:10 am |
|
|