какой тип использовать, когда long double недостаточно?

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

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

-Пикель


person Pickel    schedule 17.07.2010    source источник
comment
На каком языке ваша реализация? Вероятно, вам нужно реализовать свой собственный тип данных для этого. И могут быть даже какие-то библиотеки поблизости.   -  person Imre L    schedule 17.07.2010
comment
C. У вас есть тот, который вы рекомендуете? я вроде нуб :D   -  person Pickel    schedule 17.07.2010


Ответы (6)


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

person Matthew Flaschen    schedule 17.07.2010
comment
Спасибо! это звучит сложно, а я нуб! Мне просто нужно это для крошечной части проекта. было бы проще просто создать свой собственный тип? - person Pickel; 17.07.2010
comment
Я имею в виду *просто создать свой собственный тип - person Pickel; 17.07.2010
comment
Возможно нет. Я бы подумал о том, чтобы сделать свой собственный только для образовательной ценности, а не для экономии времени. - person Matthew Flaschen; 17.07.2010
comment
+1 за использование существующей библиотеки. Написание собственного заняло бы много времени - это не сложно, я бы назвал это грязным. - person casablanca; 17.07.2010
comment
Я не имел в виду создание собственной библиотеки. Мне просто нужен тип и возможность их умножать и делить - person Pickel; 17.07.2010

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

BigInt

person dicroce    schedule 17.07.2010

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

person Raphael R.    schedule 17.07.2010
comment
У меня такая же проблема с long long int. Тогда я проверю BigDecimal. - person Pickel; 17.07.2010

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

Насколько велики ваши числа?

Максимальное значение по сравнению с размером long и double в .NET

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

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

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

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

person Elf King    schedule 17.07.2010
comment
это задание C. Например, для матрицы 6x6 мне нужно умножить 7*29*79*89*97*101*113*127*131*137*139*149*151. - person Pickel; 17.07.2010

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

если это число с плавающей запятой, используйте BigDecimal (только в java, .net по-прежнему не имеет плавающего числа произвольной точности

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

person Louis Rhys    schedule 17.07.2010

Если вы отказываетесь от использования библиотеки и не хотите изобретать свои собственные большие типы, почему бы вам не отслеживать дополнительные множители 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-битное целое число для двойки, и вы в безопасности до 2 ^ 2 ^ 64

person mvds    schedule 17.07.2010
comment
Думаю, я понимаю, что вы имеете в виду. быстрый вопрос, однако, если bignum больше порогового значения, он показывает отрицательное значение, поэтому mybignum> BIGNUM_THRESH = 0, верно? - person Pickel; 17.07.2010
comment
из-за того, что я имею в виду - person Pickel; 17.07.2010
comment
нет, это совершенно не важно! Типы с плавающей запятой работают как научная запись с основанием 2: как Y*2^X, 0‹Y‹1. Доступные биты распределяются между X и Y. Количество битов N для X определяет максимальное значение 2^2^N. Мое предложение было просто быстрым взломом для эмуляции этого метода, но с (гораздо) большим N. - person mvds; 18.07.2010
comment
Я придумал альтернативное решение, но ради аргумента мне нужны только простые числа, поэтому, если каждое число представляет собой целое число Y, умноженное на степень 2, они не будут простыми :( - person Pickel; 21.07.2010