![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Я вот считаю, что это в корне дурная практика.
|
|
|||||
|
Разверни мысль. Не делать проверок данных перед делением? Или не проверять результат после деления на 0. О каких алгоритмах речь?
Добавлено через 1 минуту P.S. Само по-себе деление на ноль вполне легитимная операция.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Всё это пережитки прошлого и воспоминания об ущербности древних вычислительных систем. Бесконечность - такое-же обозначение как ноль или 1. Как ещё можно обозначить бесконечность, как не x/0?
![]() Физики вон считают, что вся наша бесконечная вселенная, это один большой разделённый ноль.
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Цитата:
|
|
|||||
|
Регистрация: Feb 2012
Сообщений: 1,540
|
x/0 = 0, при x = 0 (в нуле нет ничего, даже нуля)
x/0 = +∞, при x > 0 x/0 = -∞, при x < 0 |
|
|||||
|
Цитата:
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Цитата:
Надо ли обрабатывать деление на 0 особым образом? 1 может и не надо, если при работе с получившейся бесконечностью нет неопределённостей, т.е если вы не делите почти 0 на почти 0 Например, Math.atan(бесконечность) вполне себе выдает 90 градусов, т.е. можно if-ы перед ним не лепить. Тут как с системой счисления одного из австралийских племён (у них только три числа: 1, 2, много) Где-то прокатывает, где-то нет. 2 - 1 = 1(правильно) 1 + 1 = 2(правильно) a = 1 + 2 = много b = 2 + 2 + 2 = много a + b = много(правильно) a - 2 = много(правильно) a = 1 + 2 = много a - 2 = много(а вообще-то 1 - мы похерили точность) Пример (псевдокод, не as3, atan принимает бесконечность вполне себе, просто реальные примеры из практики либо слишком громоздкие, либо не такие наглядные): Допустим у нас есть arсtg(x), arcctg(x), где x не может быть бесконечным Надо реализовать Math.atan2(y, x) Здесь мы всегда делим на то, что побольше. А если оба значения стремятся к 0 - то всё равно об угле ничего сказать нельзя (какой угол у вектора нулевой длины?) 3 сначала надо постараться избавиться от "опасных" делений вообще Если данные задачи позволяют получить результат с хорошей точностью а вы делите 0/0 - весьма вероятно, что алгоритм вы реализуете хреновый. Пример: Найти точку пересечения 2-х прямых на плоскости: Решаем систему: y = (c0 - a0 x) / b0, a1 x = c1 - b1 (c0 - a0 x) / b0; y = (c0 - a0 x) / b0, a1 x = c1 - b1 c0 / b0 + (b1 a0 / b0)x; Решение: x = (c1 - b1 c0 / b0) / (a1 - b1 a0 / b0); y = (c0 - a0 x) / b0, Может быть, я тут и не ошибся, но кто сказал, что b0 != 0 ?, кто сказал, что (a1 - b1 a0 / b0) != 0 ? Т.е. наше решение будет выдавать ерунду, когда первая линия перпендикулярна оси Oy. А между прочим, если она параллельна Oy, это не значит что у неё нет точек пересечения со второй линией. Можно, конечно, для случая abs(b0) < delta решить систему с другого конца, delta надо постараться подобрать грамотно, а может сравнить abs(b0) < abs(b1) - но что тогда делать с (a1 - b1 a0 / b0) != 0, в каких случаях его надо учитывать? В общем, это муторный подход. Задача имеет простое решение: Берём неэффективный для систем больше 2-х уравнений, но простой как палка метод Крамера и всё: a0 x + b0 y = c0, a1 x + b1 y = c1; D = a0 b1 - b0 a1; x = (c1 b1 - b0 c1) / D; y = (a0 c1 - c0 a1) / D; И чем ближе они к параллельным - тем ниже точность решения. Т.е. алгоритм стал органически соответствовать задаче, в нем нет никаких искусственных делений на 0. Последний раз редактировалось expl; 11.10.2013 в 00:04. |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 1,540
|
Цитата:
|
|
|||||
|
Цитата:
∞ * 0 = -∞ ... +∞ ∞/∞ = 0 ... ∞ Что это будет конкретно, зависит от того, что это за 0(и какой у него знак) и что это за ∞ Это потеря точности, причем полная потеря. Нужна дополнительная информация для вычисления значения, надо знать как вычислялся этот 0 и эта ∞ Простое объяснение: a = 2 + 1 - 1 - 1 Если считать одним способом: a = много - 1 - 1 - мы теперь не знаем, что это за много, а должны бы помнить, что это 2 + 1 a = много - 1 a = много Если считать другим: a = (2 + 1) - (1 + 1) a = 2 + 1 - 2 a = 2 - 1 a = 1 |
![]() |
![]() |
Часовой пояс GMT +4, время: 00:16. |
|
|
« Предыдущая тема | Следующая тема » |
|
|