1

Тема: Erlang запитання - відповіді -- обговорення

тема для обговорення теми http://replace.org.ua/post/79625/ з прикладами по Erlang --
все обговорення - сюди

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.

2

Re: Erlang запитання - відповіді -- обговорення

Ну якщо вже порівнювати ефективність алгоритмів для чисел Фібоначчі, то варто розглянути і інші, більш ефективні алгоритми, зокрема формулу, яка має виконуватися приблизно за час O(1).
http://mathworld.wolfram.com/images/equations/FibonacciNumber/NumberedEquation6.gif
Мені цікаво як в Erlang буде виглядати код для такої формули.

Подякували: 221VOLT1

3

Re: Erlang запитання - відповіді -- обговорення

leofun01 написав:

Ну якщо вже порівнювати ефективність алгоритмів для чисел Фібоначчі, то варто розглянути і інші, більш ефективні алгоритми, зокрема формулу, яка має виконуватися приблизно за час O(1).
http://mathworld.wolfram.com/images/equations/FibonacciNumber/NumberedEquation6.gif
Мені цікаво як в Erlang буде виглядати код для такої формули.

дякую за цікаве-слушне зауваження -
немає границь для вдосконалення)

як я зрозумів із того що уже потицяв на практиці - у ерлангу код для однієї і тієї ж формули може виглядати по-різному (тобто бути написаний різними шляхами), відповідно і працювати по-різному :)

вранці/в обід порівняю

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: leofun011

4

Re: Erlang запитання - відповіді -- обговорення

стосовно формули - upd http://replace.org.ua/post/79629/#p79629

Прихований текст
порівняу, корисної різниці (по часу) не виявив, лише шкідливу (похидки обчислення через float)

все-одно дякую)) погрався з float))

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: leofun011

5

Re: Erlang запитання - відповіді -- обговорення

знайшов таку функцію

%% max(N)
%% Create N processes then destroy them
%% See how much time this takes
max(N) ->
    Max = erlang:system_info(process_limit),
    io:format("*Maximum allowed processes:~p~n*" ,[Max]),
    statistics(runtime),
    statistics(wall_clock),
    L = for(1, N, fun() -> spawn(fun() -> wait() end) end),
    {_, Time1} = statistics(runtime),
    {_, Time2} = statistics(wall_clock),
    lists:foreach(fun(Pid) -> Pid ! die end, L),
    U1 = Time1 * 1000 / N,
    U2 = Time2 * 1000 / N,
    io:format("*Process spawn time=~p (~p) microseconds~n*", [U1, U2]).

wait() ->
    receive
        die -> void
    end.

for(N, N, F) -> [F()];
for(I, N, F) -> [F()|for(I+1, N, F)].

потикав-подивився як воно працює

2> ex:max(5).
*Maximum allowed processes:262144
**Process spawn time=0.0 (0.0) microseconds
*ok
3> ex:max(555).
*Maximum allowed processes:262144
**Process spawn time=0.0 (0.0) microseconds
*ok
4> ex:max(5555).
*Maximum allowed processes:262144
**Process spawn time=2.8802880288028803 (14.041404140414041) microseconds
*ok
5> ex:max(55555).
*Maximum allowed processes:262144
**Process spawn time=7.020070200702007 (8.136081360813607) microseconds
*ok
6> ex:max(5555). 
*Maximum allowed processes:262144
**Process spawn time=8.28082808280828 (8.46084608460846) microseconds
*ok
7> ex:max(555). 
*Maximum allowed processes:262144
**Process spawn time=0.0 (0.0) microseconds
*ok
8> ex:max(10000).
*Maximum allowed processes:262144
**Process spawn time=6.3 (6.3) microseconds
*ok
9> ex:max(100000).
*Maximum allowed processes:262144
**Process spawn time=4.53 (4.52) microseconds
*ok

задумався як воно працює -- виглядає так, наче спочатку "прогрівається"

цікаво - це результат того що ерланг зараз на вінді тицяю, чи й на лінуксі так же буде -- тобто це особливість ос чи віртуальної машини ерланга?

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: leofun011

6 Востаннє редагувалося leofun01 (09.04.2016 23:18:09)

Re: Erlang запитання - відповіді -- обговорення

Дуже вдячний за дослідження, цікаво вийшло (тобно ще не вийшло, але все одно цікаво).
Маю припущення, що непомітність переваги цієї формули і проблеми з похибками були викликані із-за багаторазового використання функції pow.
Вибачте, я мав би зразу привести цю формулу до програмабельного вигляду.
Спочатку варто створити 2 константи:
GoldenRatio = 1.6180339887498948482045868343656381177399671246... (так званий золотий перетин),
в програмі його краще записати саме числом, а не формулою (1 + math:sqrt(5)) / 2;
і Sqrt5 = 2.23606797749978969640917366873127623547993424921... (math:sqrt(5)) теж числом.
Далі потрібно в якусь змінну записати результат виконання функції:
PowN = math:pow(GoldenRatio, N).
І тоді повертати потрібно щось таке:

(PowN + 1 / PowN) / Sqrt5.

Тому що
https://pic.co.ua/images/2016/04/09/9bd4a1d7e74a1db81231222d9f825327.png
Теоретично, це має бути краще і по швидкості і по точності.
Ну, це якщо у Вас буде час.

Подякували: 221VOLT1

7 Востаннє редагувалося 221VOLT (10.04.2016 02:58:37)

