LINUX.ORG.RU

[C++?] Серьезный вопрос.


3

2

Просьба ответит серьезно, желательно с аргументами за или против.

Предистория:
Когда то давным давно (я тогда еще только закончил 9-ый класс) я увидел в газете объявление о наборе в летнюю группу по изучению классического программирования. В тот момент я был с компьютером на ты и "очень" хорошо в них разбирался (переустанавливал Windows каждый месяц, хаял Microsoft просто потому, что после моих настроек W приходилось постоянно переустанавливать). Группа по классическому программированию так и не набралась, но набралось 1 человек на Visual Basik for Applications. Я соглсился быть вторым и начались занятия.
Все, что мне там объясняли я схватывал быстро. Меня пригласили продолжить обучение в сентябре на курсе "моделирование".
Там уже был Pascal, который я тогда совсем не знал. Сам курс был очень разношорстный: мы изучали и использование мыши через прерывание, готовились к различным олимпиадам. Параллельно я изучил Pascal.
Потом был Delphi. К концу 10-го класса я уже неплохо владел приемами программирования и вовсю клепал бесполезные программулины. Потом поступил в универ на программиста. Там тоже был Delphi, и я особо не напрягаясь писал все лабы (к моменту поступления я уже был знаком с логикой указателей, самописные стеки и графы, etc).
На 2-ом курсе в гостях у знакомого я разобщался с человеком, который уже насколько лет работал в нерезиновой программистом. Он мне и открыл глаза на мир: "Delphi здох. Его уже похоронили и забыли. Сейчас необходимо знание C++, C#. Необходимо занание паттернов проектирование". Вобщем много чего он мне наговорил. Книжек умных насоветовал, подкинул MSVS 2008, кучу электронных книжек. Я изучил C# по книжке Шилдта. Читал "Идеальный кол" (автора уже не помню). Потом купил(!) себе книжку Шилдта про С++. Мне понравился язык. Тем более что мне казалось, что именно он и есть общепринятый стандарт. Наиболее удобный язык для программиста.

А недавно в соседней теме за упоминание это С++ меня чуть было не съели со всем чем можно. Так-то.

Собственно вопрос: Так стоит ли изучать дальше С++ (а я уже достаточно углубился в книжку Страуструпа, подробно изучая все подводные течения)? Какой язык стоит изучать? Какие из них более востребованны?

Спасибо всем, кто осилил это многобукаф.

★★★★★
Ответ на: комментарий от Reset

> Не знаю кто это, но ты что всерьез думаешь, что это сделано на javascript ?

Буагага! Буагагагагага!!! ROFL!!! Ой, не могу... 8))))) Молодец, прекрасно пошутил.

kemm
()
Ответ на: комментарий от linuxfan

> ты будешь иметь эффективный qsort без необходимости ручного заката солнца.

Угу, затем в bsd и написали ужас пострашнее буста под названием queue.h. еще страшно то, что если вот так его взять и начать пользовать то он опять будет сливать stl'ю и придется трахаться с собственными аллокаторами. Спрашивается нахера такие мучения?

Reset ★★★★★
()
Ответ на: комментарий от linuxfan

> можешь помочь камраду jtootf в исследовании уравнения мелкой воды. Ты пишешь на любимом хаскелле, он на своем любимом питоне

jtootf тайный петонщег!!!!111

tailgunner ★★★★★
()
Ответ на: комментарий от linuxfan

> Поскольку для тебя "не катит" отсутствие пруфлинков, а затем существующие ты признаешь неудовлетворительными

Тьфу ты, ещё один. Ты, прежде чем фантазировать на тему того, что я-де пруфлинки признаю неудовлетворительными, попробуй хоть один привести. Dixi.

kemm
()
Ответ на: комментарий от jtootf

Млять, это язык такой, так выражайся яснее, а то я думал, что какой-то чувак написал веб-форму для эмуляции гидродинамики в браузере :))

Reset ★★★★★
()
Ответ на: комментарий от tailgunner

>jtootf тайный петонщег!!!!111

