LINUX.ORG.RU

Метапрограммирование - проблемы и пути их решения.

 , ,


12

6

Пичал я тут на днях токенайзел для C++-кода, но всё это меня добило я решил поделится.

Проблема - мне надо было вычислять сложные значения для таблицы в компилтайме, да можно на сишке сделать через жопу(енумы) и макросы, но мне стало лень. Да можно сгинерить, но мне тоже лень.

Шблонную магию плюсов я не люблю, ибо она ущербна чуть более, чем полностью и тут я вспомнил, что оказывается в плюсах хотели ввести компилтайм функции, аля constexpr и подумалось мне - во, плюсы затащат и как всегда я в очередной раз убедился в ущербности плюсов и так и не понял логики тех, кто это запилил.

Чтобы не быть голословным пишем что-то типа

constexpr uint64_t f(uint64_t a, uint64_t b) {
  return a + b; 
}
Всё ок, но пишем что-то сложнее, аля:

uint64_t m[] = {0, 1, 2, 3, 4};
constexpr uint64_t f(uint64_t a, uint64_t b) {
  return m[a] + m[b]; 
}

Бида( или это моё неосиляторство плюсов?), дак зачем они запилили эту фичу, если она может лишь галимую примитивщину? Шаблоны ещё ущербней. В чем приемущество? Зачем?

А теперь у меня вопрос к вам, уважаемы батьки и отцы - что мне делать? Я хочу запонять массивы написав генератор, причем и в компилтайме тоже. Я хочу юзать libc, я хочу всё, а у меня нет ничего, почему?

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

У меня есть 3 пути: терпеть, пилить свой язык и конпелятор самому( что долго и нудно) и ваш совет.

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

Производная в точке А. Точка B - это значение в точке x+Delta x. Дальше Delta x устремляем к нулю, и опа!

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

Я понял, то вот википедии угол взят уже от устремлённой к нулю, а на твоей картинке нет?

Потом, как точно посчитать угол между митическим устремлением?

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

википедии угол взят уже от устремлённой к нулю, а на твоей картинке нет?

И в вики так же: http://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Derivative_of_a_func...

Потом, как точно посчитать угол между митическим устремлением?

Если ф-я задана аналитически есть правила дифференцирования. Если численно - точно никак, только приближенно в конечных разностях.

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

На твоей картинке устремление к нулю - это ц, и от него должен был браться угол, на вики это самая светлая полоска. Самая тёмная устремлённая, кторая на твоей картинки есть ц.

В этом и фейл моего моего понимания - я не могу посчитать - для меня это бессмысленно.

Т.е. производная это невыводимая числинными методами абстрактная штука? Которая типа показывает нам изгиб твоей функции после искомой точки.

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

Забейте пока на устремление. Что такое касательная же понятно? Производная это тангенс угла касательной. Вопрос, что она характеризует?

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

Почти правильно. Темп (скорость) роста/убывания функции в данной точке.

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

Все таки производная не угол а ТАНГЕНС угла. Это существенно. Таки в примере который я давал чему производная равна?

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

Это слишком сложно для меня - у меня никакое пространственное мышление и проекции - я даже предположить не могу. Ещё твой кривой график с прямоугольниками. Ну на глазок в районе 30градусов.

Я понимаю, что там тангенс - просто это уже детали. Это просто перевод, не относящийся к вычислениям.

tan(30*pi/180) =0.57735026919

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

Там масштабы по осям разные. Тангенс это отношение катетов треугольника. Треугольник построить могете?

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

Линейку приложите к экрану и постройте прямойгольный треугольник (в уме). ЧТо бы у него одна сторона скажем была единица.

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

Мерять надо не линейкой а глазами. Линейка только что бы касательную проще было провести. Линейки там на графике по осям уже есть. Пока ответ неправильный.

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

Ну я взял примертно отпопа нарисовал касательную до краёв - она где-то в районе однёрки не по иксу. И до предела провёл непоиксу от х1 до х2. Ну длинна у неё тоже 1. И поделил смотрящую вверх часть 90крадусного угла на его горизонтальну часть - получилось 0. Ну авосьт ам будет не 0, а почти 0. Ну в общем да за почти нулевое время она возростёт почти на ноль, что какбэ логично.

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

Так дело не пойдет. Я там же провел зелененьким касательную. Какой тангенс угла ее наклона?

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

Где? У меня только ваш первый крассный график и больше ничего. На котором я нарисовал свою жёлтенькую касательную стремящуюся к нулю.

Знаит я что-то упустил.

superhackkiller1997
() автор топика
Ответ на: комментарий от AIv

