2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней. На страницу Пред.  1 ... 9, 10, 11, 12, 13  След.
 
 Re: Язык программирования для математика
Сообщение03.03.2011, 22:44 
Аватара пользователя


30/07/10
254
nestoklon в сообщении #419412 писал(а):
Без обид, но Ваш. Передавать оператор суммы -- это жесть.
Да, соглашусь. Учитывая, что мой опыт программирования на эрланге к тому времени был около недели - вполне ожидаемая ошибка. Вы С++ тоже неделю учили?

nestoklon в сообщении #419412 писал(а):
Чем больше маленьких функций, тем лучше, так что ли?
Тут Вы правильно заметили, это действительно лучше.

nestoklon в сообщении #419412 писал(а):
Ну, по мне так это читабельности не сильно помогает.
Я понял, что по Вышему означает "читабельность". В Вашем коде её переизбыток.

Вы лично мои слова восприняли. Лучше скажите зачем Вы всё это писали, убили столько времени? Задача-то пустяковая. Стоила ли она этих извращений?

nestoklon в сообщении #419412 писал(а):
Ну что, бывает. То, что Вам непонятно, я уже понял. Непонятно только, о чём этот факт говорит больше -- о коде или о Вас.
Это говорит о языке. Он совершенно непригоден для этой задачи. Вы это очень хорошо продемонстрировали.

nestoklon в сообщении #419412 писал(а):
Метод парабол -- строчки с 32 по 42, из которых половина для читабельности и две указание распараллелить код. Вы их не нашли? А мне казалось, Вы хотели посмотреть, как на c++ "правильно" обращаться с функциями "в общем виде" на простом примере.
В том-то и дело. Полезного кода 3 строчки. Что делает остальной код? Совместимость алгоритма с языком программирования? :mrgreen:

nestoklon в сообщении #419412 писал(а):
А, Вы даже не просмотрели код. Ну тогда о чём мы говорим?
Я посмотрел, но, возможно, не увидел. Я и сейчас не вижу. Зачем Вы всё в одну строчку пишите? Думаете код короче сделать? Вообще если использовать лямбда-функции, то код получится такой же как на шарпе. Тогда для меня вообще загадка - что делает весь Ваш код.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение03.03.2011, 22:52 
Заслуженный участник


09/08/09
3438
С.Петербург

(Поправил немного код)

Поправил код в post418741.html#p418741:
Вместо
Код:
        forFnc(1, steps + 1, i => { lock (monitor) { result += 4 * fnc(xmin + (i-0.5)*dx); } });
        forFnc(1, steps,     i => { lock (monitor) { result += 2 * fnc(xmin + i*dx); } });
теперь
Код:
        forFnc(1, steps + 1, i => { double s = 4 * fnc(xmin + (i - 0.5) * dx); lock (monitor) { result += s; } });
        forFnc(1, steps,     i => { double s = 2 * fnc(xmin + i * dx);         lock (monitor) { result += s; } });
А то не сильно он параллелился :)

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение03.03.2011, 22:57 
Аватара пользователя


30/07/10
254
Maslov, ну и как, параллельный код быстрей считается? Во сколько раз (и на скольких процессорах), не замеряли?

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение03.03.2011, 23:02 
Заслуженный участник


19/07/08
1266

(Оффтоп)

cupuyc в сообщении #419419 писал(а):
Учитывая, что мой опыт программирования на эрланге к тому времени был около недели - вполне ожидаемая ошибка.
Что же будет, когда Вы откроете для себя питон... Страшно представить.
cupuyc в сообщении #419419 писал(а):
Зачем Вы всё в одну строчку пишите?
Потому что так принято. Был бы олдскульным китайцем -- писал бы в столбик.

cupuyc в сообщении #419419 писал(а):
Полезного кода 3 строчки. Что делает остальной код?
Ну у вас-то и того нет, без обид. Полезная строчка равномерно размазана по 10 функциям и 40 строчкам. Очень удобно, да.
cupuyc в сообщении #419419 писал(а):
Тогда для меня вообще загадка - что делает весь Ваш код.
А Вы его читать пробовали?

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение03.03.2011, 23:05 
Аватара пользователя