ААААААААААААААА!!!!!!!!!!!!!!!!!!!1111

jtootf ★★★★★
()
Ответ на: комментарий от Reset

>Млять, это язык такой, так выражайся яснее, а то я думал, что какой-то чувак написал веб-форму для эмуляции гидродинамики в браузере :))

я понимаю, что я до сих пор не предоставил обещанную на ЛОР справку от психиатра, но эмуляция гидродинамики на javascript - это всё-таки уже за рамками добра и зла :)

jtootf ★★★★★
()
Ответ на: комментарий от Reset

> Угу, затем в bsd и написали ужас пострашнее буста под названием queue.h. еще страшно то, что если вот так его взять и начать пользовать то он опять будет сливать stl'ю и придется трахаться с собственными аллокаторами.

Любишь ты 4.2, я погляжу... sys/queue.h делает stl, скажем, в части std::list<int> vs. TAILQ на размерах списка до 1 ляма точно. Без аллокаторов, при том, что в случае sys/queue.h выполняется явное выделение на каждый элемент, ага. Особенно страшен выигрыш при оптимизациях ниже -O2.

kemm
()
Ответ на: комментарий от kemm

> Особенно страшен выигрыш при оптимизациях ниже -O2.

а если пример с stl вообще без оптимизации компилить, а пример с queue.h - с O2/3, так вообще сразу становится понятно, что stl фигня полная

lester ★★★★
()
Ответ на: комментарий от kemm

Нашел уже

http://unx.ca/log/2006/08/01/tailq-example/

Печать убрал, на моей машине время одинаково с точностью до статистической погрешности. А но tailq это не так интересно, интересней посмотреть деревья из того же набора хидеров и сравнить с std::map и std::set вот тут уже реальный слив будет.

Кстати еще не забываем про удобство использования и поддержки этого хозяйства.

Reset ★★★★★
()
Ответ на: комментарий от jtootf

>>Прости за тупой вопрос, но я просто не знаю, что такое yorick

>http://yorick.sourceforge.net/

У тебя, похоже, дислексия. Я не говорил: "Я не могу найти официальный сайт yorick" --, я сказал, что не знаю, что такое yorick. Судя по тому, что ты кидаешься ссылками из поисковиков, ты и сам хреново представляешь, что же за штуковину гугл подсунул тебе по запросу "вычисление поля скоростей жидкости".

>к сути вопроса это отношения не имеет

Тогда уточни, о каком вопросе ты ведешь речь, ибо я тебе рассказал success story, участником которой является "числодробилка на C++".

linuxfan
()
Ответ на: комментарий от Reset

Линка не будет, сам как-то прогонял от делать нефиг. Результаты самого удивили, да...

t.cc:

#include <sys/time.h>
#include <sys/queue.h>
#include <stdlib.h>
#include <iostream>
#include <list>

struct mlist {
    int i;
    TAILQ_ENTRY(mlist) link;
};

#define N 10000000

int
main()
{
    struct timeval ts, te;
    time_t s, u;

    gettimeofday(&ts, NULL);
    TAILQ_HEAD(, mlist) clst = TAILQ_HEAD_INITIALIZER(clst);
    for (int i = 0; i < N; i++) {
        struct mlist *ent = (struct mlist *)malloc(sizeof(struct mlist));
        ent->i = i;
        TAILQ_INSERT_TAIL(&clst, ent, link);
    }
    gettimeofday(&te, NULL);
    s = te.tv_sec - ts.tv_sec;
    u = te.tv_usec - ts.tv_usec;
    if (u < 0) { s--; u += 1000000; }
    printf("TAILQ insert: %ld.%06ld\n", s, u);

    gettimeofday(&ts, NULL);
    std::list<int> lst;
    for (int i = 0; i < N; i++)
        lst.push_back(i);
    gettimeofday(&te, NULL);
    s = te.tv_sec - ts.tv_sec;
    u = te.tv_usec - ts.tv_usec;
    if (u < 0) { s--; u += 1000000; }
    printf("std::list insert: %ld.%06ld\n", s, u);

    gettimeofday(&ts, NULL);
    struct mlist *it, *itt;
    it = TAILQ_FIRST(&clst);
    while (it != NULL) {
        itt = TAILQ_NEXT(it, link);
        free(it);
        it = itt;
    }
    gettimeofday(&te, NULL);
    s = te.tv_sec - ts.tv_sec;
    u = te.tv_usec - ts.tv_usec;
    if (u < 0) { s--; u += 1000000; }
    printf("TAILQ clear: %ld.%06ld\n", s, u);

    gettimeofday(&ts, NULL);
    lst.clear();
    gettimeofday(&te, NULL);
    s = te.tv_sec - ts.tv_sec;
    u = te.tv_usec - ts.tv_usec;
    if (u < 0) { s--; u += 1000000; }
    printf("std::list clear: %ld.%06ld\n", s, u);

    return 0;
}

