Это довольно возможно в python 3 благодаря волшебству нелокальный .
def foo():
var_a = 2
var_b = 3
def _closure(x, magic = None):
nonlocal var_a
if magic is not None:
var_a = magic
return var_a + var_b + x
return _closure
localClosure = foo()
# Local closure is now "return 2 + 3 + x"
a = localClosure(1) # 2 + 3 + 1 == 6
print(a)
# DO SOME MAGIC HERE TO TURN "var_a" of the closure into 0
localClosure(0, 0)
# Local closure is now "return 0 + 3 + x"
b = localClosure(1) # 0 + 3 +1 == 4
print(b)
Это занимает чуть меньше 1/2 мегабайта на число. «Эффективный» может означать несколько вещей. Компактный? Эффективно по времени? Легко программировать с помощью?
Ваш вопрос помечен тегом с плавающей точкой , но я совершенно уверен, что вам совсем не нужна плавающая точка. Вся идея с плавающей запятой заключается в том, что наши данные известны только нескольким значимым цифрам, и даже известные константы физики и химии известны только несколькими или двумя цифрами. Поэтому имеет смысл сохранить разумное количество цифр, а затем просто записать показатель степени.
Но ваша задача совсем в другом. Вы должны учитывать каждый бит. Учитывая это, ни один пакет с плавающей запятой или десятичной арифметикой не будет работать, если он ' sa вы можете произвольно изменять размер, и тогда показатель степени будет бесполезен. Так что вы также можете использовать целые числа.
Что вам действительно нужно, так это строка битов. Это просто набор удобных типов. Я предлагаю
и просто использовать uint32_t [125000]
(или 64) для начала. На самом деле это может быть отличным использованием более непонятных констант из этого заголовка, которые выбирают размеры битов, которые являются быстрыми на данной платформе.
Чтобы быть более конкретным, нам нужно знать больше о ваших целях. Это для практики на конкретном языке? Для исследования теории чисел? Если последнее, почему бы просто не использовать язык, который уже поддерживает Bignum, например Ruby?
Тогда хранение - это чья-то проблема. Но если вы действительно хотите реализовать пакет с большим числом,
Я бы порекомендовал сохранить его как массив коротких целых чисел, по одному на цифру, а затем аккуратно написать служебные классы, чтобы складывать и вычитать части числа. В конечном итоге вы перейдете от этого массива int к float и обратно, но вам нужен «идеальный» способ хранения числа - поэтому используйте его точное представление. Это не самый эффективный способ с точки зрения пространства, но миллион int не очень большой.
Все дело в том, как вы используете представление. Решите, как вы собираетесь «работать» с этим числом, и напишите несколько хороших служебных функций.
Если вы готовы терпеть вычисление числа пи в шестнадцатеричном формате вместо десятичного, существует очень симпатичный алгоритм , который позволяет вам вычислять заданную шестнадцатеричную цифру, не зная предыдущих цифр. . Это означает, в расширении, что вам не нужно хранить (или иметь возможность выполнять вычисления) числа из миллионов цифр.
Конечно, если вы хотите получить n-ю десятичную цифру, вы потребуется знать все шестнадцатеричные цифры с точностью до этой точности, чтобы выполнить базовое преобразование, поэтому, в зависимости от ваших потребностей, это может не сэкономить вам много (если вообще что-либо) в конечном итоге.
Если вы не пишете это исключительно для развлечения и / или обучения, я бы рекомендовал использовать такую библиотеку, как GNU Multiprecision . Посмотрите на тип данных mpf_t
и связанные с ним функции для хранения чисел с плавающей запятой произвольной точности.
Если вы делаете это просто для развлечения / обучения, тогда представляйте числа как массив chars
, в котором каждый элемент массива хранит одну десятичную цифру. Вам нужно будет реализовать длинное сложение, длинное умножение и т. Д.
Вы можете сохранить его десятичные цифры в виде текста в файле и преобразовать его в массив.
Однажды я работал над приложением, которое использовало действительно большие числа (но не требовало хорошей точности). Мы сохранили числа в виде логарифмов, поскольку вы можете хранить довольно большие числа как log10 внутри int.
Подумайте об этом, прежде чем прибегать к вставке битов или некоторым сложным битовым представлениям.
Я не очень хорошо разбираюсь в сложной математике, но считаю, что есть решения, которые элегантны при хранении чисел с точностью до миллионов бит.
1118707]