Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2010, 19:35   #31
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Иными словами, если я неверно составлю программу, возможны ситуации когда деление на нуль будет возникать не всегда.
Это уже повод для более детальной отладки.
MaTBeu вне форума Ответить с цитированием
Старый 17.12.2010, 21:40   #32
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Я бы вызывал исключение и если оно не обрабатывается возвращал бы 0xFFFF
А, сори, не увидел что юзаются динамические типы, тогда я бы брал порядок максимального порядка в выражении.

Последний раз редактировалось Levsha100; 17.12.2010 в 22:02.
Levsha100 вне форума Ответить с цитированием
Старый 18.12.2010, 10:38   #33
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Надо было опорс прикрутить....
Ну тогда ясно, я сделаю оба варианта. Исходник выложу здесь, как добавлю вторую операцию деления....

ЗЫ. По теме длинной арифметики готовится статья в журнал...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 19.12.2010, 06:52   #34
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Сори, не мог ответить чуть раньше.

Я бы это через исключения делал. Причина проста. Если пользователь допустил ошибку, и произошло деление на 0, то его об этом нужно известить. Задача самого пользователя выяснить, при каких исходных данных это произошло.

А если уж и возвращать какой-то результат, то уж точно не огромный массив забитый 9-ми (A = 0/0 = ?). Добавь еще одно поле. Туда сохраняй OK, NaN, +INF или -INF. Вот только что потом делать с этими "не числами". Например:
A = 3 / 0 = +INF
B = -4 / 0 = -INF
C = A + B = ?

Добавлено -------------------------------------------------------
Отсебятина:
Вообще, по большому счету, результат любого деления на ноль действительно не является числом. Лично я интерпритирую его для себя как "одновременно любое из множества". А следовалельно, простые арифметические выражение к ниму не применимы. Это всеравно как (-1)^0.5 = i. i - это не число, в привычном понимании. i - это больше вектор, чем число.
Так что, если реализуешь чисто арифметический механизм, то исключение, исключение и только исключение.

Последний раз редактировалось Sibedir; 19.12.2010 в 07:44.
Sibedir вне форума Ответить с цитированием
Старый 20.12.2010, 15:29   #35
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Как и просили выкладываю исходники. Решение - две операции деления - одна вызывает исключение, вторая разрешает делить на нуль ... Компромисс максимально возможного числа это 20000 разрядов (для результата от деления на нуль), больше не стал нагружать...
ЗЫ. модуль BigNum.pas...
Вложения
Тип файла: rar Длинные числа.rar (197.6 Кб, 12 просмотров)
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 20.12.2010 в 15:32.
Utkin вне форума Ответить с цитированием
Старый 20.12.2010, 16:32   #36
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Компромисс максимально возможного числа это 20000 разрядов (для результата от деления на нуль), больше не стал нагружать...
А чё не ввел дополнительное поле?
Это съэкономило бы память и производительность. Представь. У тебя 1000 чисел. Даже если это поле используется лишь в одном числе, а в остальных лежит мертвым грузом - экономия ~19КБ. А если пользователь по ошибке допустил создание массива из 1000 чисел делением на нуль, памяти сожрется 20МБ. А еще проверка на бесконечность, да и просто создать такое число весьма затратно по времени.

Ведь если это на статью, точно будет камень в твой огород. И, самое плохое, что от новичков.

Последний раз редактировалось Sibedir; 20.12.2010 в 16:41.
Sibedir вне форума Ответить с цитированием
Старый 20.12.2010, 16:35   #37
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

введи чтото типа
Код:
enum ValueType
{
    vtValue,//нормально значение
    vtNaN,//плохое значение:)
    vtInfinity//бесконечность
};
да и исключение всетаки лучше.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.12.2010, 16:57   #38
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Utkin, необессудь, сразу еще пару замечаний.
Убери код типа
Код:
function Func (A: TType): Boolean;
...

if Func (a) = True then
прям сразу глаз режет. Особенно правый, он у меня к монитору ближе.

И еще. Не могу понять, как работать с
Цитата:
// quan - количество разрядов после запятой
Стоит 20 в результате только 11.
Вот так делаю
Код:
    GetBigNum('1', y);
    GetBigNum('3', x);
    DivBigNumR(y, x, 20, f);
Получаю: +0.33333333333
Объясни на пальцах, вот эту часть
Код:
    // Делится нацело?
    Count:=GetCountC(R);
    If Count<1 then Exit;

    // Сколько раз надо делить
    Count:=Quan div Count +1;

Последний раз редактировалось Sibedir; 20.12.2010 в 17:01.
Sibedir вне форума Ответить с цитированием
Старый 21.12.2010, 06:43   #39
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну код-то еще не сильно оттестирован, поэтому поводу была тема (ссылка в первом посте), но я над этим работаю ...

Цитата:
А чё не ввел дополнительное поле?
Всем не угодишь. Конкретное значение можно использовать в вычислениях дальше (пусть и не совсем правильно, но делить на нуль вообще само по себе не есть хорошо), а для бесконечности придется делать еще лишние телодвижения...

Цитата:
Убери код типа
А чего в этом коде не так ?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 21.12.2010, 06:45   #40
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Удалено пользователем

Последний раз редактировалось Sibedir; 21.12.2010 в 06:51.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Деление на нуль при запуске Pababop Паскаль, Turbo Pascal, PascalABC.NET 0 12.12.2010 16:43
убрать null (нуль) символы в строке Kib Общие вопросы Delphi 7 25.06.2010 14:22
как поставить ограничение на число нуль а не на символ нуль??? Dr.Swat Помощь студентам 0 12.06.2010 20:35
Делить без остатка rangel PHP 4 30.07.2009 14:31
На 0 делить! abdumanon Microsoft Office Excel 6 07.04.2009 13:18