$ g++ -o t -Wall -O0 t.cc
$ ./t
TAILQ insert: 0.682055
std::list insert: 1.395172
TAILQ clear: 0.476891
std::list clear: 0.646238

$ g++ -o t -Wall -O1 t.cc
$ ./t
TAILQ insert: 0.682055
std::list insert: 1.395172
TAILQ clear: 0.476891
std::list clear: 0.646238

$ g++ -o t -Wall -O2 t.cc
$ ./t
TAILQ insert: 0.594457
std::list insert: 0.670367
TAILQ clear: 0.208502
std::list clear: 0.222436

$ g++ --version
g++ (Gentoo 4.3.3-r2 p1.2, pie-10.1.5) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
kemm
()
Ответ на: комментарий от Reset

> интересней посмотреть деревья из того же набора хидеров и сравнить с std::map и std::set

Фри под рукой нет. В sys/queue.h или рядом разве есть деревья?

> вот тут уже реальный слив будет

Сравнивал или с потолка взял?

> Кстати еще не забываем про удобство использования и поддержки этого хозяйства.

На вкус и цвет...

kemm
()
Ответ на: комментарий от Ximen

>И иначе обрабатываются и ведут к другим последствиям. А так да, почти то же самое.

Давай я скажу тебе всего два слова: libsigsegv, clisp --, и ты наконец откроешь для себя вариант полезного применения 11-го сигнала и перестанешь нести чушь?

linuxfan
()
Ответ на: комментарий от kemm

Линка не будет, сам как-то прогонял от делать нефиг. Результаты самого удивили, да...

я в свое время конкретно tailq не тестил, а тестил деревья из sys/tree.h (или как оно там) ибо было более актуально, set'у с map'ом они слили хорошо

tailq пускал так

/*
 * TAILQ example program.
 */

#include <stdlib.h>
#include <stdio.h>

/*
 * On many OpenBSD/NetBSD/FreeBSD you could include <sys/queue.h>, but
 * for portability we'll include the local copy.
 */
#include "queue.h"

/*
 * This structure defines each item in our tail queue.  It must also
 * contain an item (TAILQ_ENTRY) that points to the next and previous
 * items in the tail queue.
 *
 * For simplicity, we will be creating a list of integers.
 */
struct tailq_entry {
	int value;

	/*
	 * This holds the pointers to the next and previous entries in
	 * the tail queue.
	 */
	TAILQ_ENTRY(tailq_entry) entries;
};

/*
 * Our tail queue requires a head, this is defined using the
 * TAILQ_HEAD macro.
 */
TAILQ_HEAD(, tailq_entry) my_tailq_head;