30/07/10
254
nestoklon в сообщении #419431 писал(а):
А Вы его читать пробовали?
, пробовал. Не понял к чему столько шаблонных классов, если используются лямбда функции. Какова цель - наплодить кучу сущностей?

nestoklon в сообщении #419431 писал(а):
Ну у вас-то и того нет, без обид.
Тут Вы правы. У меня нет столько бесполезного кода.

nestoklon в сообщении #419431 писал(а):
Полезная строчка равномерно размазана по 10 функциям и 40 строчкам. Очень удобно, да.
Тут Вы ошибаетесь. Каждая функция выполняет некоторое вполне осмысленное действие. Алгоритм не размазан по функциям от одного только желания.

-- Пт мар 04, 2011 02:06:56 --

(Оффтоп)

nestoklon в сообщении #419431 писал(а):
Потому что так принято. Был бы олдскульным китайцем -- писал бы в столбик.
Код от этого понятней не становится.
nestoklon в сообщении #419431 писал(а):
Что же будет, когда Вы откроете для себя питон... Страшно представить.
Открывал.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение03.03.2011, 23:16 
Заслуженный участник


19/07/08
1266
cupuyc в сообщении #419434 писал(а):
Не понял к чему столько шаблонных классов
1 (один!!!) шаблонный класс. Там есть один шаблонный класс. Когда я Вам говорю, что С это не С++, Вы говорите что нет никакой разницы. Когда я Вам эту разницу показываю, Вы спрашиваете "а зачем тут шаблоны?". Блин, да потому что это не С!
cupuyc в сообщении #419434 писал(а):
У меня нет столько бесполезного кода.
Угу, потому что его за Вас наплодили авторы языка. Ладно, я всё понял. Это не лечится. Удачи с Эрлангом. Особенно рекомендую обратить внимание на производительность. Могут быть неожиданные открытия.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение03.03.2011, 23:18 
Аватара пользователя


30/07/10
254
nestoklon в сообщении #419441 писал(а):
Когда я Вам говорю, что С это не С++, Вы говорите что нет никакой разницы.
Не врите, я такого не говорил. Языки совершенно разные. Я говорил, что в обоих языках будут одни и те же проблемы.

-- Пт мар 04, 2011 02:22:34 --

nestoklon в сообщении #419441 писал(а):
1 (один!!!) шаблонный класс.
Тут даже один класс не нужен (хотя, Вы врёте, у Вас не один класс описан). Тут вообще классы не нужны. С лямбда функциями задача решается написанием одной (!!!) функции, для расчёта значения интеграла. Зачем тут классы? Вот venco решил задачу без лямбда функций - пришлось возиться с бустовским boost:lambda, поэтому и получилось такое нагромождение шаблонов. Когда я увидел кучу шаблонов в Вашем коде, я поначалу подумал, что Вы эти шаблоны написали вместо бустовских. А оказалось, что Вы использовали лямбда функции, да ещё и написали кучу бесполезных классов. Вот я и не пойму - зачем.

nestoklon в сообщении #419441 писал(а):
Особенно рекомендую обратить внимание на производительность.
Вы сами обращали? Сдаётся мне что Ваши утверждения голословны.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение03.03.2011, 23:31 
Заслуженный участник


19/07/08
1266
cupuyc в сообщении #419443 писал(а):
С лямбда функциями задача решается написанием одной (!!!) функции, для расчёта значения интеграла. Зачем тут классы?
У Maslov спросите, он знает.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение03.03.2011, 23:33 
Аватара пользователя


30/07/10
254
nestoklon в сообщении #419456 писал(а):
cupuyc в сообщении #419443 писал(а):
С лямбда функциями задача решается написанием одной (!!!) функции, для расчёта значения интеграла. Зачем тут классы?
У Maslov спросите, он знает.
При чём здесь Maslov? Не уходите от ответа. У него задача решена без всяких дополнительных ненужных классов.

