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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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