Форум сайта python.su
0
При любом икс выдает единицу
import math def f(x): s1, s2 = 0, 1 n = 0 s = 0 eps = 0.0001 while abs(s2 - s1) >= eps: s += s2 s1 = s2 s2 = ((-1)**n)*x**(2*n)/math.factorial(2*n) n += 1 return s
Отредактировано Fanago (Янв. 24, 2017 14:38:45)
Офлайн
857
Все эти задачи делаются без факториалов, потому что факториал сильно замедляет вычисления. Читай про рекуррентные соотношения.
Офлайн
568
py.user.nextА если факториал заранее посчитан для нужного диапазона?
факториал сильно замедляет вычисления.
Офлайн
857
FishHookЭтот ряд - бесконечный, но даже если ты посчитал что-то там, оно всё равно будет медленным, потому что факториальные числа много весят (больше, чем нужно для рекуррентных соотношений). Для факториальных чисел нужна длинная арифметика, а для длинной арифметики нужны свои операции со всей длинной хренью. А для рекуррентных соотношений нужно короткое число и обычные (быстрые) операции с коротким числом.
А если факториал заранее посчитан для нужного диапазона?
Отредактировано py.user.next (Янв. 24, 2017 15:06:20)
Офлайн
568
py.user.nextЕсли я заранее знаю, что аргумент факториала по заданию не превысит десяти, то демостратор будет неправ.
Короче, вот эта хрень, которую он предложил - ну, тупо в лоб факториал вычислять на каждом шаге - это обычно в универах не принимают за правильный ответ
Офлайн
76
FanagoТак Вы заведомо делаете выражение:
При любом икс выдает единицу
s2 = ((-1)**n)*x**(2*n)/math.factorial(2*n)
Отредактировано Romissevd (Янв. 24, 2017 19:01:27)
Офлайн
857
FishHookЭто нужно просто взять и конкретно замерить: рекуррентное отношение vs. кешированные факториалы.
Если я заранее знаю, что аргумент факториала по заданию не превысит десяти, то демостратор будет неправ.
1> lists:any(fun(X) -> X > 3 end, [1,2,3,4,5]).
true
2> lists:any(fun(X) -> X > 3 end, [1,2,3]).
false
3>
Отредактировано py.user.next (Янв. 25, 2017 03:45:22)
Офлайн
568
static const unsigned long SmallFactorials[] = {
1, 1, 2, 6, 24, 120, 720, 5040, 40320,
362880, 3628800, 39916800, 479001600,
#if SIZEOF_LONG >= 8
6227020800, 87178291200, 1307674368000,
20922789888000, 355687428096000, 6402373705728000,
121645100408832000, 2432902008176640000
#endif
};Офлайн
857
FishHookА где здесь 100! ? Хотя 100 это ещё маленькое число n при n -> +inf
Где здесь длинная арифметика?
>>> math.factorial(100) 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 >>>
>>> 12345 / math.factorial(100) 1.322779450690889e-154 >>> 12345 / math.factorial(1000) 0.0 >>>
Отредактировано py.user.next (Янв. 25, 2017 10:11:53)
Офлайн
568
FishHook
Если я заранее знаю, что аргумент факториала по заданию не превысит десяти
py.user.next
А где здесь 100!
Офлайн