Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flasher.ru > Флейм

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.10.2013, 12:24
dark256 вне форума Посмотреть профиль Отправить личное сообщение для dark256 Посетить домашнюю страницу dark256 Найти все сообщения от dark256
  № 1  
Ответить с цитированием
dark256
 
Аватар для dark256

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
По умолчанию Допустимо ли допускать в своих алгоритмах деление на ноль?

Я вот считаю, что это в корне дурная практика.
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2

Старый 10.10.2013, 12:37
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 2  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Разверни мысль. Не делать проверок данных перед делением? Или не проверять результат после деления на 0. О каких алгоритмах речь?

Добавлено через 1 минуту
P.S. Само по-себе деление на ноль вполне легитимная операция.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 10.10.2013, 13:06
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 3  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Всё это пережитки прошлого и воспоминания об ущербности древних вычислительных систем. Бесконечность - такое-же обозначение как ноль или 1. Как ещё можно обозначить бесконечность, как не x/0?

Физики вон считают, что вся наша бесконечная вселенная, это один большой разделённый ноль.
__________________
Дети не должны знать о своих родителях

Старый 10.10.2013, 14:26
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
На какое число можно умножить ноль, чтобы получить это же число?
В чем смысл этой темы?

Старый 10.10.2013, 17:25
FlashRus вне форума Посмотреть профиль Отправить личное сообщение для FlashRus Найти все сообщения от FlashRus
  № 5  
Ответить с цитированием
FlashRus
 
Аватар для FlashRus

Регистрация: Nov 2006
Адрес: СПб
Сообщений: 921
Отправить сообщение для FlashRus с помощью ICQ Отправить сообщение для FlashRus с помощью Skype™
Цитата:
На какое число можно умножить ноль, чтобы получить это же число?
На нуль?

Старый 10.10.2013, 18:01
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 6  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
x/0 = 0, при x = 0 (в нуле нет ничего, даже нуля)
x/0 = +∞, при x > 0
x/0 = -∞, при x < 0

Старый 10.10.2013, 18:22
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 7  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Цитата:
x/0 = 0, при x = 0 (в нуле нет ничего, даже нуля)
Нет, это неопределенность. Такие дела.

Старый 10.10.2013, 23:46
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Всё это пережитки прошлого и воспоминания об ущербности древних вычислительных систем. Бесконечность - такое-же обозначение как ноль или 1. Как ещё можно обозначить бесконечность, как не x/0?

Физики вон считают, что вся наша бесконечная вселенная, это один большой разделённый ноль.
Угу, только почему-то, когда в коде встречается деление очень малого на очень малое или умножение очень большого на очень малое - погрешность вычислений сразу улетает за 1000%

Надо ли обрабатывать деление на 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 - мы похерили точность)
2 надо особым образом обрабатывать не точно деление на 0, а близкие случаи, когда уже начинает сказываться ограниченное количество значащих цифр.

Пример (псевдокод, не as3, atan принимает бесконечность вполне себе, просто реальные примеры из практики либо слишком громоздкие, либо не такие наглядные):
Допустим у нас есть arсtg(x), arcctg(x), где x не может быть бесконечным
Надо реализовать Math.atan2(y, x)
Код:
atan2(y, x) = abs(x) > abs(y) ? arctg(y / x) : arcctg(x / y)
Здесь мы всегда делим на то, что побольше. А если оба значения стремятся к 0 - то всё равно об угле ничего сказать нельзя (какой угол у вектора нулевой длины?)

3 сначала надо постараться избавиться от "опасных" делений вообще
Если данные задачи позволяют получить результат с хорошей точностью а вы делите 0/0 - весьма вероятно, что алгоритм вы реализуете хреновый.

Пример: Найти точку пересечения 2-х прямых на плоскости:
Код:
a0 x + b0 y = c0,
a1 x + b1 y = c1;
Решаем систему:
Код:
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;
Говорите D может быть равным 0? D стремится к 0, когда прямые стремятся стать параллельными, т.е. не когда какая-то прямая заняла какое-то не то положение, а когда по своей природе задачи решения нет.
И чем ближе они к параллельным - тем ниже точность решения. Т.е. алгоритм стал органически соответствовать задаче, в нем нет никаких искусственных делений на 0.


Последний раз редактировалось expl; 11.10.2013 в 00:04.
Старый 11.10.2013, 00:10
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 9  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
Цитата:
Нет, это неопределенность.
А разве в "ничего" может быть что-то? Т.е. ноль?

Старый 11.10.2013, 00:19
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
А разве в "ничего" может быть что-то? Т.е. ноль?
0 / 0 = -∞ ... +∞
∞ * 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.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 00:16.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.