Ну у вас тоже самое, что и у меня. Судя по линейке ваш треугольник - это f;x = { O = 0;1, B = 1;2, A = 0;2 }; Т.е.

Тангенсом угла \alpha называется отношение \frac{AB}{OA} (отношение противолежащего катета к прилежащему).

Длинна АВ = 1, ОА = 1, а 1/1 = 0

superhackkiller1997
() автор топика
Ответ на: комментарий от AIv

А ну да, 1. Ну я уже давал результат 1 - вы его назвали не правильным, поэтому что-то да я зафейлил. Но заодно научусь делить.

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

Да, но 1 от Вас тогда как то невнятно прозвучало. Чудненько. А чему равняется производная в точке x=0.5?

Ну как, Вы еще ощущаете себя царем и «вот это вот все»?

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

И по той же ссылке лежит новый график. Опять производную в точке x=1, если Вас не затруднит.

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

Если я ничего не напутал, то 2

Чуть-чуть напутали.

А 0.5 похоже равен днищу.

Если Вы имели ввиду ноль, то да, это правильно. Но я бы очень попросил изъяснятся все таки по русски. Нет такого числа как «днище».

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

Чуть-чуть напутали.

А в чем конкретно? минус или ещё что-то? Как различаются производные нисходящих и восходящих графиков?

Если Вы имели ввиду ноль, то да, это правильно. Но я бы очень попросил изъяснятся все таки по русски. Нет такого числа как «днище».

Сленг царей - ничего не поделаешь, но я пытаюсь говорить на языке смертных. Да, ноль.

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

я пытаюсь говорить на языке смертных.

Думаю, что весь ЛОР гордится Вашими царскими усилиями!

Как различаются производные нисходящих и восходящих графиков?

Да, минусом. Delta f же отрицательный для нисходящего графика.

Ок. Допустим, f измеряется в попугаях, а х в зубочистках. В каких единицах измеряется производная?

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

просто в числах (бeзразмерная величина) было бы если бы и f и x было в попугаях. А так да, в попугаях на зубочистку.

Для дифференицрования (расчета производных) существуют простые правила, они приведены в википедии. Например что d sin(x)/d x = cos(x)

Допустим мы знаем зависимоть координаты от времени x(t). Скорость по определению v(t)=d x/d t (темп изменения координаты), ускорение a(t) = d v/d t = d^2 x / d t^2 (темп изменения скорости, или вторая производная от коррдинаты по времени). Найдите v(t) и a(t), если x(t)=10-t*t/2.

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

Скорость чего? Скорость( в точке наверное) - это (x(t + 1) - x(t -1)), мы получим кол-во попугаев между точками за 1t.

Ускорение - это насколько ускорилась точка по вравниню с предидущей точкой. Находит по вышеуказанной штукенции скорость 2-х точек и делим 2-ю на первую. Получаем укорение в разах.

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

скорость самой точки. Вот у нас есть гайка в каком то девайсе, которая движется по прямой. Координата гайки х. Не надо фантазировать, прочитайте в вики правила дифференцирования.

И пора привыкнуть что бывают числа по модулю меньше единицы;-)

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

скорость самой точки. Вот у нас есть гайка в каком то девайсе, которая движется по прямой. Координата гайки х. Не надо фантазировать, прочитайте в вики правила дифференцирования.

Мы не можем знать скорость по одной точке, ибо скорость - это время между 2-мя точками.

И пора привыкнуть что бывают числа по модулю меньше единицы;-)

Это не имеет смысла. Еденица - минимальное кол-во времени в нашем случае, юзать что-то меньше единицы дебилизм - используй другие попугаи. Хочешь почней - юзай милисекунды, ещё такочне микро, нано и т.п.

Что конкретно я говорю не так?

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

Мы не можем знать скорость по одной точке, ибо скорость - это время между 2-мя точками.

Слово «точка» имеет много значений. Точка как знак препинания. ТОчка на графике. ТОчка в отношениях. Точка принятия решения. В данном случае точка (материальная!!!) - это гайка в каком то устройстве. Точка движется. У точки есть координата зависящая от времени, следовательно есть скорость и ускорение.

Еденица - минимальное кол-во времени в нашем случае

Нет.

юзать что-то меньше единицы дебилизм

Опять царство в попе заиграло?;-) И как же Вы будете единицу устремлять к нулю при расчете производной по определению? Поверьте, что уменьшать попугаев гораздо более трудоемкая операция, чем уменьшать Delta x.

Что конкретно я говорю не так?

