Округление
Округле́ние — замена числа на его приближённое значение (с определённой точностью) в определённом разряде, записанное с меньшим количеством значащих цифр [1] . Модуль разности между двумя числами в процессе округления (заменяемое число и заменяющее число) называется ошибкой округления.
Основные методы округления
Разные сферы используют разные методы округления. Во всех этих методах лишние знаки до нужного числа отбрасываются — предшествующее корректируется по тому или иному правилу.
Округление к ближайшему целому
Округление к ближайшему целому — наиболее часто используемое округление, при котором число округляется до целого. В общих случаях округление выглядит следующим образом:
- если N+1 знак < 5, то N-й знак сохраняют, а N+1 и все последующие обнуляют;
- если N+1 знак ≥ 5, то N-й знак увеличивают на единицу, а N+1 и все последующие обнуляют;
Округление к большему
Округление к большему работает следующим образом: если обнуляемые знаки не равны нулю, предшествующий знак увеличивают на единицу, если число положительное, или сохраняют, если число отрицательное. В экономическом жаргоне такое округление называется «округление в пользу продавца/кредитора». В Excel и других редакторах таблиц, а также в англоязычных источниках и учебниках по математике данная операция называется «celling» (потолок). Как пример:
Погрешность округления находится в пределах +1 последнего сохраняемого разряда.
Округление к меньшему
Округление к меньшему работает следующим образом: если обнуляемые знаки не равны нулю, предшествующий знак сохраняют, если число положительное, или увеличивают на единицу, если число отрицательное. В жаргоне экономистов такое явление называется «округление в пользу покупателя/дебитора». Англоязычные источники, учебники по математике, а также Excel обозначают это как «floor» (пол). Например:
Погрешность округления — в пределах −1 последнего сохраняемого разряда.
Случайное округление
При случайном округлении округление в большую или меньшую сторону происходит в случайном порядке. Вероятность округления вверх равна дробной части. Этот способ делает накопление ошибок случайной величиной с нулевым математическим ожиданием.
Варианты округления 0,5 к ближайшему целому
Отдельного описания требуют правила округления для специальных случаев, когда (N+1)-й знак = 5 [2] , а последующие знаки равны нулю. Есть следующие варианты правила округления до ближайшего целого для данного случая:
- математическое округление — округление всегда в большую сторону (по модулю); предыдущий разряд всегда будет увеличиваться на единицу;
- округление до ближайшего чётного — число округляют к ближайшему чётному числу соответственно; 2,5 при округлении станет 2, 3,5 станет 4, 1,5 также будет равняться 2;
- случайное округление — числа округляются в случайном порядке в большую или меньшую сторону, но с равной вероятностью (что используется в статистике);
- поочередное округление (чередующееся округление) — числа округляются поочередно в большую или меньшую сторону
Математическое округление имеет довольно фатальный недостаток в виде накопления ошибки округления; это приводит к тому, что значения числа или чисел после процедуры округления становятся больше, и это искажает точность. Например: округление до целых денежных сумм или веса предметов. Если в реестрах строк окажутся значения после запятой, что больше 50, то и итоговая сумма станет на 50 больше.
Остальные три варианта как раз и нужны для того, чтобы ошибка округления не сказалась на точности расчётов. При округлении до ближайшего чётного ошибки округления взаимно погашаются (правда, это верно лишь тогда, когда набор округляемых чисел обладает свойствами случайного ряда).
Два последних варианта предполагают, что одна половина данных будет округлена в другую сторону, а другая — в другую, что повысит точность расчётов. Но и у них есть два недостатка:
- случайное округление требует для каждой строки создавать числа. Для замены каждого числа требуется проводить сложение, деление, умножение и вычитание; если чисел много — то работа с ними сильно замедляется;
- чередующееся округление требует сохранять «флаг», показывающий в какую из сторон было произведено округление в последний раз и при каждом округлении этот самый «флаг» переключать. Если чисел много, что нагрузка из-за вычислительных процессов возрастает, что также замедляет работу со значениями.
Применение
Округление используется в тех случаях, когда точные вычисления произвести не представляется возможным, или можно дальше работать с некоторой погрешностью. Например, абсолютно точно нельзя указать вес сахара в одной чайной ложке — он будет колебаться в зависимости от того, сколько сахара человек зачерпнул; и в таких случаях делают приписку «приблизительно n грамм сахара».
Округление является одним из важнейших статистических инструментов. Как пример: нельзя абсолютно точно выверить количество проживающих в городе людей — естественная миграция, умершие и родившиеся будут влиять на колебания численности жителей. Округление можно применить и для простоты восприятия цифр в графиках, округлив процент респондентов до десятых или сотых долей.
В физике округление применяется для расчёта реальных физических величин, при этом есть определённая специфика применения — расчёт точности идёт до определённой конечной точности, где погрешность будет минимальна [3] .
Ссылки и источники
- ↑Математика с нуля(рус.) . Математика с нуля. Дата обращения: 24 марта 2023.
- ↑ Генри С. Уоррен, мл. Глава 3. Округление к степени 2 // Алгоритмические трюки для программистов = Hacker’s Delight. — М.: «Вильямс», 2007. — С. 288. — ISBN 0-201-91465-4..
- ↑В. М. Заварыкин, В. Г. Житомирский, М. П. Лапчик. Техника вычислений и алгоритмизация. — Просвещение, 1987. — С. 160.
Данная статья имеет статус «готовой». Это не говорит о качестве статьи, однако в ней уже в достаточной степени раскрыта основная тема. Если вы хотите улучшить статью — правьте смело!
- Страницы, использующие волшебные ссылки ISBN
- Знание.Вики:Готовые статьи по науке
- Все статьи
- Математика
- Математические понятия
Adaptive precision arithmetic
Все вычисления, производимые компьютером в модели с плавающей точкой, имеют погрешность. При большом количестве арифметических действий она возрастает. Во многих случаях результирующая погрешность уже не устраивает, и требуется либо абсолютно точное вычисление, либо меньшая погрешность. Одним из решений данной проблемы является хранение чисел в виде рациональных дробей, в которых числитель и знаменатель представляется в виде длинного целого числа. Но работать с такими числами довольно «дорого» по времени и тяжело в реализации: необходимо писать факторизацию чисел, эффективно сокращать дроби. Для улучшения работы нужны определенные оптимизации. Одной из них и является использование адаптивной арифметики (англ. adaptive precision arithmetic).
Базовые понятия
Представление чисел
Большинство современных процессоров поддерживают числа с плавающей точкой в форме [math] \pm \mathrm \times 2^<\mathrm
Числа с плавающей точкой, как правило, нормализованы, то есть если число не равно нулю, то первый значимый бит равен единице, а экспонента устанавливается соответственно. Например, в [math]p[/math] -битной арифметике число 1101 (десятичное 13) будет выглядеть как [math]1.101 \times 2^3[/math] .
Далее в этой статье фраза «что-либо представимо в [math]p[/math] битах» будет означать представимость в [math]p[/math] битах мантиссы, не учитывая знак и экспоненту.
Разложения
| Определение: |
| Два числа [math]x[/math] и [math]y[/math] называются неперекрывающимися (англ. nonoverlapping), если номер наименьшего значимого бита числа [math]x[/math] (нумерация справа налево) больше, чем номер наибольшего значимого бита числа [math]y[/math] , или наоборот. |
Более формально, [math]x[/math] и [math]y[/math] не перекрываются, если существует такое целое число [math]r[/math] и [math]s[/math] , что [math]x = r2^s[/math] и [math]|y| \lt 2^s[/math] , или [math]y = r2^s[/math] и [math]|x| \lt 2^s[/math] .
Ноль не пересекается ни с одним другим числом.
Например, числа [math]1100[/math] и [math]-10.1[/math] не пересекаются, а [math]110[/math] и [math]10[/math] — пересекаются.
| Определение: |
| Два числа [math]x[/math] и [math]y[/math] называются смежными (англ. adjacent), если они перекрываются, если [math]x[/math] и [math]2y[/math] перекрываются, или [math]2x[/math] и [math]y[/math] перекрываются. |
Например, числа [math]1100[/math] и [math]11[/math] — смежные, а [math]1100[/math] и [math]1000[/math] — нет.
Иногда для использовании точной арифметики может понадобиться больше, чем [math]p[/math] бит для хранения величин. В связи с этим вводится одно из базовых форм хранения чисел для такой арифметики.
| Определение: |
| Разложением числа [math]x[/math] называется такое его представление [math]x = x_n + x_ + \dots + x_1[/math] , где каждое [math]x_i[/math] выражено [math]p[/math] -битным числом с плавающей точкой и называется компонентой этого разложения. |
| Определение: |
| Разложение называется неперекрывающимся (несмежным), если все его компоненты взаимно не перекрываются (не являются смежными). |
Как правило, разложения должны быть неперекрывающимися, а их компоненты должны быть упорядочены от большей к меньшей по величине (то есть [math]x_n[/math] — большая). Далее будут рассматриваться именно такая их форма.
Округление
Все алгоритмы, представленные в этой статье, предполагают, что сложение, вычитание и умножение производятся с точным округлением. Предполагается, что числа представляются в [math]p[/math] битах.
Например, в 4-битной арифметике произведение [math]111 \times 101 = 100011[/math] будет округлено в [math]1.001 \times 2^5[/math] .
При вычислении результата может возникнуть ситуация, когда значение попадает в точности между двумя соседними [math]p[/math] -битными значениями. Тогда требуется определить правило поведения в таком случае. Рассмотрим некоторые из них.
| Определение: |
| Округление до ближайшего четного (англ. round-to-even) — правило, при котором округление в вышеописанном случае производится к ближайшему [math]p[/math] -битному четному значению. |
| Определение: |
| Округление к нулю (англ. round-toward-zero) — правило, при котором округление в вышеописанном случае производится [math]p[/math] -битному значению, находящемуся между точным значением и нулем, а также ближайшему к точному значению. |
Например, в 4-битной арифметике число [math]10011[/math] будет округлено до [math]1.010 \times 2^4[/math] по первому правилу, и до [math]1.001 \times 2^4[/math] по второму.
Стоит отметить, что стандарт IEEE 754 использует округление до ближайшего четного по умолчанию.
Далее в этой статье символами [math]\oplus, \ominus[/math] и [math]\otimes[/math] будут обозначаться [math]p[/math] -битные сложение, вычитание и умножение с точным округлением соответственно.
Из-за округления данные операции теряют некоторые важные свойства, например, ассоциативность: [math](1000 \oplus 0.011) \oplus 0.011 = 1000[/math] , но [math]1000 \oplus(0.011 \oplus 0.011) = 1001[/math] .
При анализе округления часто используют так называемый [math]\operatorname[/math] .
| Определение: |
| ULP (англ. units in the last place) — эффективная величина самого младшего ( [math]p[/math] -ого) бита. |
Например, [math]\operatorname(-1100) = 1, \operatorname(1) = 0.001[/math] в [math]p[/math] -битной арифметике.
Так же полезной нотацией является [math] \operatorname(a \circledast b) [/math] , которая обозначает ошибку округлении результата выполнения операции [math]\circledast[/math] . Отметим, что если [math]\operatorname[/math] всегда беззнаковая величина, то [math]\operatorname[/math] может иметь знак. Для базовых операций (сложение, вычитание, умножение) [math] a \circledast b = a \ast b + \operatorname(a \circledast b)[/math] , и точное округление гарантирует, что [math] |\operatorname(a \circledast b)| \leqslant \frac\operatorname(a \circledast b)[/math] .
Свойства
Иногда есть возможность найти более точные границы ошибки округления, что будет видно далее из лемм. Первая лемма используется, когда один операнд много меньше другого, а вторая — когда сумма близка к степени двойки. Для лемм 1 — 4 пусть [math]a, b[/math] — [math]p[/math] -битные числа с плавающей точкой. Леммы приводятся без доказательств, их можно найти в статье Джонатана Шевчука «Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates».

