URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7285
[ Назад ]

Исходное сообщение
"Большие числа ((("

Отправлено Ivanoff , 03-Апр-08 09:44 
необходимо посчитать некоторую функцию. результат не помещается в long double ((( В результате получаю:
Time W 1.#INFE+000
Time R -1.#INDE+000
Вот такие не красивые значения (
Вопрос:
1. Как быть? :)

Содержание

Сообщения в этом обсуждении
"Большие числа ((("
Отправлено anonymous , 03-Апр-08 18:54 
GMP: http://gmplib.org/

"Большие числа ((("
Отправлено DeadMustdie , 03-Апр-08 21:14 
>необходимо посчитать некоторую функцию. результат не помещается в long double ((( В
>результате получаю:
> Time W 1.#INFE+000
> Time R -1.#INDE+000
>Вот такие не красивые значения (
>Вопрос:
>1. Как быть? :)

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


"Большие числа ((("
Отправлено angra , 04-Апр-08 06:47 
Менять алгоритм вычислений, что же еще. Например на советских программируемых калькуляторах встроенная функция факториала после 61! была бесполезной, выходили за предел гугола, однако толково написаная программа позволяла вычислять факториалы в районе нескольких тысяч. В общем-то школьной математики должно хватать на большинство подобных преобразований.


"Большие числа ((("
Отправлено f00l , 04-Апр-08 07:13 
>необходимо посчитать некоторую функцию. результат не помещается в long double ((( В
>результате получаю:
> Time W 1.#INFE+000
> Time R -1.#INDE+000
>Вот такие не красивые значения (
>Вопрос:
>1. Как быть? :)

Если результат не помещается в long double  используй массив unsigned long так можно вычислить значение любой точности и любой величины.
  


"Большие числа ((("
Отправлено Ivanoff , 07-Май-08 07:22 
> Если результат не помещается в long double  используй массив unsigned
>long так можно вычислить значение любой точности и любой величины.
>

Я не думаю что какой либо из стандартных типов способен вместить нужные мне значения... чтобы не тыкать пальцем в небо приведу одну из функций:
p(j)=( (a/b)^j * 1/j! )/ (SUM[l=0,N](a/b)^l * 1/l!) где:
j:=9000 - 10000 SUM[l=0,N] - сумма от 0 до N N достигает 10000. a/b - константа = 1000.
В итоге при самом безобином значении j необходимо посчитать 1000^9000 не жестоко ли? :)



"Большие числа ((("
Отправлено Pikador , 07-Май-08 10:19 
>[оверквотинг удален]
>>
>
>Я не думаю что какой либо из стандартных типов способен вместить нужные
>мне значения... чтобы не тыкать пальцем в небо приведу одну из
>функций:
>p(j)=( (a/b)^j * 1/j! )/ (SUM[l=0,N](a/b)^l * 1/l!) где:
>j:=9000 - 10000 SUM[l=0,N] - сумма от 0 до N N достигает
>10000. a/b - константа = 1000.
>В итоге при самом безобином значении j необходимо посчитать 1000^9000 не жестоко
>ли? :)

Для питона нет:

$ cat tmp.py
#!/usr/local/bin/python
# -*- coding: cp1251 -

print 1000L**9000


"Большие числа ((("
Отправлено f00l , 07-Май-08 17:09 
>[оверквотинг удален]
>>
>
>Я не думаю что какой либо из стандартных типов способен вместить нужные
>мне значения... чтобы не тыкать пальцем в небо приведу одну из
>функций:
>p(j)=( (a/b)^j * 1/j! )/ (SUM[l=0,N](a/b)^l * 1/l!) где:
>j:=9000 - 10000 SUM[l=0,N] - сумма от 0 до N N достигает
>10000. a/b - константа = 1000.
>В итоге при самом безобином значении j необходимо посчитать 1000^9000 не жестоко
>ли? :)

Любое число можно разместить в массиве (пока хватит памяти).
Твое число 1000^9000 умещается всего в массив размером 27000 байт(это если один порядок кодируется одним байтом (в десятичной системе исчесления)),а оптимизировать то и того меньше (в шестнадцетиричной).

  


"Большие числа ((("
Отправлено ben , 07-Май-08 14:45 
>необходимо посчитать некоторую функцию. результат не помещается в long double ((( В
>результате получаю:
> Time W 1.#INFE+000
> Time R -1.#INDE+000
>Вот такие не красивые значения (
>Вопрос:
>1. Как быть? :)

int64 никто не отменял для unix
и LARGE_INTEGER под виндой

а насчет токо что вывели скорее всего неправильно чтото посчитано и некорректно сработал printf или чем вы его там выводили



"Большие числа ((("
Отправлено аноним , 17-Май-08 04:13 
>1. Как быть? :)

можно еще так (проверки удалены)

char str[BIG_ENOUGH];
FILE *f;
system("sh -c \"echo '1000^9000' > /tmp/formula\"");
f = popen("sh -c \"cat /tmp/formula | env BC_LINE_LENGTH=1000000 bc\"", "r");
fgets(str, str_size, f);


"Большие числа ((("
Отправлено angra , 17-Май-08 04:41 
Мсье знает толк в извращениях. Вы бы еще для ассемблера предложили подобный способ


"Большие числа ((("
Отправлено аноним , 17-Май-08 15:51 
>Мсье знает толк в извращениях.

а чем плох метод ? задача уже решена в избыточном виде, осталось только использовать соотв. инструменты. не в ботлнэке это (имхо) самый простой подход; зачем писать то, что уже написано ?


"Большие числа ((("
Отправлено angra , 19-Май-08 02:14 
Не спорю что гвозди можно забивать микроскопом, колбасу нарезать микротомом, а из пушки палить по воробьям. Вот только лично для мне это кажется извращением. Делать на С/С++  вызов кучи внешних программ вместо простейшей операции из нескольких арифметических  команд - это надо быть либо дегенератом, либо извращенцем. На всякий случай замечу что аналогичные действия на баше извращением не являются, там это норма, но вот уже на perl/python/etc это уже под большим вопросом.