-- Пт мар 04, 2011 03:27:24 --

Я тут подумал над Вашим заявлением
nestoklon в сообщении #419412 писал(а):
Передавать оператор суммы -- это жесть.
Всё-таки у меня правильно сделано. В эрланге таким образом реализуется концепция метапрограммирования. Жаль, конечно, нет возможности посмотреть ассемблерный код, генерируемый эрлангом, но вполне верятно, что никакой указатель на функцию в качестве аргументов другой функции не передаётся. Вполне возможно это всё решается в compile time. Так что Ваша критика совершенно не обоснована.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение04.03.2011, 03:02 
Заслуженный участник


09/08/09
3438
С.Петербург
cupuyc в сообщении #419428 писал(а):
Maslov, ну и как, параллельный код быстрей считается? Во сколько раз (и на скольких процессорах), не замеряли?
Да, Вы и venco были правы: параллельный вариант считается быстрее. На четырех ядрах разница от 2-х до 4-х раз (в зависимости от соотношения количество точек во внешнем и внутреннем интегралах).

Кстати, вот ещё один эрланговский вариант (по мотивам C#):
код: [ скачать ] [ спрятать ]
Используется синтаксис Erlang
  1. -module(simps).
  2. -export([parSimpson/4, seqSimpson/4]).
  3. -compile([native]).
  4.  
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6. %% exports API
  7. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  8.  
  9. -spec(parSimpson/4 :: (From :: float(), To :: float(), N :: integer(), Func :: function()) -> float()).
  10. -spec(seqSimpson/4 :: (From :: float(), To :: float(), N :: integer(), Func :: function()) -> float()).
  11.  
  12. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  13. %% implementation
  14. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  15.  
  16. simpson(From, To, N, Func, Map) ->
  17.     Dx = (To - From) / N,
  18.     Dx / 6 * (
  19.         Func(From) + Func(To) +
  20.         lists:foldl(fun(A, H)->A+H end, 0, Map(fun(I)->4*Func(From+(I-0.5)*Dx) end, lists:seq(1, N))) +
  21.         lists:foldl(fun(A, H)->A+H end, 0, Map(fun(I)->2*Func(From+I*Dx) end,       lists:seq(1, N-1)))
  22.     ).
  23.  
  24. %% Утащено отсюда: http://bc.tech.coop/blog/070601.html
  25. parmap(F, L) ->
  26.     Parent = self(),
  27.     [receive {Pid, Result} -> Result end || Pid <- [spawn(fun() -> Parent ! {self(), F(X)} end) || X <- L]].
  28.        
  29. parSimpson(From, To, N, Func) ->
  30.     simpson(From, To, N, Func, fun(F, L) -> parmap(F, L) end ).
  31.  
  32. seqSimpson(From, To, N, Func) ->
  33.     simpson(From, To, N, Func, fun(F, L) -> lists:map(F, L) end ).

(Disclaimer)

Если что не так, не судите строго: на эрланге до этого не писал

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение04.03.2011, 03:13 
Аватара пользователя


30/07/10
254
Maslov, мне кажется, что мой вариант эрланговского кода лучше. Я тоже сначала думал сделать через листы. Да, есть функции стандартных библиотек, код получается попроще, но сколько памяти выделяется для сохранения значений! Конечно, чёрт с ней - с памятью, на современных компьютерах её море. Но, опять же, кеш ограничен, стало быть и производительность снизится. В итоге решил написать свой велосипед - функции for, sum, которые не сохраняют промежуточные результаты.

Может ещё что-нибудь решим? Задачу движения объектов солнечной системы, например. Здесь распараллеливание наверняка будет актуально. У меня назревает мысль заюзать GPU для решения этой задачи. Хотя, количество ядер CPU растёт год от года (уже, вроде, и шести ядерные есть), так что может и не имеет особого смысла заморачиваться с GPU.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение05.03.2011, 15:12 
Заморожен
Аватара пользователя


05/03/11
3
Собственно, вот плюсная прога с использованием лямбды. Не понятно что Вы, nestoklon, изобретали.
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <omp.h>

template <class t_func>
double integral(double const& from, double const& to, t_func const& func, int N = 10000)
{
    double sum = 0.0;
    double const step = (to - from) / (2.0 * N);
    int i;

#pragma omp parallel for
    for (i = 1; i < N; i ++)
        sum += 2.0 * func(from + (to - from) * i / N);

#pragma omp parallel for
    for (i = 1; i <= N; i ++)
        sum += 4.0 * func(from - step + (to - from) * i / N);

    return step * (sum + func(from) + func(to)) / 3.0;
}

int main()
{
    double const integral_value = integral(0.0, 1.0, [](double const& x){ return integral(sin(x), cos(x), [&x](double const& y) { return x * x * y * (2.0 * x + 3.0 * y); });});
    std::cout << "integral value: " << integral_value << std::endl;
    return 0;
}
 

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение05.03.2011, 18:02 
Заслуженный участник


19/07/08
1266
cupuyc_ в сообщении #419552 писал(а):
Не понятно что Вы, nestoklon, изобретали.
1) Я стремился показать как это делается "на с++". Лямбды только для примера использования.
2) А теперь продемонстрируйте, как Вы будете делать карринг функции нескольких переменных. К сожалению для ФП и к счастью для всего остального, функция нескольких переменных на С++ -- это настоящая функция нескольких переменных, а не функция от одного словаря.
Хотя, что я объясняю...

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение05.03.2011, 18:17 
Заморожен
Аватара пользователя