int
main(int argc, char **argv)
{
	/* Define a pointer to an item in the tail queue. */
	struct tailq_entry *item;

        /* In some cases we have to track a temporary item. */
        struct tailq_entry *tmp_item;

	int i;
	int n = atoi(argv[1]);

	/* Initialize the tail queue. */
	TAILQ_INIT(&my_tailq_head);

	/* Add 10 items to the tailq queue. */
	for (i = 0; i < n; i++) {
		/*
		 * Each item we want to add to the tail queue must be
		 * allocated.
		 */
		item = malloc(sizeof(*item));
		if (item == NULL) {
			perror("malloc failed");
			exit(EXIT_FAILURE);
		}

		/* Set the value. */
		item->value = i;

		/*
		 * Add our item to the end of tail queue. The first
		 * argument is a pointer to the head of our tail
		 * queue, the second is the item we want to add, and
		 * the third argument is the name of the struct
		 * variable that points to the next and previous items
		 * in the tail queue.
		 */
		TAILQ_INSERT_TAIL(&my_tailq_head, item, entries);
	}

	/* Free the entire tail queue. */
	while (item = TAILQ_FIRST(&my_tailq_head)) {
		TAILQ_REMOVE(&my_tailq_head, item, entries);
		free(item);
	}

	/* The tail queue should now be empty. */
	if (!TAILQ_EMPTY(&my_tailq_head))
		printf("tail queue is NOT empty!\n");

	return 0;
}
#include <list>
#include <stdlib.h>

using namespace std;

int main(int argc, char ** argv)
{
        int n = atoi(argv[1]);
        list < int > lst;

        for (int i = 0; i < n; ++i) {
                lst.push_back(i);
        }
        return 0;
}

a.out это list, tailq_ex это tailq

$ time -p ./a.out 10000000
real 0.62
user 0.45
sys 0.18
$ time -p ./tailq_ex 10000000
real 0.58
user 0.48
sys 0.11
$ time -p ./tailq_ex 100000000
real 6.03
user 4.15
sys 1.69
$ time -p ./a.out 100000000
real 6.32
user 4.57
sys 1.62

Reset ★★★★★
()
Ответ на: комментарий от jtootf

>в том же, что касается аналитического, проявляется сильная сторона "абсолютно бесполезного" Haskell и иже с ним

Пишем свой maple с монадами и замыканиями, а потом решаем в нем поставленную задачу? :D Расслабься, maple уже написан, можно пользоваться.

>не думай, что интерпретируемый = медленный, он очень неплохо заточен под описываемые тобой задачи

А если я сейчас скажу, что алгоритмы численного решения дифуров там написаны на C (или на C++), а интерпретируемая часть лишь передает некие параметры и получает готовое решение, ты скажешь, что интерпретируемый в переводе с неизвестного наречия несуществующего языка означает "приспособленный для решения задач численного моделирования"?

linuxfan
()
Ответ на: комментарий от linuxfan

>У тебя, похоже, дислексия

это не дислексия, а селективное восприятие (с)

>Я не говорил: "Я не могу найти официальный сайт yorick" --, я сказал, что не знаю, что такое yorick

моя вера в способность людей читать неистребима; в способность думать уже поколебали, но я всё ещё держусь

>Судя по тому, что ты кидаешься ссылками из поисковиков

fail. ну то есть сайт yorick'а я, несомненно, нашёл именно поисковиком (и не совсем понимаю, почему этого не сделал ты - ничего сложного как бы нет), но искал я его по названию и хорошо представляя себе что это такое

>хреново представляешь, что же за штуковину гугл подсунул тебе по запросу "вычисление поля скоростей жидкости".

а вот этого я в гугл не сувал вообще, благо некоторое представление имею и так. ты к концу треда попонтоваться, что ли решил? выставить себя умнее окружающих? надо было начинать с этого, что ли, счас уже смешно выглядит

>Тогда уточни, о каком вопросе ты ведешь речь, ибо я тебе рассказал success story, участником которой является "числодробилка на C++"

разработка алгоритма = "числодробилка на C++"? на каком-нибудь OCaml не взлетело бы?

jtootf ★★★★★
()
Ответ на: комментарий от kemm

>Дык этта, ссылку на faq fttw уже давали.

Ъ по ссылкам не ходят. Тем более, по ссылкам на www.cool-site.org, где, поковырявшись, якобы можно найти подтверждение словам оппонента. Вякнул про окамль -- будь добр, сунь мне под нос подтверждение или молча признай неправоту.