Рисунок к первым двум леммам.
Пусть [math]a \oplus b = a + b + err(a \oplus b) [/math] . Ошибка округления [math]err(a \oplus b)[/math] не превзойдет [math]max(|a|, |b|)[/math] . (Аналогично для вычитания).
Как следствие, верна следующая лемма:
Ошибка округления [math]err(a \oplus b)[/math] может быть представлена в [math]p[/math] битах.
Пусть [math]|a + b| \leqslant |b|[/math] и [math]|a + b| \leqslant |a|[/math] . Тогда [math]a \oplus b = a + b[/math] . (Аналогично для вычитания).
Пусть [math]b \in \left [ \frac, 2a \right ][/math] . Тогда [math]a \ominus b = a — b[/math] .
Алгоритмы суммирования
Простое суммирование
Важной базовой операцией во всех алгоритмах, основанных на представлении чисел в виде разложений, является сумма двух [math]p[/math] -битных величин, результатом которой является разложение длины два. Есть два алгоритма для выполнения этой задачи — алгоритмы Деккера и Кнута.
Сумма по Деккеру
Пусть [math]a[/math] и [math]b[/math] есть [math]p[/math] -битные числа, причем [math]|a| \geqslant |b|[/math] . Тогда следующий алгоритм вернет неперекрывающееся разложение [math]x + y[/math] такое, что [math]a + b = x + y[/math] , где [math]x[/math] — приближение (аппроксимация) суммы [math]a + b[/math] , а [math]y[/math] представляет собой ошибку округления при вычислении [math]x[/math] . (Аналогично для вычитания).
Псевдокод для суммы:
Псевдокод для разности:
Отметим, что величины на выходе этой процедуры вовсе не должны иметь один знак, что будет видно из примеров ниже.
В первом примере [math]a[/math] и [math]b[/math] имеют один знак.

