PDA

Просмотр полной версии : Макрос для вычисления факториала на ПР 200



АРТ.Кар 64
04.08.2023, 20:12
Факториал — это произведение всех натуральных чисел от 1 до данного числа. Например, факториал числа 5 будет равен 1 × 2 × 3 × 4 × 5 = 120
Его используют во многих областях науки — например, комбинаторике, теории вероятностей и математическом анализе



Доброго времени суток и счастливых наступающих выходных дней.
Понятно ,что на ПР 200 никто не станет вычислять процент вероятности высадки человека на Марс. и всё-таки...
Может есть у кого макрос для вычисления факториала...Вроде бы не так и сложно,но...
0!=1 и 1! тоже =1
Скорее всего,что этим никто и не занимался..так ,что специально написал в "Курилке"-ибо вопрос ни к чему не обязывает.

Сема
08.09.2023, 11:13
А для какой задачи вам надо это? Просто из любопытства, Факториалы это во всяких трейд-роботах имеет смысл считать, для анализа фин. рынка.

EFrol
08.09.2023, 11:39
Чисто для демонстрации возможности языка ST?!



function fact: udint; //имя функции и тип данных выхода
var_input //объявление входных переменных
inVal : udint; //входная переменная с типом данных udint
end_var

var //объявление локальных переменных
val : udint; //локальная переменная с типом данных udint
end_var

fact := 1;

for val := 1 to inVal do
fact := fact * val;
end_for

end_function

EFrol
08.09.2023, 12:46
А до которого знака требуется рассчитать-то?

70109



function fact: udint; //имя функции и тип данных выхода
var_input //объявление входных переменных
inVal : udint;
index : udint;
end_var

var //объявление локальных переменных
val : udint;
fact1 : udint := 1;
fact2 : udint := 0;
fact3 : udint := 0;
fact4 : udint := 0;
fact5 : udint := 0;
fact6 : udint := 0;
fact7 : udint := 0;
fact8 : udint := 0;
delta : udint;
end_var

for val := 1 to inVal do
fact1 := fact1 * val;
fact2 := fact2 * val;
fact3 := fact3 * val;
fact4 := fact4 * val;
fact5 := fact5 * val;
fact6 := fact6 * val;
fact7 := fact7 * val;
fact8 := fact8 * val;

delta := fact1 / 1000000;
fact1 := fact1 - (delta * 1000000);
fact2 := fact2 + delta;

delta := fact2 / 1000000;
fact2 := fact2 - (delta * 1000000);
fact3 := fact3 + delta;

delta := fact3 / 1000000;
fact3 := fact3 - (delta * 1000000);
fact4 := fact4 + delta;

delta := fact4 / 1000000;
fact4 := fact4 - (delta * 1000000);
fact5 := fact5 + delta;

delta := fact5 / 1000000;
fact5 := fact5 - (delta * 1000000);
fact6 := fact6 + delta;

delta := fact6 / 1000000;
fact6 := fact6 - (delta * 1000000);
fact7 := fact7 + delta;

delta := fact7 / 1000000;
fact7 := fact7 - (delta * 1000000);
fact8 := fact8 + delta;

end_for

case index of
0: fact := fact1;
1: fact := fact2;
2: fact := fact3;
3: fact := fact4;
4: fact := fact5;
5: fact := fact6;
6: fact := fact7;
7: fact := fact8;
end_case

end_function

АРТ.Кар 64
08.09.2023, 13:17
https://disk.yandex.ru/d/v0FARa90p5Ay9Q

Прошу прощения. Тема действительно для меня не так и важна. Создана тема была от впечатления вычисления логарифма( которое мне любезно предоставили на форуме) А используя те "математические ФБ",которые есть в ОЛ для создания вычислений ...Хоть не очень скоро ,но удалось создать формулу Стирлинга.
Дальнейшее обсуждение прошу продолжать только в том случае ,если это обсуждение приносит вам удовольствие.

Сема
11.09.2023, 17:43
Вы что, паровой движок что ли разрабатываете?

АРТ.Кар 64
11.09.2023, 19:17
Не то и не другое...
Просто я не перестаю удивляться многообразию тех возможностей ,которые можно выполнить на программируемом реле.

Сергей0308
12.09.2023, 00:02
Сразу это на ум приходит:

https://images.rambler.ru/search?query=%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9% D1%81%D0%BA%D0%B8%D0%B5%20%D1%83%D1%87%D1%91%D0%BD %D1%8B%D0%B5%20%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D0%B B%D0%B8%20%D1%87%D1%83%D0%B4%D0%BE%D0%B4%D0%B5%D0% B9%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5 %20%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B 0%20%D0%BF%D0%B8%D0%B2%D0%B0%2C%20%D1%8D%D1%82%D0% BE%20%D0%BE%D0%BD%D0%B8%20%D0%B5%D1%89%D1%91%20%D0 %B2%D0%BE%D0%B4%D0%BA%D1%83%20%D0%BD%D0%B5%20%D0%B F%D1%80%D0%BE%D0%B1%D0%BE%D0%B2%D0%B0%D0%BB%D0%B8.&utm_source=search&utm_content=search_img&utm_medium=mixup&utm_campaign=self_promo&i=2&image_url=https%3A%2F%2Fsun9-10.userapi.com%2Fimpf%2F3Yr0qoh2NDDM20Tu4uCtCs1qae _kIi6ilrEtdQ%2Fmq61ScORczA.jpg%3Fsize%3D604x415%26 quality%3D96%26sign%3Dd5860cdc1b49df1fac4018f810f2 22cc

У меня имеется макрос очереди с возможностью её просмотра на всю глубину, в смысле, мне кажется это порядка на два(как минимум) сложнее:

https://owen.ru/forum/showthread.php?t=36452&page=3

70151

А, с факториалом всё очень печально, в смысле, мы даже количество комбинаций в популярной лотерее "5 из 36" вычислить не сможем, не хватит диапазона значений типа данных, в смысле, надо факториал 36(3,7199332678990121746799944815084e+41) разделить на факториал 31.
Хотя комбинаций как говорят, кот наплакал, всего: 45239040
На калькуляторе МК35 получалось максимум вычислить факториал 69, иначе получалось целое значение состоящее больше чем из 100 знаков, в смысле, на индикаторе не помещалось!