Что самый эффективный путь состоит в том, чтобы сохранить и работать с числом с плавающей точкой с 1 000 000 значащих цифр в C?

Это довольно возможно в 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)

7
задан MusiGenesis 5 October 2009 в 23:42
поделиться

7 ответов

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

Это занимает чуть меньше 1/2 мегабайта на число. «Эффективный» может означать несколько вещей. Компактный? Эффективно по времени? Легко программировать с помощью?

Ваш вопрос помечен тегом с плавающей точкой , но я совершенно уверен, что вам совсем не нужна плавающая точка. Вся идея с плавающей запятой заключается в том, что наши данные известны только нескольким значимым цифрам, и даже известные константы физики и химии известны только несколькими или двумя цифрами. Поэтому имеет смысл сохранить разумное количество цифр, а затем просто записать показатель степени.

Но ваша задача совсем в другом. Вы должны учитывать каждый бит. Учитывая это, ни один пакет с плавающей запятой или десятичной арифметикой не будет работать, если он ' sa вы можете произвольно изменять размер, и тогда показатель степени будет бесполезен. Так что вы также можете использовать целые числа.

Что вам действительно нужно, так это строка битов. Это просто набор удобных типов. Я предлагаю и просто использовать uint32_t [125000] (или 64) для начала. На самом деле это может быть отличным использованием более непонятных констант из этого заголовка, которые выбирают размеры битов, которые являются быстрыми на данной платформе.

Чтобы быть более конкретным, нам нужно знать больше о ваших целях. Это для практики на конкретном языке? Для исследования теории чисел? Если последнее, почему бы просто не использовать язык, который уже поддерживает Bignum, например Ruby?

Тогда хранение - это чья-то проблема. Но если вы действительно хотите реализовать пакет с большим числом,

9
ответ дан 6 December 2019 в 11:50
поделиться

Я бы порекомендовал сохранить его как массив коротких целых чисел, по одному на цифру, а затем аккуратно написать служебные классы, чтобы складывать и вычитать части числа. В конечном итоге вы перейдете от этого массива int к float и обратно, но вам нужен «идеальный» способ хранения числа - поэтому используйте его точное представление. Это не самый эффективный способ с точки зрения пространства, но миллион int не очень большой.

Все дело в том, как вы используете представление. Решите, как вы собираетесь «работать» с этим числом, и напишите несколько хороших служебных функций.

3
ответ дан 6 December 2019 в 11:50
поделиться

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

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

2
ответ дан 6 December 2019 в 11:50
поделиться

Если вы не пишете это исключительно для развлечения и / или обучения, я бы рекомендовал использовать такую ​​библиотеку, как GNU Multiprecision . Посмотрите на тип данных mpf_t и связанные с ним функции для хранения чисел с плавающей запятой произвольной точности.

Если вы делаете это просто для развлечения / обучения, тогда представляйте числа как массив chars , в котором каждый элемент массива хранит одну десятичную цифру. Вам нужно будет реализовать длинное сложение, длинное умножение и т. Д.

1
ответ дан 6 December 2019 в 11:50
поделиться

Попробуйте PARI / GP , см. википедию .

1
ответ дан 6 December 2019 в 11:50
поделиться

Вы можете сохранить его десятичные цифры в виде текста в файле и преобразовать его в массив.

1
ответ дан 6 December 2019 в 11:50
поделиться

Однажды я работал над приложением, которое использовало действительно большие числа (но не требовало хорошей точности). Мы сохранили числа в виде логарифмов, поскольку вы можете хранить довольно большие числа как log10 внутри int.

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

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

1118707]

0
ответ дан 6 December 2019 в 11:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: