Типы для больших чисел

Я работаю над приложением, которое должно обрабатывать очень большие числа.

Я проверил несколько доступных классов LargeNumber и нашел несколько, которыми я доволен. У меня есть класс для больших целых чисел и для больших чисел с плавающей точкой.

Поскольку некоторые числа будут маленькими, а некоторые большими, вопрос в том, стоит ли проверять длину числа, и если оно маленькое, используйте обычный C# int или double, а если оно большое, используйте другие классы, которые у меня есть, или если я я уже использую классы Large Integer и Large Float, я должен просто придерживаться их даже для меньших чисел.

Мое соображение - чисто производительность. Сэкономлю ли я достаточно времени на математике для меньших чисел, чтобы после каждого ввода было бы целесообразно проверить каждое число?

4 ответа

Решение

Действительно трудно сказать - зависит от ваших сторонних библиотек:)

Лучше всего было бы использовать класс System.Diagnostics.StopWatch, провести миллионы различных вычислений, рассчитать их время и сравнить результаты, я думаю...

[РЕДАКТИРОВАТЬ] - О бенчмарках, я бы сделал серию бенчмарков вашего типа LargeInt, чтобы выполнить вычисления на обычных 32/64 битных числах, и серию проверок, может ли число соответствовать обычным типам Int32/Int64 (что они должны), "понижая" их до этих типов, а затем выполнить те же вычисления, используя эти типы. От вашего вопроса это звучит как то, что вы будете делать, если встроенные типы быстрее..

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

Удачи:)

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

Я бы сказал, да, чек будет более чем окупать себя, если у вас достаточно значений в пределах обычного диапазона.

Логика проста: целочисленное сложение - это одна инструкция по сборке. В сочетании со сравнением, это три или четыре инструкции. Любая программная реализация такой операции, скорее всего, будет намного медленнее.

Оптимально, эту проверку следует выполнять в самих библиотеках LargeNumber. Если они этого не делают, вам может понадобиться обертка, чтобы избежать повсеместных проверок. Но тогда вам нужно подумать и о дополнительных затратах на обертку.

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

Другие вопросы по тегам