Предложенный Вами вариант вычисления скорости как мин требует деления на 2 (интервал времени в Вашей формуле 2 а не 1). Так делают, когда ф-я задана численно, а у нас ф-я аналитическая. Дифференцировать аналитическую функцию численно, да еще столь тривиальную - это даже не дебилизм, это верх кретинизма, даже для царя. Пока Вы не научитесь аналитически дифференцировать такие функции мы дальше не пойдем.

Что касается вычисления ускорения, то Вы пока еще не поняли до конца что есть производная. Нам не нужно изменение скорости «в разах», с ним крайне неудобно работать. Нам нужно изменение скорости отнесенное к единице времени.

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

AIv ★★★★★
()
Последнее исправление: AIv (всего исправлений: 1)
Ответ на: комментарий от PolarFox

Я пока не решил. Вчера так поциент был вообще лапочка, а сегодня видать обострение.

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

Слово «точка» имеет много значений. Точка как знак препинания. ТОчка на графике. ТОчка в отношениях. Точка принятия решения. В данном случае точка (материальная!!!) - это гайка в каком то устройстве. Точка движется. У точки есть координата зависящая от времени, следовательно есть скорость и ускорение.

Даже материальная точка не может иметь скорость. Если это устойчивая гайка, то она будет иметь ту же скорость и ускорение. Если тебе надо знать положение в пространстве твоей гайки - это делает оффсетами.

Опять царство в попе заиграло?;-) И как же Вы будете единицу устремлять к нулю при расчете производной по определению? Поверьте, что уменьшать попугаев гораздо более трудоемкая операция, чем уменьшать Delta x.

Устремление - это попытка сделать граффик таким, каким бы он был если рос равномерно с той же скорость, с которой он подрос в этой точке. Это графический кастыль относительно граффика.

Естественно друдоёмка, но суть не в трудоёмкости, а в красивости. Принятие за еденицу измерения какую-то трудновычислимую штуку - это практекуется даже в детсаде.

Предложенный Вами вариант вычисления скорости как мин требует деления на 2 (интервал времени в Вашей формуле 2 а не 1). Так делают, когда ф-я задана численно, а у нас ф-я аналитическая. Дифференцировать аналитическую функцию численно, да еще столь тривиальную - это даже не дебилизм, это верх кретинизма, даже для царя. Пока Вы не научитесь аналитически дифференцировать такие функции мы дальше не пойдем.

Ну тут есть мой фейл, ибо я не знал относительно какой точки считать и не заметил как написал от обоих.

Ну хорошо, я отстронюсь от реального мира и буду как вчера считать абстракции - я не против. Меня попросили посчитать - я посчитал.

Хорошо, царь будет качать абстрактную аналитику.

Что касается вычисления ускорения, то Вы пока еще не поняли до конца что есть производная. Нам не нужно изменение скорости «в разах», с ним крайне неудобно работать. Нам нужно изменение скорости отнесенное к единице времени.

Постораюсь понять.

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

Я не спорю, просто на мои абсалютно верные вычесления сказали, что они не верны. Если бы вы не начали говорить «ты не прав», а сказали бы «мы считаем абстрактно, как вчера», «так неудобно работать» и т.п. - я бы не стал спорить.

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

про материальную точку не могущую иметь скорость это в квотезы!!!!111111

Дорогой царь, я Вам настоятельно рекомендую книги Я.Перельман «Занимательная физика» и «Словарь юного физика» (авторов не помню, но он вроде один такой). ЕМНИП была еще занимательная математика.

Насчет красивости вычисления в целых числах - это даллеко не всегда так. Впрочем, Ваше неприятие дробных чисел видимо связано с тем что Вы не умеете с ними работать (или были проблемы с их освоением)?

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

Не-не, у нас тут сериал «приемный покой (ускоренная помощь)». Я за этого... как его... актер омериканский... ну короче за доктора. А ТС за поциента, который вползает в кабинет и прикидывается одмином, тянущим витую пару, но вечно палится из за крокодильчиков.

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

про материальную точку не могущую иметь скорость это в квотезы!!!!111111

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

Дорогой царь, я Вам настоятельно рекомендую книги Я.Перельман «Занимательная физика» и «Словарь юного физика» (авторов не помню, но он вроде один такой). ЕМНИП была еще занимательная математика.

Они иногда интересные, но в основном слишком скучные.

Насчет красивости вычисления в целых числах - это даллеко не всегда так. Впрочем, Ваше неприятие дробных чисел видимо связано с тем что Вы не умеете с ними работать (или были проблемы с их освоением)?

Не всегда, но в 90+% так.

А что с ними работать? Осилил пару кастылей необходимых для их вреняемой работы - это не проблема. Проблема в том, что нужны эти кастыли, а твой флоат в 97%+ случаев не нужен.

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