linuxfan
()
Ответ на: комментарий от kemm

> На вкус и цвет...

Ну да, я уже понял, что ты любишь гланды через жопу вырывать, так зачем же эту свою привычку пытаться навязать другим?

Reset ★★★★★
()
Ответ на: комментарий от linuxfan

>А если я сейчас скажу, что алгоритмы численного решения дифуров там написаны на C

я скажу что так и есть

>ты скажешь, что интерпретируемый в переводе с неизвестного наречия несуществующего языка означает "приспособленный для решения задач численного моделирования"?

да. потому что решать там такие задачи существенно проще и удобней

>Пишем свой maple с монадами и замыканиями, а потом решаем в нем поставленную задачу? :D Расслабься, maple уже написан, можно пользоваться.

и не только maple. есть ещё scilab, maxima, упоминаемые выше системы численных вычислений. вот только речь шла о библиотеках вроде как, причём о библиотеках с функциональным интерфейсом. если рассуждать таким образом, то FFTW тоже нахрен не нужен, а про C++ для "числодробления" и подавно пора забыть как о страшном сне - есть же maple! ура! даже с поддержкой PVM есть, так что и параллелить как бы давно не проблема! вот, вот решение всех наших проблем!

заодно замечу, что язык той же mathematica - лиспоподобный и вполне себе функциональный. кажется даже чистый

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>FFTW написан связкой OCaml и C в том смысле, что сишный код в нём _генерируется_ программой, написанной на OCaml.

emerge написан на C в том смысле, что интерпретатор, выполняющий питоновский код, _написан_ на языке C и скомпилирован компилятором, также написанным на языке C.

Ты и дальше собираешься паясничать?

>а вот то, чего нет, или что работает плохо - перепишу. с использованием наиболее подходящего для этой цели инструмента

Замечательно! Ты только что озвучил аргумент, который удерживает FORTRAN от гибели: на на нем и для него написано столько проверенных вещей, что проще развивать FORTRAN, чем полностью отказаться от него.

Вопрос о том, на чем же писать интерпретатор питона, кроме как не на C, я лучше не буду задавать, чтобы ты не перенапрягся.

linuxfan
()
Ответ на: комментарий от Reset

> Ну да, я уже понял, что ты любишь гланды через жопу вырывать, так зачем же эту свою привычку пытаться навязать другим?

С тобой всё и так давно ясно, успокойся. 4.2 на 4.2 громоздишь без устали. 8)) Темплейты -- это не просто гланды через жопу, это гланды через жопу автогеном без наркоза.

kemm
()
Ответ на: комментарий от Ximen

>Так С или С++?

Если бы был хоть немного знаком с этими языками, ты бы знал, что если существует сишная библиотека, то задействовать ее из C++ не составит никакого труда. Так что если есть, скажем, сишный libfftw.so и fftw3.h, то значит все прелести этой библиотеки доступны и твоему плюсовому коду без дополнительных телодвижений.

linuxfan
()
Ответ на: комментарий от linuxfan

>emerge написан на C в том смысле, что интерпретатор, выполняющий питоновский код, _написан_ на языке C и скомпилирован компилятором, также написанным на языке C.

ты правда не чувствуешь разницы между этими подходами? ну вот тебе ещё на подумать, эффективная реализация метода Монте-Карло на Haskell:

http://www.cse.unsw.edu.au/~dons/papers/SCKCB07.html

тут тоже используется кодогенерация, правда на выходе не С, а опять же Haskell. так тебе проще будет это осилить?

>Ты только что озвучил аргумент, который удерживает FORTRAN от гибели

именно. а тебе есть что возразить?

>Вопрос о том, на чем же писать интерпретатор питона, кроме как не на C, я лучше не буду задавать, чтобы ты не перенапрягся

компилятор я бы однозначно писал на Haskell, интерпретатор - дело вкуса

jtootf ★★★★★
()
Ответ на: комментарий от tailgunner

>jtootf тайный петонщег!!!!111