Во втором примере [math]a[/math] и [math]b[/math] имеют противоположные знаки, и [math]|b| \gt \frac<|a|>[/math] .

Сумма по Кнуту
Пусть [math]a[/math] и [math]b[/math] есть [math]p[/math] -битные числа, причем [math]p \gt 3[/math] . Тогда следующий алгоритм вернет неперекрывающееся разложение [math]x + y[/math] такое, что [math]a + b = x + y[/math] , где [math]x[/math] — приближение (аппроксимация) суммы [math]a + b[/math] , а [math]y[/math] представляет собой ошибку округления при вычислении [math]x[/math] .

Пусть $x$ и $y$ — величины, возращенные алгоритмом $\mathrm
Суммирование разложений
Базируясь на алгоритмах сложения двух [math]p[/math] -битных чисел, описанных выше, можно предложить алгоритмы суммирования разложений. В этой статье их будет предложено два: $\mathrm $ и $\mathrm $. Первый алгоритм прибавляет к $m$-элементному разложению $n$-элементное разложение за время [math]O(mn)[/math] , в то время, как последний алгоритм делает это за [math]O(n + m)[/math] .
Несмотря на такое различие в асимптотике, первый алгоритм на практике может оказаться быстрее на разложениях, чей размер мал и фиксирован, потому что программные циклы могут быть полностью развернуты, а косвенные расходы времени исчезают, так как можно отказаться от использования массива). Линейный же алгоритм имеет определенные условия, при которых подобные оптимизации невозможны.
ExpansionSum имеет свойство, что если входные данные были неперекрывающимися (несмежными), то и на выходе мы получим разложения с соответствующим свойством.
FastExpansionSum имеет несколько серьезных недостатков. Первый из них — алгоритм не сохраняет свойств неперекрываемости/несмежности. Второй — алгоритм основывается на округлении до ближайшего четного, что делает его непереносимым.
Как правило, общим недостатком алгоритмов работы с разложениями является то, что в разложении на выходе могут быть нулевые элементы, даже если в исходном разложении их не было. Например, если подать на вход разложениея $1111 + 0.0101$ и $1100 + 0.11$, то результатом будет $11100 + 0 + 0 + 0.0001$. К счастью, алгоритмы, описанные в этой статье хорошо справляются с этой проблемой.
Перед описанием алгоритмов суммирования разложений, приведем алгоритм прибавления к разложению [math]p[/math] -битного числа.
Сумма разложения и числа
Пусть $e = \sum^
Псевдокод для суммы:
$GrowExpansion(e, b)$ $1$ $Q_0 \Leftarrow b$ $2$ $for$ $i = 1 \dots m$ $3$ $(Q_i, h_i) \Leftarrow TwoSum(Q_, e_i)$ $4$ $h_ \Leftarrow Q_m$ $5$ $return$ $h$
$Q_i$ — приближенное значение суммы $b$ и первых $i$ компонент $e$.