05/03/11
3
nestoklon в сообщении #419613 писал(а):
1) Я стремился показать как это делается "на с++". Лямбды только для примера использования.
У Вас получилось показать как это делается через то место, за которое мне дали предупреждение. Классы ради классов? сиплюсплюс ради сиплюсплюса? Конечная цель программиста - решить задачу оптимальным образом, а не нагородить кучу классов чтобы они были.

nestoklon в сообщении #419613 писал(а):
2) А теперь продемонстрируйте, как Вы будете делать карринг функции нескольких переменных. К сожалению для ФП и к счастью для всего остального, функция нескольких переменных на С++ -- это настоящая функция нескольких переменных, а не функция от одного словаря.
Остапа понесло... Во-первых, не уходите от темы. Во-вторых, что такое "настоящая функция нескольких переменных"? Бывают ещё "игрушечные функции нескольких переменных"?

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение05.03.2011, 18:34 
Заслуженный участник


19/07/08
1266
cupuyc_ в сообщении #419616 писал(а):
Конечная цель программиста - решить задачу оптимальным образом, а не нагородить кучу классов чтобы они были.
Простите покорнейше, что я решал предложенную задачу, а не сделал убогую поделку. Если бы я знал, что Вы не в состоянии отличить, конечно сделал бы второе. Впрочем, мог догадаться.
cupuyc_ в сообщении #419616 писал(а):
Во-вторых, что такое "настоящая функция нескольких переменных"? Бывают ещё "игрушечные функции нескольких переменных"?
Нет, бывают недофункции, как в функциональных языках. Когда функция -- это всегда что-то, что принимает описание аргументов плюс аргументы. Что я и эмулировал первым из необходимых для решения задачи классом.
cupuyc_ в сообщении #419616 писал(а):
а не нагородить кучу классов чтобы они были
Да, я уже спрашивал, зачем Вы наплодили функций, повторяю вопрос. Вы не оценили иронии. Намекну, в ФП оперируют функциями, с ООП -- объектами.
cupuyc_ в сообщении #419616 писал(а):
Во-первых, не уходите от темы.
В принципе, было понятно, что не поймёте. Спрошу попроще. Проинтегрируйте пожалуйста функцию от двух переменных.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 195 ]  На страницу Пред.  1 ... 9, 10, 11, 12, 13  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Mikhail_K


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group