Пардон, в сортах скрипткиддисов не разбираюсь. Петон, похапе, перл -- они для меня все на одно лицо.

linuxfan
()
Ответ на: комментарий от linuxfan

>Пардон, в сортах скрипткиддисов не разбираюсь. Петон, похапе, перл -- они для меня все на одно лицо.

всегда восхищался людьми, гордящимися собственным невежеством. как это у вас получается, а? я бы не смог

к слову - я не пишу ни на Perl, ни на Python, ни на PHP

jtootf ★★★★★
()
Ответ на: комментарий от linuxfan

> Пардон, в сортах скрипткиддисов не разбираюсь.

Да ты много в чем не разбираешься.

> Петон, похапе, перл -- они для меня все на одно лицо.

Это доказывает лишь то, что ты не слушаешь оппонента.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

хотя что-то в этом есть - на ЛОРе меня уже считали плюсофилом, лиспофилом, теперь вот признали тайным питонщиком. что на очереди? c#? brainfuck? befunge?

jtootf ★★★★★
()
Ответ на: комментарий от kemm

А вот и tree

$ time -p ./set 10000000
real 6.85
user 6.66
sys 0.19
$ time -p ./tree 10000000
real 9.08
user 8.82
sys 0.26

И это при том, что удаления в сишной версии нет.

Вот код:

#include <set>
#include <stdlib.h>

using namespace std;

int main(int argc, char ** argv)
{
	int n = atoi(argv[1]);
	set < int > lst;

	for (int i = 0; i < n; ++i) {
		lst.insert(i);
	}

	for (int i = 0; i < n; ++i) {
		set < int >::iterator it = lst.find(i);
	}
	return 0;
}

#include "tree.h"
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
struct node
{
	RB_ENTRY (node) entry;
	int i;
};
int
intcmp (struct node *e1, struct node *e2)
{
	return (e1->i < e2->i ? -1 : e1->i > e2->i);
}
RB_HEAD (inttree, node) head = RB_INITIALIZER (&head);
RB_GENERATE (inttree, node, entry, intcmp)


int
main(int argc, char ** argv)
{
	int i;
	int N = atoi(argv[1]);
	struct node *n;
	for (i = 0; i < N; i++)
	{
		if ( (n = malloc (sizeof (struct node) ) ) == NULL)
			err (1, NULL);
		n->i = i;
		RB_INSERT (inttree, &head, n);
	}

	for (i = 0; i < N; i++)
	{
		struct node *w = RB_FIND(inttree, &head, n);
	}
	return (0);
}
Reset ★★★★★
()
Ответ на: комментарий от linuxfan

> Ученые для этого держат студентов/аспирантов. Лично я для одного кандидата математических наук вообще на ассемблере фигачил символьные вычисления, поскольку maple для него был слишком медленным, плюсы/си -- недостаточно быстрыми. Разумеется, эти числодробильные функции вызывались из красивого интерфейса на более высокоуровневом C, однако я с этим кандидатом временами обсуждал, а не просираем ли мы такты в этом цикле.

> Эта история имела место быть в 2003-2004 годах.

а я в этих годах видел идиотов кандидатов которые на асемблере переписывали задачу построения статзависимости уровня сахара в крови больного от 50ти параметров электрокардиограммы. Systat послал их нафиг потому что в группе было всего человек 100.

Огого зависимость какая считалась в результате.

Вообщем через две точки только одну прямую и провести можно. Можно написать программу (даже на ассемблере и темболее на нем) которая и через одну точку (в отличии от Systat) прямую проведет оптимально :)

Ну такие мелочи как считается что ли бо вообще корректно или контрольную выборку выделить никого не интересовало вооще, все силы на ассемблер ушли. В результате имеем из толкового студента еще одного идиота с навсегда вывихнутым мозгом.

psv1967 ★★★★★
()
Ответ на: комментарий от Reset

>maple это не числодробильня, а символьная алгебра