Каждая их первых $m$ компонент разложения $h$ не больше чем соответствующая компонента из $e$, то есть $
Простое суммирование
Пусть $e = \sum^
Псевдокод для суммы:
$ExpansionSum(e, f)$ $1$ $h \Leftarrow e$ $2$ $for$ $i = 1 \dots n$ $3$ $\langle h_i, h_, \dots, h_ \rangle \Leftarrow GrowExpansion(\langle h_i, h_, \dots, h_ \rangle, f_i)$ $4$ $return$ $h$

Быстрое суммирование
В отличие от $\mathrm $, $\mathrm $ не сохраняет свойства неперекрываемости и несмежности, но гарантирует, что если если входное разложение было строго неперекрывающимся, то на выходе получится разложение с таким же свойством.
| Определение: |
| Разложение называется строго неперекрывающимся, если если его компоненты попарно неперекрываются, ни одна компонента не смежна никаким двум другим, а также любая пара смежных компонент состоит из степеней двойки. |
Например, $11000 + 11$ и $10000 + 1000 + 10 + 1$ — строго неперекрывающиеся разложения, а $11100 + 11$ и $100 + 10 + 1$ — нет.
Для разложения эта характеристика означает, что ноль в записи разложения должен появляться как минимум каждые $p + 1$ бит. Например, разложение, каждая компонента которого есть $p$-битное число, и максимальная величина которой равна $1111$, может быть не больше $1111.01111011110\dots$.
Каждое несмежное разложение является строго неперекрывающимся, а также каждое строго неперекрывающееся разложение есть неперекрывающееся. В общем случае, обратное не верно.
Утверждается, что после предположения о том, что все разложения строго неперекрывающиеся, алгоритм, приведенный ниже, корректно работает на машинах с округлением до ближайшего четного.
Пусть $e = \sum^
Псевдокод для суммы:
$ExpansionSum(e, f)$ $1$ $Merge$ $e$ $and$ $f$ $into$ $a$ $single$ $sequence$ $g$, $in$ $order$ $of$ $nondecreasing$ $magnitude$ $(possibly$ $with$ $interspersed$ $zeros)$ $2$ $(Q_i, h_1) \Leftarrow FastTwoSum(g_2, g_1)$ $3$ $for$ $i = 3 \dots (n+m)$ $4$ $(Q_i, h_) \Leftarrow TwoSum(Q_, g_i)$ $5$ $h_ \Leftarrow Q_$ $6$ $return$ $h$

