2010-07-17 2 views
2

Я пишу программу, которая назначает простые числа для каждой записи матрицы, а затем мне нужно будет умножить некоторые из них. В результате число растет быстро, и я не понимаю, какой тип использовать, поскольку я получаю «обертывание» длинным двойным: SКакой тип использовать, когда длинного двойного недостаточно?

Вся помощь приветствуется.

-Pickel

+3

Что langueage ваша реализация на? Для этого вам, вероятно, потребуется реализовать свой собственный тип данных. И вокруг может быть даже несколько библиотек. –

+0

C. У вас есть тот, который вы рекомендуете? Я вроде как noob: D – Pickel

ответ

0

Вы, возможно, придется реализовать свой собственный большой целочисленный тип. Проверьте:

BigInt

0

Если это просто целые числа, есть long long int (по крайней мере, в C/C++). Если мы говорим о двойниках ... Используйте класс BigDecimal.

+0

У меня такая же проблема с long long int. Тогда я проверю BigDecimal. – Pickel

0

Предполагаете, что вы используете «длинный двойной» как тип, который является назначением на C или C++?

Насколько велики ваши цифры?

Maximum value vs. size of long and double in .NET

обсуждает некоторое родственное вещество, но может быть за рамки вашего назначения

Вообще говоря вам нужна произвольную точность библиотека:

http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic

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

+0

Это назначение C. Например, для матрицы 6х6 я должен умножить 7 * 29 * 79 * 89 * 97 * 101 * 113 * 127 * 131 * 137 * 139 * 149 * 151. – Pickel

0

, если это целое число, используйте класс BigInteger (в Java или .NET)

, если это с плавающей точкой, используйте BigDecimal (только в Java, .NET до сих пор не имеет произвольные точности с плавающей

если вы находитесь на C/C++, вам нужно создать свой собственный тип

3

Если вам не требуется реализовать собственный произвольный тип точности, используйте GMP. Вам понадобится тип mpz_t (целочисленный). Это очень хорошо документировано, и есть учебники и вопросы StackOverflow, на которые вы можете посмотреть.

+0

спасибо! это звучит сложно, и я вроде как нуб! Мне просто нужно это для крошечной части проекта.было бы проще, просто создать свой собственный тип? – Pickel

+0

Я имею в виду * просто создать свой собственный тип – Pickel

+0

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

0

Если вы отказываетесь от использования библиотеки и не хотите изобретать свои собственные большие типы, почему бы вам не отслеживать дополнительные факторы в 2 или что-то в этом роде.

while (mybignum > BIGNUM_THRESH) 
{ 
    twos++; 
    mybignum /= 2; // use >>=1 if you use an integer type (you said you used double so therefore the /=) 
} 

затем распечатать ваши ответы, как mybignum * 2**twos

Возьмите 64 битный Int для двоек и вы в безопасности до 2^2^64

+0

Я думаю, что понимаю, что вы имеете в виду. быстрый вопрос, хотя, если bignum больше порога, он показывает отрицательный, поэтому mybignum> BIGNUM_THRESH = 0, правильно? – Pickel

+0

из-за этого «обертывание» вещь я имею в виду – Pickel

+0

нет, это совсем не так! типы с плавающей точкой работают как научная нотация, с базой 2: как Y * 2^X, 0 mvds