ок, пусть будет scilab или matlab. в смысле матричных вычислений вроде подходит

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>а про C++ для "числодробления" и подавно пора забыть как о страшном сне - есть же maple! ура! даже с поддержкой PVM есть, так что и параллелить как бы давно не проблема! вот, вот решение всех наших проблем!

Мне кажется, что ты вот-вот осознаешь, что существование божественного maple не отменяет необходимости в специализированных реализациях некоторых алгоритмов. Такая мысль либо подорвет твое сознание и ввергнет в пучины когнитивного дессонанса, либо ты взойдешь на новый уровень развития и осознаешь, что инструменты общего назначения нужны в тех случаях, для которых еще не изобретено ничего специфичного и более эффективного.

>заодно замечу, что язык той же mathematica - лиспоподобный и вполне себе функциональный.

И что, там $$\frac{a^2+b^2}{(c+d)(c-d)}$$ запишется как (/ (+ (expt a 2) (expt b 2)) (* (+ c d) (- c d))) ?

linuxfan
()
Ответ на: комментарий от psv1967

>Ну такие мелочи как считается что ли бо вообще корректно или контрольную выборку выделить никого не интересовало вооще, все силы на ассемблер ушли. В результате имеем из толкового студента еще одного идиота с навсегда вывихнутым мозгом.

ну просто-таки мои слова!

jtootf ★★★★★
()
Ответ на: комментарий от linuxfan

>Пишем свой maple с монадами и замыканиями, а потом решаем в нем поставленную задачу? :D Расслабься, maple уже написан, можно пользоваться.

>Мне кажется, что ты вот-вот осознаешь, что существование божественного maple не отменяет необходимости в специализированных реализациях некоторых алгоритмов

мне одному кажется, или ты сам с собой разговариваешь? завязывай, вредно это

>И что, там $$\frac{a^2+b^2}{(c+d)(c-d)}$$ запишется как (/ (+ (expt a 2) (expt b 2)) (* (+ c d) (- c d))) ?

ну возьми да и посмотри; от этого не умирают, правда - хотя с первого раза, говорят, кровь носом пойти может

jtootf ★★★★★
()
Ответ на: комментарий от Reset

Ступил, искался один и тот же элемент.

int
main (int argc, char ** argv)
{
        int i;
        int N = atoi (argv[1]);
        struct node *n;
        for (i = 0; i < N; i++)
        {
                if ( (n = malloc (sizeof (struct node) ) ) == NULL)
                        err (1, NULL);
                n->i = i;
                RB_INSERT (inttree, &head, n);
        }

        for (i = 0; i < N; i++)
        {
                n->i = i;
                struct node *w = RB_FIND (inttree, &head, n);
        }


        struct node *nxt;
        struct node *var;
        for (var = RB_MIN (inttree, &head); var != NULL; var = nxt)
        {
                nxt = RB_NEXT (inttree, &head, var);
                RB_REMOVE (inttree, &head, var);
                free (var);
        }
        return (0);
}
$ time -p ./tree 10000000
real 7.17
user 6.86
sys 0.32
Reset ★★★★★
()
Ответ на: комментарий от kemm

Знаешь, то что в дипломной работе можно ссылаться на источники "вцелом", не указывая конкретных глав и номеров страниц, еще не значит, что в реальной жизни люди обязаны следовать по таким вот обобщенным ссылкам.

Кстати, мы увидим элементы вычислительной алгебры на хаскелле, или все-таки осознал, что даже твоему фанатизму этого не осилить?

linuxfan
()
Ответ на: комментарий от Reset

>В частности если матрица задана неявным образом, то ничто не подходит, кроме самописных вещей.

охотно верю

jtootf ★★★★★
()
Ответ на: комментарий от linuxfan

> Знаешь, то что в дипломной работе можно ссылаться на источники "вцелом", не указывая конкретных глав и номеров страниц, еще не значит, что в реальной жизни люди обязаны следовать по таким вот обобщенным ссылкам.

Тяжёлый случай, я уже заметил. Прекращай жить в выдуманном мире. Была ссылка на секцию faq'а, там меньше десятка вопросов.

