modf () с БОЛЬШИМИ ЧИСЛАМИ - PullRequest
0 голосов
/ 21 марта 2012

Надеюсь, это вас хорошо устроит.

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

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

...

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

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

).

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

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

Ответы [ 2 ]

1 голос
/ 21 марта 2012

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) - это константа, которую можно предварительно рассчитать.

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

0 голосов
/ 22 марта 2012

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

modulus = a - a/b * b;

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

...