На рисунке ниже показан конкретный пример работы алгоритма
Тип «MathOperations» в Mobile SMARTS
MathOperations – тип, содержащий метод, позволяющий округлять числа до нужного количества разрядов после запятой. Доступные методы:
| Имя метода | Описание |
| Round(val, digits, orient) | Округляет число до нужного количества разрядов после запятой |
Примеры использования
Round
Есть 2 метода округления: до ближайшего чётного и дальше от нуля. Например, в случае округления дальше от нуля, 3,75 округляется до 3,8, 3,85 округляется до 3,9, -3,75 округляется до -3,8 и -3,85 округляется до -3,9. Это ещё можно назвать округлением в большую сторону. В случае же округления до ближайшего чётного, как 3,75, так и 3,85 округляются до 3,8 и -3,75 и -3,85 округляются до -3,8. Если хотите использовать округление до ближайшего чётного, то в качестве переменной orient нужно передавать 0, для округления дальше от нуля — 1 Код:
Число1 = MathOperations.Round(3.85,2,0);
Число2 = MathOperations.Round(3.85,2,1);
В первом случае округляем до ближайшего чётного, во втором дальше от нуля. Результат:
| До ближайшего чётного | Дальше от нуля |
![]() |
Была ли статья полезна?
Для чего было введено округление к ближайшему четному
Здравствуйте, RealBobEx, Вы писали:
RBE>Но стоит ли тратить на них (алтернативн. либы) время ради такого пустяка?
IMHO от альтернатив зависит. Ну да это тут ужо всё обсуждалось. Ищи флейм по словам «минусы STL»
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно «ради красного словца». За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: округление вещественных чисел без .Net
| От: | dont.avt | |
| Дата: | 09.12.08 18:16 | |
| Оценка: | +1 | |
Здравствуйте, RealBobEx, Вы писали:
RBE>Что верно, то верно
RBE>Но, я думаю, как раз сейчас человек нуждается в помощи, а не в наездах .
RBE>Захочет — разберется и с округлением, и чем оно отличаетя от приведения типа.
RBE>А относительно названия готовых функций я согласен с Erop — название round — более «гуманное» и ясное.
RBE>Но, дорогой Erop, уж так сложилось, нет таковой , а к stl нужно просто. привыкнуть .
В С99 round есть
dont@dont ~ $ cat bla.c #include #include int main(int argc,char** argv) < printf("%f\n",round(4.6)); return 0; >dont@dont ~ $ gcc -o res bla.c -lm -std=c99 dont@dont ~ $ ./res 5.000000
Я до сих пор не понял, на каком языке пишет автор.
Re[7]: округление вещественных чисел без .Net
| От: | dont.avt |
| Дата: | 09.12.08 18:22 |
| Оценка: |
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, dont.avt, Вы писали:
E>>>А мне наоборот, кажется логичным, что округлять надо функцией.
DA>>Как видишь, нет функции round.
E>Ну мне и stl тоже не нравится. А в нормальных библиотеках такая функция (так же как max, например) есть.
Ну в плане «нормальности» библиотек я больше доверяю ребятам из ANSI\ISO, чем тебе. Уж извини, ничего личного.
Для моих целей вполне хватает ceil,floor. Если нужно что-то серьезней — для этого есть специализированные библиотеки.
Re[6]: округление вещественных чисел без .Net
| От: | Erop | |
| Дата: | 09.12.08 18:26 | |
| Оценка: | -1 | |
Здравствуйте, dont.avt, Вы писали:
DA>В С99 round есть
IMHO, С — вообще более практически ориентированные люди разрабатывают, чем С++.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно «ради красного словца». За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: округление вещественных чисел без .Net
| От: | Erop |
| Дата: | 09.12.08 18:28 |
| Оценка: |
Здравствуйте, dont.avt, Вы писали:
DA>Ну в плане «нормальности» библиотек я больше доверяю ребятам из ANSI\ISO, чем тебе. Уж извини, ничего личного.
Ну и хорошо. Хотя я не понимаю таких аргументов. Если у тебя есть конкретные возражения и соображения — апеллировать к неаргументированному мнению авторитетов IMHO странно
DA>Для моих целей вполне хватает ceil,floor. Если нужно что-то серьезней — для этого есть специализированные библиотеки.
Ну и хорошо тебе значит. А мне, вот, например, round не хватает. И в С она вроде как есть, кстати.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно «ради красного словца». За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: округление вещественных чисел без .Net
| От: | Vamp |
| Дата: | 09.12.08 18:49 |
| Оценка: |
Окргуление, кстати, не вполне тривиальная вещь. 0.5 куда округлять будем? А 1.5?
Да здравствует мыло душистое и веревка пушистая.
Re[9]: округление вещественных чисел без .Net
| От: | dont.avt |
| Дата: | 09.12.08 18:56 |
| Оценка: |
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, dont.avt, Вы писали:
DA>>Ну в плане «нормальности» библиотек я больше доверяю ребятам из ANSI\ISO, чем тебе. Уж извини, ничего личного.
E>Ну и хорошо. Хотя я не понимаю таких аргументов. Если у тебя есть конкретные возражения и соображения — апеллировать к неаргументированному мнению авторитетов IMHO странно
Ты ввел понятие «нормальности» в нашу дискуссию, ничем его не аргументировав. Я этого не делал, и не говорил, что библиотеки Си или С++ отлично спроектированы или наоборот. Изначально меня просто поразило, что человек не может округлить число без помощи функции.
Что тебе не понравилось в моём сообщении, и за что я минус получил, я так и не понял.
DA>>Для моих целей вполне хватает ceil,floor. Если нужно что-то серьезней — для этого есть специализированные библиотеки.
E>Ну и хорошо тебе значит. А мне, вот, например, round не хватает. И в С она вроде как есть, кстати.
Для точных мат. расчётов, округлений до определённого знака и т.п. есть специализированые библиотеки.
Если тебе не хватает round — значит тебе приходиться выполнять сложные вычисления, точные округления и еще бог знает какие математические действия.
Для этого, как я уже писал выше, есть специализированые библиотеки(думаю ты и сам прекрасно об этом знаешь), будь добр — используй. Стандартные библиотеки не обязаны за собой таскать все, что тебе может пригодиться.
Re[10]: округление вещественных чисел без .Net
| От: | dont.avt |
| Дата: | 09.12.08 19:02 |
| Оценка: |
Здравствуйте, Vamp, Вы писали:
V>Окргуление, кстати, не вполне тривиальная вещь. 0.5 куда округлять будем? А 1.5?
К большему естественно. Этому в школе учат.
Сложные вещи начинаються при округлении до определённого знака.
Re[11]: округление вещественных чисел без .Net
| От: | Vamp | |
| Дата: | 09.12.08 19:06 | |
| Оценка: | +1 | |
DA>К большему естественно. Этому в школе учат.
А про округление до ближайшего четного слышал что-нибудь?
Да здравствует мыло душистое и веревка пушистая.
Re[10]: округление вещественных чисел без .Net
| От: | Erop | |
| Дата: | 09.12.08 19:08 | |
| Оценка: | +1 -1 | |
Здравствуйте, dont.avt, Вы писали:
DA>Что тебе не понравилось в моём сообщении, и за что я минус получил, я так и не понял.
«минус» — это значит, что я не согласен с твоим сообщением. Я и не согласен, что округление, как в С++ — это самое оно и есть. IMHO в С++ округление сделано крайне криво
Мало того, я так понял поинт, что кто-то считал людей, пришедших с шарпа не слишком умными, только потому, что С++’ое уродство не пришло им в голову.
DA>Для этого, как я уже писал выше, есть специализированые библиотеки(думаю ты и сам прекрасно об этом знаешь), будь добр — используй. Стандартные библиотеки не обязаны за собой таскать все, что тебе может пригодиться.
Это, IMHO, не оправдывает кривизны тех решений, которые уже есть в языке.
В частности то, что в языке нет простого, вменяемого, предсказуемого и с общечеловеческой семантикой метода приведения double к int — это неправильно.
IMHO считать, что ceil( d + .5 ) — это самый естественный и простой способ предсказуемо перейти к int — это странно.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно «ради красного словца». За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: округление вещественных чисел без .Net
| От: | dont.avt |
| Дата: | 09.12.08 19:12 |
| Оценка: |
Здравствуйте, Vamp, Вы писали:
DA>>К большему естественно. Этому в школе учат.
V>А про округление до ближайшего четного слышал что-нибудь?
Нет, расскажи, если не сложно.
Re[13]: округление вещественных чисел без .Net
| От: | Vamp |
| Дата: | 09.12.08 19:15 |
| Оценка: |
Да здравствует мыло душистое и веревка пушистая.
Re[13]: округление до ближайшего четного
| От: | Erop |
| Дата: | 09.12.08 19:26 |
| Оценка: |
Здравствуйте, dont.avt, Вы писали:
DA>Здравствуйте, Vamp, Вы писали:
DA>>>К большему естественно. Этому в школе учат.
V>>А про округление до ближайшего четного слышал что-нибудь?
DA>Нет, расскажи, если не сложно.
Не совсем переносимая версия функции round выглядит как-то так:
inline int round( double n, int granularity = 1 ) < assert( granularity >0 && INT_MIN int res = (int)floor( n / granularity + 0.5 ); assert( INT_MIN / granularity return granularity * res; >
если её вызвать со вторым параметром 2, то будет оно самое
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно «ради красного словца». За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: округление вещественных чисел без .Net
| От: | dont.avt |
| Дата: | 09.12.08 19:45 |
| Оценка: |
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, dont.avt, Вы писали:
DA>>Что тебе не понравилось в моём сообщении, и за что я минус получил, я так и не понял.
E>»минус» — это значит, что я не согласен с твоим сообщением. Я и не согласен, что округление, как в С++ — это самое оно и есть. IMHO в С++ округление сделано крайне криво
Тыкни носом, где я говорил, что «округление, как в С++ — это самое оно и есть».
E>Мало того, я так понял поинт, что кто-то считал людей, пришедших с шарпа не слишком умными, только потому, что С++’ое уродство не пришло им в голову.
Нет, я считаю, что обучение программированию ни в коем случае не должно начинаться с Шарпа, Джавы или того-же С++.
Для алгоритмической подготовки хорошо подходят Схема, Паскаль и им подобные.
Для того, как работает машина — ассемблер, С.
Только после этого С++’ы, Шарпы, Джавы.
Против дотНетщиков я ничего не имею.
DA>>Для этого, как я уже писал выше, есть специализированые библиотеки(думаю ты и сам прекрасно об этом знаешь), будь добр — используй. Стандартные библиотеки не обязаны за собой таскать все, что тебе может пригодиться.
E>Это, IMHO, не оправдывает кривизны тех решений, которые уже есть в языке.
E>В частности то, что в языке нет простого, вменяемого, предсказуемого и с общечеловеческой семантикой метода приведения double к int — это неправильно.
E>IMHO считать, что ceil( d + .5 ) — это самый естественный и простой способ предсказуемо перейти к int — это странно.
Абсолютно с тобой согласен. Но я думаю, у коммитетчиков была причина так поступить.
Скорее всего они пожлопилось на одну функцию, так как ее можно легко выразить через другие.
Можно на этот вопрос посмотреть и с исторической точки зрения.
Стандарт С++ 1998 года был основан на стандарте Си от 1989 года. На сколько я понимаю, cmath в С++ — для обратной совместимости.
В 1989 году программисты не писали на таких высокоуровневых языках, как джава и шарп.
Поэтому они не особо возмущались не обнаружив round в стандарте.Плюс к этому их подготовка была выше, чем у нынешних программистов(я про основную массу говорю, поймите меня правильно), и они не видели ничего плохого в таком неинтуитивно понятном коде.
С++ наследовав математическую библиотеку от Си и имея в своем арсенале функции ceil и floor, не сочли нужным добавлять функцию round.
Вот такая вот теория.
Re[12]: округление вещественных чисел без .Net
| От: | Erop |
| Дата: | 09.12.08 19:56 |
| Оценка: |
Здравствуйте, dont.avt, Вы писали:
E>>»минус» — это значит, что я не согласен с твоим сообщением. Я и не согласен, что округление, как в С++ — это самое оно и есть. IMHO в С++ округление сделано крайне криво
DA>Тыкни носом, где я говорил, что «округление, как в С++ — это самое оно и есть».
Но я не о том говорил. Имелось ввиду, что человек настолько привык к дотнету, что без соответствующей функции не может округлить число.
Это тоже самое, что все время списывать в школе контрольные по математике у соседа за партой. Результат как бы будет, но математику знать ты не будешь.
Ну вот, IMHO, этот абзац обозначает что-то не то. И именно с ним я и не согласен.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно «ради красного словца». За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: округление вещественных чисел без .Net
| От: | dont.avt |
| Дата: | 09.12.08 20:01 |
| Оценка: |
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, dont.avt, Вы писали:
E>>>»минус» — это значит, что я не согласен с твоим сообщением. Я и не согласен, что округление, как в С++ — это самое оно и есть. IMHO в С++ округление сделано крайне криво
DA>>Тыкни носом, где я говорил, что «округление, как в С++ — это самое оно и есть».
E>
Но я не о том говорил. Имелось ввиду, что человек настолько привык к дотнету, что без соответствующей функции не может округлить число.
E>Это тоже самое, что все время списывать в школе контрольные по математике у соседа за партой. Результат как бы будет, но математику знать ты не будешь.
E>Ну вот, IMHO, этот абзац обозначает что-то не то. И именно с ним я и не согласен.
Нет, я имел ввиду не то, что ты понял.
В школе учатся не взрослые люди, а дети, которым еще предстоит чему-то научиться.
Аналогично и тут, если хочешь научиться и понять, не стоит начинать с шарпа и ему подобным.
Re: округление вещественных чисел без .Net
| От: | IID | |
| Дата: | 09.12.08 20:16 | |
| Оценка: | 6 (1) +1 | |
Здравствуйте, Ilya81, Вы писали:
I>как округлить число, сделав int из double, кроме использования .Net. Но использовать .Net я не могу, поскольку я пишу для DLL, которую надо будет вызывать из MetaTrader, и если я использую .Net, то вызов работать не будет.
Жесть! Вот понапишут «DLL для MetaTrader» шоб на биржах торговать, с таким-то бекграундом, а потом финансовые кризисы всякие наступают.
