modf() с БОЛЬШИМИ ЧИСЛАМИ

Надеюсь, у Вас все хорошо.

Я пытаюсь преобразовать индекс (число) для слова, используя для этого код ASCII. например:

index 0  -> " "
index 94  -> "~"
index 625798  -> "e@A"
index 899380  -> "!$^."

...

Как мы все видим, 4-й индекс соответствует строке из 4 символов. К сожалению, в какой-то момент эти комбинации становятся очень большими (например, для слова из 8 символов мне нужно выполнять операции с 16-значными числами (например: 6634204312890625), и становится действительно хуже, если я увеличиваю количество символов в слове. слово).

Чтобы поддерживать такие большие числа, мне пришлось обновить некоторые переменные моей программы с unsigned int на unsigned long long, но потом я понял, что modf() из C++ использует двойные числа и uint32_t (http://www.raspberryginger.com/jbailey/ minix/html/modf_8c-source.html).

Вопрос в следующем: возможно ли адаптировать modf() для использования 64-битных чисел, таких как unsigned long long? Боюсь, что в случае, если это невозможно, я ограничусь цифрами двойной длины.

Может ли кто-нибудь просветить меня, пожалуйста? знак равно


person Francisco Xavier    schedule 21.03.2012    source источник
comment
Вы можете найти gmplib.org полезным   -  person LucasB    schedule 21.03.2012
comment
для БОЛЬШИХ ЧИСЕЛ вам нужны БОЛЬШИЕ ФУНКЦИИ.   -  person ApprenticeHacker    schedule 21.03.2012
comment
Я не понимаю, почему вы используете оператор по модулю для переменных с плавающей запятой modf вместо целочисленного по модулю %. Как именно вы делаете маппинг и зачем он вам нужен? Могут быть более простые способы...   -  person jofel    schedule 21.03.2012


Ответы (2)


16-значные числа соответствуют диапазону 64-битных чисел, поэтому следует использовать uint64_t (от <stdint.h>). Затем оператор % должен сделать то, что вам нужно.

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

mod(a * b) == mod(mod(a) * mod(b))
mod(a + b) == mod(mod(a) + mod(b))

В качестве примера представим 16-значное десятичное число x следующим образом:

x = x_hi * 1e8 + x_lo;  // this is pseudocode, not real C

где x_hi — 8 старших десятичных цифр, а x_lo — младшая. Тогда модуль x может быть выражен как:

mod(x) = mod((mod(x_hi) * mod(1e8) + mod(x_lo));

где mod(1e8) — константа, которую можно предварительно вычислить.

Все это можно сделать в целочисленной арифметике.

person Oliver Charlesworth    schedule 21.03.2012
comment
На самом деле я мог бы использовать комментарий, который был удален сразу после этого (интересно, почему), в котором говорилось: - person Francisco Xavier; 22.03.2012

На самом деле я мог бы использовать комментарий, который был удален сразу после этого (интересно, почему), в котором говорилось:

modulus = a - a/b * b;

Я сделал приведение в делении к unsigned long long. Теперь... Я был немного разочарован, потому что в своей задаче я думал, что смогу без проблем продолжать увеличивать количество символов в слове. Тем не менее, у меня начались проблемы с размером при n.º символов = 7. Почему? 95^7 начинает давать огромные числа. Я надеялся получить возможность написать слово типа «мой кот такой толстый, я 1234r5s» и вычислить его индекс, но в этом слове почти 30 символов: 95^26 = 2635200944657423647039506726457895338535308837890625 комбинаций. В любом случае, спасибо за ответ.

person Francisco Xavier    schedule 22.03.2012