|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
18.03.2013, 16:37 | #11 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Спасибо, правда в 12 номере статья не поместилась и пришлось искать следующий.
А пока он качается, замечание к уже прочитанному: Цитата:
Почему неверном? Давайте посчитаем сами (в данном случае строка - просто массив байтов, причем, заданный указателем на него): Вариант А. Добавляем байт в конец массива длиной N: 1. Выделяем массив длиной N+1, используя временный указатель. 2. Копируем N байтов из старого массива в новый. 3. Дописываем на N+1 место добавляемый байт. 4. Освобождаем память старого массива. 5. Переписываем в старый указатель значение временного указателя. Вариант Б. Добавляем байт в начало массива длиной N: 1. Выделяем массив длиной N+1, используя временный указатель. 2. Копируем N байтов из старого массива в новый со смещением на 1 в сторону конца (т.е. [i] -> [i+1]). 3. Дописываем на 1 место добавляемый байт. 4. Освобождаем память старого массива. 5. Переписываем в старый указатель значение временного указателя. Как видим, не только по сложности, но и по количеству операций эти действия полностью эквивалентны. А иллюзия автора основана, видимо, на убеждении, что процедура SetLength имеет сложность O(1), тогда как ее реализация полностью включает шаги 1, 2, 4, 5 Варианта А. К слову сказать, в процессе реализации автор не мог обойти случай, когда, скажем, нужно удалить байт слева, а левая последовательность уже пуста, и тогда приходится удалять байт из начала правой последовательности. Реализация посредством двух массивов оказывается громоздкой и неэффективной. Ладно, загрузился 13 номер - пошел читать продолжение... |
|
18.03.2013, 18:20 | #12 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Если Вы желаете самовыразиться, или же действительно улучшить код - просто создайте нвую тему. Не надо засирать данную
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
18.03.2013, 18:35 | #13 | ||||
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Любопытный момент:
Цитата:
Для записи чисел с фиксированной точкой хранятся только цифры самогочисла, Для записи чисел с плавающей точкой хранятся как цифры самого числа (мантисса), так и цифры, описывающие положение точки (порядок). Автором используются числа, содержащие запись порядка, т.е. по сути - числа с плавающей точкой. Только в общем случае ненормализованные. Цитата:
Только не учитывается тот факт, что операция "гашения" незначащих разрядов выполняется существенно дольше операции сравнения. Цитата:
Автор на протяженни половины страницы сетует на проблемы, возникающие при поиске очередной цифры при делени в столбик, заявляя даже: Цитата:
Но в целом хочу отметить: - любопытен сам подход, - интересная статья (с удовольствием прочитал), - несмотря на некоторые (в том числе и серьезные) недостатки - это неплохая основа для создания вариантов арифметики длинных чисел, - в частности, можно заменить реализацию байтовых последовательностей своими, вроде, на работоспособность основного модуля длинной арифметики это повлиять не должно. |
||||
18.03.2013, 18:37 | #14 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
|
18.03.2013, 18:42 | #15 |
Пользователь
Регистрация: 19.09.2010
Сообщений: 10
|
Доброго времени суток ув. Уткин, нашел пару жучков в вашем коде
Первый, при делении нуля на число, программа зависает Код:
Код:
Просто лучше вашего модуля, я пока что ничего не находил в интернете. Очень уж хочется протестировать его "в полевых условиях". Последний раз редактировалось glabz; 18.03.2013 в 19:04. |
18.03.2013, 18:56 | #16 |
Пользователь
Регистрация: 19.09.2010
Сообщений: 10
|
@s-andriano
Вот в принципе есть, еще один модуль, Реализован на динамических строках, если Вам интересно. http://delphiworld.narod.ru/base/big_numbers.html В нем тоже есть пару жучко, припустим 1,0001 - 2,0054 выдаст, как ответ -1, и при сложении чисел с разной мантиссой, тоже возникает не точность. В остальном, все довольно таки нормально работает. К сожжению, автор данного кода погиб в авто катастрофе несколько лет назад.. Я просто первый рас стыкаюсь с подобной задачей, и пока что не очень в ней ориентируюсь, поэтому прошу простить меня, за возможные глупости с моей стороны. |
18.03.2013, 19:04 | #17 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Беглый анализ указывает на функцию Increasing...
ЗЫ. Я давно не занимаюсь Дельфи, поэтому мне требуется время чтобы найти ошибки.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
18.03.2013, 19:09 | #18 |
Пользователь
Регистрация: 19.09.2010
Сообщений: 10
|
Я Вас понимаю, спасибо большое за ответ.
Вы сможете, если что залатать дырку, или направить в нужное русло?. |
18.03.2013, 19:25 | #19 | ||||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Если поступать по мелкософтовски - навскидку можно поставить заплатку на
Код:
Код:
Код:
Цитата:
Цитата:
Учитывая что это не ООП, то в данную структуру можно напихать любую последовательность цифр, и количество нулей там ограничено фантазией. Цитата:
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Utkin; 18.03.2013 в 19:42. |
||||
18.03.2013, 20:19 | #20 | ||||
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Цитата:
Тогда напоминаю написанную Вами реализацию: Код:
Цитата:
Именно эту величину в записи дробного числа и принято называть порядком. Цитата:
Ваше представление является разновидностью (возможно, расширением) представления с плавающей точкой. В то время как Вы сами неправомерно называете это представлением с фиксированной точкой. У представления с фиксированной точкой не может быть поля для указания порядка (по-вашему - позиции разделителя), а у Вас есть. Можете Вы от него безболезненно отказаться? Нет. Значит, с плавающей точкой. И отсутствие нормализации совершенно не указывает на то, что это якобы какой-то совершенно особый объект. Цитата:
2. Переходить на личности - mauvais ton. В статье наводить порядок уже поздно. В коде - никогда не поздно. Включая перепроектирование. Благо, код изначально для этого приспособлен, что есть его несомненное достоинство. А после этого, возможно, написать новую статью. PS. Напрасно Вы на меня взъелись. И подход интересный. И код очень грамотно разделен на две части. Скажу честно, специально реализацию длинной арифметики я не искал, но за не одно десятилетие работы всякое попадалось. Могу сказать, из всего, что я видел - у Вас лучший вариант. |
||||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Длинная арифметика | Свитозар | Помощь студентам | 0 | 26.09.2012 19:07 |
[C++] Деление произвольных двоичных чисел с фиксированной точкой с использованием прямых кодов | Java | Помощь студентам | 0 | 04.06.2011 17:22 |
Длинная арифметика. | Steam.dll | Помощь студентам | 8 | 03.04.2011 17:47 |
Длинная арифметика | Khelleos | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 2 | 20.12.2010 09:08 |
Длинная арифметика чисел с плавающей точкой | RIO | Общие вопросы C/C++ | 3 | 14.04.2010 17:11 |