Вобщем моя идеология такова - не видишь профитов - не юзай. Профиты стоят слишком дорого( в предсказуемости, простоте, красивости) - не юзай. Можно сделать ещё проще? - делай и забей на остальное.

superhackkiller1997
() автор топика
Ответ на: комментарий от bk_

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

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

Ну и тут аказалось, что я не понимаю их матабстракций и не могу с них добиться внятного объяснения того, что они хотят сделать.

Потом пошло обвинение меня в том, что я не осилил абстрактный матаппарат и я лох.

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

Ну вот вчера мы начали что-то изучать, изучаем и сейчас.

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

Там Выше по треду, есть вопрос от анонимуса как будет выглядеть в интах 1e-30*1e+30, на который Вы так и не ответили.

Касательно флотов - я могу только повторить в 100501й раз, что Вы неправы. Можно Вашу неправоту разбирать подробно, но уж очень лень - Вы просто не имеете никакого представления (тред это очень четко показывает, ЛОР мне свидетель), о том как и где флоты используются.

А что с ними работать? Осилил пару кастылей необходимых для их вреняемой работы - это не проблема.

Ну когда Вы так говорите, значит Вы их не асилили.

Дорогой царь, хочу отметить, что когда Вы не дуете щек, с Вами можно почти нормально общаться. Когда Вы понимаете свою ограниченность (а не кричите что дескать это все просто и можно асилить за 15 минут) - Вы двигаетесь вперед. Для третьеклассника Вы неплохо таки поняли что есть производная (правда Ваши сверстники этот вопрос изучили куда глубже, а некоторые из них еще и программируют гораздо лучше Вас, и это не наезд а сухая констатация факта, я знаю таких людей). Но «дорогу осилит идущий» - хотелось бы, что бы Вы шли, а не сидели на воображаемом троне. Мы все когда то чему то учились, нормальный человек учится всю жизнь - это очень увлекательный процесс.

Я Вам обещал объяснение что есть теплопроводность. Вы еще не ответили на все мои вопросы, но просто у меня уже нет времени на столь увлекательную беседу с Вами.

Все тела состоят из атомов. Атомы не находятся в покое, а совершают хаотические движения, интенсивность этих движений пропорциональна температуре. При температуре -273 градуса по Цельсию все замирает (это т.н. абсолютный ноль, не бывает температуры меньше, абс. ноль недостижим). Чем температура выше, тем активнее атомы совершают хаотические движения (в кристалле - около положений равновесия), за счет этого при повышении температуры большинство тел расширяется. Количество теплоты это и есть энергия, связанная с хаотическими колебаниями атомов.

Рассмотрим два тонких диска (скажем диск 1 и диск 2) с разными температурами, прижатые друг к другу. Атомы диска 1 хаотично дергаются, и передают энергию диску 2. Но существует и обратный процесс - атомы диска 2 дергаются, и передают энергию атомам диска 1. Если температуры дисков одинаковы, то количество тепла передающее от диска 1 к диску 2 равняется количеству тепла передающегося от диска 2 к диску 1, система находится в положении равновесия, и тепловой поток через границу между дисками равен нулю. Иначе, тепловой поток (разница между количеством теплоты которое диск 1 отдал диску 2 и количеством теплоты которое диск 2 отдал диску 1) в единицу времени равен (T2-T1)*alpha, где alpha какой то коэффициент зависящий от материалов диска, площади поверхности раздела дисков, качества поверхности раздела и др. Рассмотрим стопку тонких дисков, имеющих разную температуру.

Рассмотрим теперь стопку дисков, имеющих разную температуру. Для понимания нам достаточно будет рассмотреть один диск (скажем диск 2) и двух его соседей (диск 1 и диск 3). В единицу времени у нас происходит одновременно обмен теплом между дисками 1->2 и между дисками 2->3 (Вы не можете выключить теплообмен между какой то парой дисков, диск 3 ничего не знает о диске 1 и наоборот). При этом в диск 2 тепловой поток 1->2 принесет тепло из диска 1, и из диска 2 тепловой поток 2->3 унесет тепло в диск 3. Ну а изменение количества тепла в диске 2 в единицу времени будет равно разнице между этими потоками. Результат Вы можете получить сами, только не запутайтесь со знаками.

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

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

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

Я отчаялся. Вы не безнадежны, но такое обучение слишком неэффективно (хотя ЛОР в восторге). «Учить имеет смысл только тех кто сам хочет учится, но они и сами могут все выучить»(c).

Я, как мог, показал дорогу... идти по ней, или нет - это уже Ваш выбор и Ваша жизнь.

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