> Кстати, мы увидим элементы вычислительной алгебры на хаскелле, или все-таки осознал, что даже твоему фанатизму этого не осилить?

Ещё один с дислексией. Я кому-то обещал писать какой-нибудь код?

kemm
()
Ответ на: комментарий от jtootf

>тут тоже используется кодогенерация, правда на выходе не С, а опять же Haskell. так тебе проще будет это осилить?

Во-первых, в сортах монад я не разбираюсь, а хаскель вообще порицаю.

Во-вторых, "программа на языке X генерирует код н языке Y" означает, что имеется подготовленный программистом шаблон на языке Y, из которого путем нехитрых преобразований и добавления пользовательских данных, получается код на языке Y, являющийся результатом работы программы на языке X.

В двух словах: код не генерируется, производится трансформация исходного шаблона.

В-третьих, случай fftw и blas следует рассматривать как: "Если ограничиться лишь средствами самого языка, пришлось бы скатится к copy'n'paste, поэтому мы сделали клевый генератор вариантов алгоритма на все случаи жизни".

>компилятор я бы однозначно писал на Haskell

ФГМ (функциональщина головного мозга) излечима. Как правило, проходит при столкновении с шокирующей действительностью.

linuxfan
()
Ответ на: комментарий от Reset

так вот когда "матлабы" оказываются "не той системы" надо крепко подумать, а не студентов асемблерщиков калечить как тут предлагали

вот пример сегодня прочитал... надо было на ассемблере задачу переписать блин :(

On Sep 28, 2009, at 8:49 PM, David Winsemius wrote:

>

> On Sep 28, 2009, at 6:22 PM, Dmitry Gospodaryov wrote:

>

>> Does exist any tool in R to solve equations, especially complex exponential equations?

>> For example:

>> y = 100*exp(b*(1-exp(c*x))/c)


If you plot that function, you see that it is asymptotically zero in its positive domain:

> b=10; c=1

> plot(-10:10, 100*exp(b*(1-exp(c*(-10:10)))/c))

> 100*exp(b*(1-exp(c*(-10:10)))/c)

[1] 2.201647e+06 2.199930e+06 2.195270e+06 2.182652e+06 2.148720e+06 2.059123e+06
[7] 1.834007e+06 1.338820e+06 5.691034e+05 5.562432e+04 1.000000e+02 3.448235e-06
[13] 1.789295e-26 1.295885e-81 1.683418e-231 0.000000e+00 0.000000e+00 0.000000e+00
[19] 0.000000e+00 0.000000e+00 0.000000e+00

... So that raises the question of what you are really trying to accomplish.

>> If it is so, then what is the package i have to

>> use and what is algorythm for this solving?

>> Thank you for advance.

>> With regard, Dmitry.



--
David Winsemius, MD
Heritage Laboratories
West Hartford, CT

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

psv1967 ★★★★★
()
Ответ на: комментарий от jtootf

>всегда восхищался людьми, гордящимися собственным невежеством. как это у вас получается, а? я бы не смог

Конечно не смог бы. Пока все твое существо охваченно гордостью обладания функциональным инструментом, но через пару лет, когда вместо Haskell в моде будет CoolHaskell, ты возможно поймешь, что дело не в языке программирования, а в голове быдлокодера.

>к слову - я не пишу ни на Perl, ни на Python, ни на PHP

А не мешало бы для расширения кругозора.

linuxfan
()
Ответ на: комментарий от Reset

Так, прежде чем продолжим с деревьями: ты таки признаёшь, что по поводу stl versus queue.h ты был немного неправ?

Вот и ладненько. Продолжаем с деревьями:

$ time -p ./set0 10000000
real 20.67
user 20.29
sys 0.25

$ time -p ./tree0 10000000
real 12.85
user 12.42
sys 0.29

$ time -p ./set2 10000000
real 9.71
user 7.73
sys 0.24

$ time -p ./tree2 10000000
real 7.88
user 7.35
sys 0.26

где (set|tree)<n> — твой код, собранный с -O<n>.

kemm
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.