OberonCore
https://forum.oberoncore.ru/

подскажите по вопросу с большими числами
https://forum.oberoncore.ru/viewtopic.php?f=27&t=307
Страница 1 из 1

Автор:  ___ [ Вторник, 26 Сентябрь, 2006 15:39 ]
Заголовок сообщения:  подскажите по вопросу с большими числами

создавал совсем простенький проект в VS2005 на с# (ASP.NET)
особо в них не понимаю
вообщем столкнулся с тем что нехватает длины int32 и int64
нужно больше
вот вопрос
как понимаю других числовых типов там нету
нужен бооооольшой натуральный ряд с нулем
может есть какие теории по работе с такими числами или др не шибко сложные средства как это обойти?

Автор:  Info21 [ Вторник, 26 Сентябрь, 2006 19:24 ]
Заголовок сообщения: 

Не понял.

Если нужно просто посчитать что-то, можно взять Блэкбокс, модуль Integers.

Арифметика произвольной точности много где реализована. Теория -- например, у Кнута.

Автор:  Евгений Темиргалеев [ Пятница, 29 Сентябрь, 2006 00:31 ]
Заголовок сообщения: 

Если немного уточнить, то у Кнута дана многократная точность (на массивах)... а произвольная вынесена в виде упражнения (и как все говорят, требует связного распределения, тобишь списков).

Автор:  Info21 [ Пятница, 29 Сентябрь, 2006 18:45 ]
Заголовок сообщения: 

Ох уж эти все :)))))

Массив нужной длины всегда под результат можно распределить -- как и делается, например, в модуле Integer.

В классическом Обероне, где нет открытых массивов, проще со списками.

Переложить кнутовские алгоритмы на списки -- косметика: там все проходы по "цифрам" последовательные.

Автор:  Евгений Темиргалеев [ Пятница, 29 Сентябрь, 2006 20:58 ]
Заголовок сообщения: 

Гм... хотя тема не совсем про это, раз уж разговор зашел, хочу кое-что обсудить.

Как я понимаю различие между многократной (multiple) и произвольной (arbitrary) точностью, многократная - это когда существует априори граница для максимальной длины числа (если и могут быть числа длиннее - то вероятность их появления мала). И она не так уж велика (в смысле выбранного основания системы, напр. 2^15). Произвольная - это когда предполагаемые длины неизвестны и могут часто появляться и "очень длинные" числа.

Вопрос выбора представления в виде массива или списка основывается не на том, где что проще использовать, а в эффективности использования этих представлений. (Про эффективность я пока говорю только с теоретической точки зрения; на конкретных практических задачах сравнивать эти подходы пока не доводилось.) И так, если говорить об операциях сложения и вычитания, то при использовании массивов, время пропорционально max(L(a), L(b)), а при использовании списков с перекрытием min(L(a), L(b)); L(x) - длина числа. Поэтому когда приходится, например, складывать очень длинное число с коротким, разница должна проявиться существенная.

(благодаря встроенной сборке мусора) Идея с перекрытием списков может быть реализована элементарно. При этом, если использовать подход к реализации как в Integers, заключающийся в том, что создаваемые представления чисел неизменны, вся "конструкция" оказывается законченной и безопасной.

Однако, я думаю, на практике должны попадаться задачи типа посчитать сумму или произведение ряда чисел. Здесь такой подход (неизменность) чреват дополнительными временными затратами и излишним засорением памяти. Поэтому пригодились бы такие операции как "прибавить к" или "умножить на", которые использовали бы один из аргументов в качестве приемника результата; если говорить на C++, += и *=. Ввести такие операции не сложно. Однако, теперь нужно быть увереным, что список цифр аргумента-приемника не перекрыт списками цифр других чисел (*).

И вот, собственно, тот "философский" вопрос, который я хотел обсудить: "Быть или не быть?". С одной стороны, гарантию выполнения (*) можно возложить на клиента модуля, тобишь на нас с вами - программистов, которым как человекам :) свойственно ошибаться. (Но ето не наши методы!) С другой стороны, какой подход применить, чтобы (*) можно было проверять эффективно программными средствами?

Я в свое время использовал счетчики ссылок в узлах, но это было на C++ - без сборки мусора; но с этими счетчиками про эффективное использование памяти и min(L(a), L(b)) можно забыть сразу... В общем какие будут ваши мнения, господа?

Автор:  Иван Горячев [ Суббота, 30 Сентябрь, 2006 06:02 ]
Заголовок сообщения: 

Евгений Темиргалеев писал(а):
В общем какие будут ваши мнения, господа?

Накатать интерфейс к GMP?

Автор:  Борис Рюмшин [ Суббота, 30 Сентябрь, 2006 13:16 ]
Заголовок сообщения: 

Чё я давно предлагаю сделать. :):):):):)

Автор:  Иван Горячев [ Понедельник, 02 Октябрь, 2006 01:21 ]
Заголовок сообщения: 

Я даже пытался, но упёрся в unsigned long :( Приведения типов и процедуры-обёртки тут явно не катят, ибо быстродействие, а безнаковых целых в ББ нет :(

Автор:  Vlad [ Понедельник, 02 Октябрь, 2006 08:28 ]
Заголовок сообщения: 

Евгений Темиргалеев писал(а):
С другой стороны, какой подход применить, чтобы (*) можно было проверять эффективно программными средствами?


COW? При попытке модификации элемента списка весь список копируется при количестве ссылок на него > 1. Такой подход используется в некоторых реализациях std::string. Скорее всего окажется неэффективен в случае многопоточности.

Евгений Темиргалеев писал(а):
Я в свое время использовал счетчики ссылок в узлах, но это было на C++ - без сборки мусора; но с этими счетчиками про эффективное использование памяти и min(L(a), L(b)) можно забыть сразу... В общем какие будут ваши мнения, господа?


Не очень понял, чем тебе помешали счетчики ссылок, если только ты не считал ссылки на каждый элемент.

Автор:  Евгений Темиргалеев [ Понедельник, 02 Октябрь, 2006 20:46 ]
Заголовок сообщения: 

Речь шла именно про счетчик в каждом узле, чтобы сделать перекрывающиеся списки, для которых надо копировать не весь список, а только "хвост", который отностится к нескольким спискам.

Автор:  Vlad [ Четверг, 12 Октябрь, 2006 21:35 ]
Заголовок сообщения: 

Евгений Темиргалеев писал(а):
Речь шла именно про счетчик в каждом узле, чтобы сделать перекрывающиеся списки, для которых надо копировать не весь список, а только "хвост", который отностится к нескольким спискам.


ИМХО это очень неэффективный подход.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/