Re: Erlang запитання - відповіді -- обговорення

leofun01 написав:

Дуже вдячний за дослідження, цікаво вийшло (тобно ще не вийшло, але все одно цікаво).
Маю припущення, що непомітність переваги цієї формули і проблеми з похибками були викликані із-за багаторазового використання функції pow.
Вибачте, я мав би зразу привести цю формулу до програмабельного вигляду.
Спочатку варто створити 2 константи:
GoldenRatio = 1.6180339887498948482045868343656381177399671246... (так званий золотий перетин),
в програмі його краще записати саме числом, а не формулою (1 + math:sqrt(5)) / 2;
і Sqrt5 = 2.23606797749978969640917366873127623547993424921... (math:sqrt(5)) теж числом.
Далі потрібно в якусь змінну записати результат виконання функції:
PowN = math:pow(GoldenRatio, N).
І тоді повертати потрібно щось таке:

(PowN + 1 / PowN) / Sqrt5.

Тому що
https://pic.co.ua/images/2016/04/09/9bd4a1d7e74a1db81231222d9f825327.png
Теоретично, це має бути краще і по швидкості і по точності.
Ну, це якщо у Вас буде час.

по точності - результати наведених прикладів-алгоритмів з int завжди будуть точніші за алгоритми з float, вірно?

це ж не суттєво -- чи sqrt, чи pow, чи 1.61803... -- це все float а не int повертає,
тому і похибки будуть :)

стосовно швидкості -- оцініть самі --
http://f1.s.qip.ru/15iw6PUn9.png
обчислення так само частина секунди як і N100
(мілісекунди не рахував - бо я - лінивець))


а от з float - сумніваюся що я зможу звести похибки до нуля взагалі при обчисленні N>100, навіть з будь-якою кількістю поправок (думаю що поправки лише на перших M чисел впливатимуть, а далі- знову похибки),
не впевнений що це взагалі можливо - порахувати на ерлангу з float так точно як з int

все ж, дякую за підказку стосовно помилки з pow - напевно ваше рішення справді допоможе з тією помилкою,
втім, float- залишиться float-ом

ерланг все ж не чисто програмістів рішення-продукт, це продукт інженерів у першу чергу :)

втім, якщо з float можуть бути проблеми, то з int у ерлангу як я бачу - жодних проблем, також відсутні проблеми з прийомо-передачею, робота з бінарними даними відносно простенька (відносно - бо ще досить часу пройде дпоки я повністю вїду)

----

на практиці у мене будуть числа, у тому числі й ділення, де буде виникати float, а це не бажано бо числа - дані про гроші- повинні бути точними

тут варіантів наче 2 --

1 - тримаємо суму балансу не гривні.копійки, а копійки --- не 11.25 грн, а 1125 коп
у копійках же і розраховуємо, після коми все при обчисленнях - закругляємо вниз,
помилка заокруглення невелика - ну все як у банках  :D ой, я проговорився на чому ще банки нагрівають руки
(/, trunc,, ще можна float-результат у строку-список перевести і його уже опрацювати)

2 - трошки подібне до 1 - беремо окремо результат залишок від ділення, і цілочисельний результат (div, rem)

----

окремою спец-темою йде у ерлангу робота зі строками  :D наступний великий спотикач який рве всі шаблони після незвичного синтаксису і концепцій роботи з памяттю і даними (після php-js-c-etc)  :o

про це буде далі (і треба ж бо вїхати - бо треба динаміку віддавати - головну сайта --- зі статикою легше - nginx віддасть [знаю що трох тупо - для початку може бути поки немає повного контролю над ерлангом], а з апі як бути - уже майже догнав, ще трошечки)

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: leofun011

8

Re: Erlang запитання - відповіді -- обговорення

народ, хто "мацав" ерланг, чи хотів би,
чи маєте якісь запитання, чи завдання ---
підкиньте будь-ласка :)

буду по мірі можливостей різні завдання розвязувати і ділитися по ерлангу -
і те що стосовно роботи, і просто для розвитку і розваги для :)

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.

9

Re: Erlang запитання - відповіді -- обговорення

leofun01 написав:

Ну якщо вже порівнювати ефективність алгоритмів для чисел Фібоначчі, то варто розглянути і інші, більш ефективні алгоритми, зокрема формулу, яка має виконуватися приблизно за час O(1).
http://mathworld.wolfram.com/images/equations/FibonacciNumber/NumberedEquation6.gif
Мені цікаво як в Erlang буде виглядати код для такої формули.

Варто зауважити, що це асимптотична формула - підходить для спечифічних задач з достатньо великим n

Подякували: 221VOLT1

10

Re: Erlang запитання - відповіді -- обговорення

коментар до http://replace.org.ua/post/93079/#p93079 ---
в еліксирі немає модуля ets з його функціями, відповідно звертаємось до ерлангу

трошки теорії про ets(erlang term storage) та dets(disk-based erlang term storage) --

перше -- по-суті ерланговий аналог мемкеша(втім, це у моєму прикладі key-value -- в ets є і інші режими/налаштування) - тримати якісь значення в оперативці для швидкого доступу,
друге -- по суті те ж, проте зберігає дані на диск

https://elixirschool.com/ru/lessons/specifics/ets/
http://learnyousomeerlang.com/ets
http://erlang.org/doc/man/ets.html
http://erlang.org/doc/man/dets.html

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.