необходимо посчитать некоторую функцию. результат не помещается в long double ((( В результате получаю:
Time W 1.#INFE+000
Time R -1.#INDE+000
Вот такие не красивые значения (
Вопрос:
1. Как быть? :)
GMP: http://gmplib.org/
>необходимо посчитать некоторую функцию. результат не помещается в long double ((( В
>результате получаю:
> Time W 1.#INFE+000
> Time R -1.#INDE+000
>Вот такие не красивые значения (
>Вопрос:
>1. Как быть? :)Вообще похоже не столько на переполнение, сколько на вычисления какой-то функции над "некорректными" аргументами (такими, что на выходе бесконечность).
Менять алгоритм вычислений, что же еще. Например на советских программируемых калькуляторах встроенная функция факториала после 61! была бесполезной, выходили за предел гугола, однако толково написаная программа позволяла вычислять факториалы в районе нескольких тысяч. В общем-то школьной математики должно хватать на большинство подобных преобразований.
>необходимо посчитать некоторую функцию. результат не помещается в long double ((( В
>результате получаю:
> Time W 1.#INFE+000
> Time R -1.#INDE+000
>Вот такие не красивые значения (
>Вопрос:
>1. Как быть? :)Если результат не помещается в long double используй массив unsigned long так можно вычислить значение любой точности и любой величины.
> Если результат не помещается в 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 не жестоко ли? :)
>[оверквотинг удален]
>>
>
>Я не думаю что какой либо из стандартных типов способен вместить нужные
>мне значения... чтобы не тыкать пальцем в небо приведу одну из
>функций:
>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
>[оверквотинг удален]
>>
>
>Я не думаю что какой либо из стандартных типов способен вместить нужные
>мне значения... чтобы не тыкать пальцем в небо приведу одну из
>функций:
>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 байт(это если один порядок кодируется одним байтом (в десятичной системе исчесления)),а оптимизировать то и того меньше (в шестнадцетиричной).
>необходимо посчитать некоторую функцию. результат не помещается в long double ((( В
>результате получаю:
> Time W 1.#INFE+000
> Time R -1.#INDE+000
>Вот такие не красивые значения (
>Вопрос:
>1. Как быть? :)int64 никто не отменял для unix
и LARGE_INTEGER под виндойа насчет токо что вывели скорее всего неправильно чтото посчитано и некорректно сработал printf или чем вы его там выводили
>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);
Мсье знает толк в извращениях. Вы бы еще для ассемблера предложили подобный способ
>Мсье знает толк в извращениях.а чем плох метод ? задача уже решена в избыточном виде, осталось только использовать соотв. инструменты. не в ботлнэке это (имхо) самый простой подход; зачем писать то, что уже написано ?
Не спорю что гвозди можно забивать микроскопом, колбасу нарезать микротомом, а из пушки палить по воробьям. Вот только лично для мне это кажется извращением. Делать на С/С++ вызов кучи внешних программ вместо простейшей операции из нескольких арифметических команд - это надо быть либо дегенератом, либо извращенцем. На всякий случай замечу что аналогичные действия на баше извращением не являются, там это норма, но вот уже на perl/python/etc это уже под большим вопросом.