Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 153, средняя оценка - 4.83
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
#1

Что такое compile-time алгоритмы и для чего они нужны? - C++

28.12.2011, 14:54. Просмотров 18696. Ответов 45
Метки нет (Все метки)

Цитата Сообщение от niXman Посмотреть сообщение
compile-time алгоритмы
А есть от них хоть какая-то практическая польза? По-моему нет
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
28.12.2011, 17:12  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #21
ForEveR, списибо за такой пример. Далее взял я этот пример и через него как бы начал вычислять корень из отрицательного значения. Компилятор ушёл в глубокий штопор, но через минуту из него всё-таки вылез и посчитал, естественным образом, неправильное значение. Ну конкретно в данном случае в конечном итоге можно понять, что неправильное значение было у переменной s и гляда на исходник понять, что мы пытаемся вычислить корень из отрицательного значения. Но вот теперь ели какой-то умник вместо пары чисел, определяющих константу -2.0 подставить ещё какую-нибудь хрень, порождённую другим шаблоном, то много ли шансов найти ошибку в этой программе, особенно если искать будет человек, который эту программу видит впервые в жизни? Стоит ли этот гемор сэкономленных трёх сотых секунд времени по сравнению с:

C
1
const double s = sqrt(2.0);
не говоря уж о том, что вычисление корня от константного значения в общем-то редкое дело
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 17:20     Что такое compile-time алгоритмы и для чего они нужны? #22
Цитата Сообщение от Evg Посмотреть сообщение
неправильное значение было у переменной s и гляда на исходник понять, что мы пытаемся вычислить корень из отрицательного значения
для этого нужно добавить компайл-тайм ассерт.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
А они compile-time?
конечно. в boost.mpl все компайл-тайм.
Цитата Сообщение от Evg Посмотреть сообщение
На у тогда зачем делать сложным то, что можно сделать простым.
не понимаешь ты меня.
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
28.12.2011, 17:31  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #23
Цитата Сообщение от niXman Посмотреть сообщение
для этого нужно добавить компайл-тайм ассерт
Да вопрос не в том, как нужно было писать, а в том, как потом с этим другим людям работать. Это находится на том же уровне, что и отладка. Которая в случае нормального написания программы была бы понятной. Далее, можно этим алгоритмом вычислить корень из 1.000006 и увидеть, что результат отличается от того, что положено по стандарту. Какой компайл-тайм ассерт в данном случае спас бы нас? Ты тут даже в отладчике пощёлкать не сможешь, чтобы ход процесса посмотреть

Добавлено через 2 минуты
Цитата Сообщение от niXman Посмотреть сообщение
не понимаешь ты меня
Скорее всего. Только при программировании я всегда руководствуюсь тем, что самым первым критерием должна быть понятность кода, и только потом производительность. Т.е. непонятный код, работающий на 3% быстрее понятного кода, я почти всегда отмету. За исключением тех редких случаев, когда это действительно обосновано
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 17:34     Что такое compile-time алгоритмы и для чего они нужны? #24
Цитата Сообщение от Evg Посмотреть сообщение
как потом с этим другим людям работать.
это субъективно.
мне вполне понятен код.

Цитата Сообщение от Evg Посмотреть сообщение
Какой компайл-тайм ассерт в данном случае спас бы нас?
стандартный. ибо версии начиная 4.6.0 содержат ВМ для вычисления значений с плавающей точкой.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
первым критерием должна быть понятность кода
это тоже субъективно. приведенный выше код вполне понятен. а если ему уделить несколько минут, то вообще ни одного неясного момента не останется.
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
28.12.2011, 17:35  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #25
Цитата Сообщение от niXman Посмотреть сообщение
стандартный
Ты не словами говори, а скажи в каком месте хода какой ассерт воткнуть (что конеретно должно быть больше или меньше чего конкретно). Т.е. посмотри на это дело с позиции человека, которому дали найти ошибку в существующем коде.

Добавлено через 1 минуту
Цитата Сообщение от niXman Посмотреть сообщение
а если ему уделить несколько минут
Можно написать так, что понятно будет с первого взгляда, а можнонаписать так - что после уделения нескольких минут. Зато compile-time, который к тому же ещё и неправильно работает
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 17:40     Что такое compile-time алгоритмы и для чего они нужны? #26
Цитата Сообщение от Evg Посмотреть сообщение
Далее, можно этим алгоритмом вычислить корень из 1.000006 и увидеть, что результат отличается от того, что положено по стандарту.
это вопрос?
вот что считает это код из 1.000006: 1.000002999991

Добавлено через 3 минуты
Цитата Сообщение от Evg Посмотреть сообщение
compile-time, который к тому же ещё и неправильно работает
что неправильно? у тебя какой результат выдает? какая версия компилятора?

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
скажи в каком месте хода какой ассерт воткнуть
http://liveworkspace.org/code/259504...ddd517811f80b4
шестая строка.
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
28.12.2011, 17:40  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #27
Цитата Сообщение от niXman Посмотреть сообщение
это вопрос?
вот что считает это код из 1.000006: 1.000002999991
Это утверждение. Теперь вычисли корень через библиотечный sqrt (который заведомо по стандарту работает). Можно увеличить precision при печати для наглядности. Ну и вот сколько времени понадобилось бы мозахисту на отладку, если бы он напоролся на такую ситуацию? Ладно это коротенький пример, когда просто вычисляется корень, а то ведь большая задача. И ведь самое-то дебильное, в случае реализации в виде нормальной функции можно было бы печати в неё поставить (печать входного и выходного значения), а в случае с шаблоном и этого сделать нельзя.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 17:43     Что такое compile-time алгоритмы и для чего они нужны? #28
Цитата Сообщение от Evg Посмотреть сообщение
Можно написать так, что понятно будет с первого взгляда, а можнонаписать так - что после уделения нескольких минут.
опять ты говоришь про себя.
С/С++ вообще не интуитивно понятные ЯП. и кому-то даже Си реализация покажется не понятной. и что из этого? сложная/непонятная реализация?
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
28.12.2011, 17:43  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #29
Цитата Сообщение от niXman Посмотреть сообщение
шестая строка.
Я говорю не про случай корня из отрицательного значения (благо, не настолько тупой, чтобы не понять этого), а про случай, когда корень из 1.000006 вычисляется неправильно
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 17:44     Что такое compile-time алгоритмы и для чего они нужны? #30
Цитата Сообщение от Evg Посмотреть сообщение
в случае реализации в виде нормальной функции можно было бы печати в неё поставить (печать входного и выходного значения), а в случае с шаблоном и этого сделать нельзя.
юнит тестирование наше всё!
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
28.12.2011, 17:45  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #31
Цитата Сообщение от niXman Посмотреть сообщение
и что из этого? сложная/непонятная реализация?
Ты считаешь это поводом к тому, что нужно усложнять понимание и без того плохо понимаемого исходника, чтобы ускорить программу на 6 сотых секунды?
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 21:32     Что такое compile-time алгоритмы и для чего они нужны? #32
Evg, скажи, ты случаем не знаешь где раздобыть стандарт и реализации математических функции? а то я даже не знаю как оно зовется, по этому наверняка и ничего найти не могу..
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
28.12.2011, 23:01  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #33
Реализации можно посмотреть в glibc. Стандарт - скорее всего оно около ieee-754 где-то, но если завтра напомнишь - уточню.

Не по теме:

Спорить мы начали по теме "compile-time алгоритмы", а не "mpl-алгоритмы", как оно сейчас озаглавлено

niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.12.2011, 23:38     Что такое compile-time алгоритмы и для чего они нужны? #34
Сообщение было отмечено автором темы, экспертом или модератором как ответ
кстати, вот и компайл-тайм реализация sqrt() без единого шаблона
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cmath>
 
constexpr double my_sqrt_impl(double lower, double upper, double v, bool d) {
   return
   upper-lower>0.0000000000001
      ? ((lower+upper)/2)*((lower+upper)/2)>v
         ? my_sqrt_impl(lower, (lower+upper)/2, v, d)
         : my_sqrt_impl((lower+upper)/2, upper, v, d)
      : d?lower:upper
   ;
}
 
constexpr double my_sqrt(double v) {
   return (my_sqrt_impl(v<1?v:1, v<1?1:v, v, true)+my_sqrt_impl(v<1?v:1, v<1?1:v, v, false))/2;
}
 
int main() {
   constexpr double v = 1.00006;
 
   std::cout << "standard implementation: " << sqrt(v) << std::endl;
   std::cout << "my own   implementation: " << my_sqrt(v) << std::endl;
 
   char array[int(my_sqrt(v))]; // check if my_sqrt(v) is constant expression
   std::cout << sizeof(array) << std::endl;
}
http://liveworkspace.org/code/1949cd...135dc93086cf4d

Evg, стандартной соответствует? выполняется в компайл-тайм?
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
29.12.2011, 11:37  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #35
Та же самая беда. Воткни в начало main "std::cout.precision(40);" и увидишь, что результат отличается от стандартного. А для отрицательного значения считает неправильно (стандартная реализация возвращает nan)
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
29.12.2011, 11:37  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #36
Цитата Сообщение от niXman Посмотреть сообщение
Evg, стандартной соответствует?
В соседней теме отписал те же самые два косяка. Плюс то же самое очевидное отсутсвие практической пользы
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
29.12.2011, 11:48     Что такое compile-time алгоритмы и для чего они нужны? #37
Цитата Сообщение от Evg Посмотреть сообщение
результат отличается от стандартного
для подавляющего большинства задач это не имеет никакого значения. (я и вправду не проверял до такой точности)

Цитата Сообщение от Evg Посмотреть сообщение
для отрицательного значения считает неправильно
это уже придирки. добавь проверку и возвращай nan.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
29.12.2011, 11:48     Что такое compile-time алгоритмы и для чего они нужны? #38
Цитата Сообщение от Evg Посмотреть сообщение
отсутсвие практической пользы
предыдущие четыре страницы мы не с тобой общались?
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
29.12.2011, 11:59  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #39
Цитата Сообщение от niXman Посмотреть сообщение
предыдущие четыре страницы мы не с тобой общались?
ТОгда приведи пример, где вычисление корня от константы на этапе компиляции даст какое-то реальное преимущество. Не выигрыш в одну сотую секунду, а реально ощутимый выигрыш в производительности, который бы реально оправдал те геморозатраты, которые на это потребуются
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2011, 12:03     Что такое compile-time алгоритмы и для чего они нужны?
Еще ссылки по теме:
C++ Что такое h -файл и obj-файл?Зачем они нужны?
Перечисления (enum): для чего они нужны? Как, когда и какими перечислениями уместнее пользоваться? C++
C++ Compile-time и run-time методы и функции
Что такое static const и для чего он нужен? C++
Что такое полис и конечные автоматы и для чего используются в с++? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 26
29.12.2011, 12:03  [ТС]     Что такое compile-time алгоритмы и для чего они нужны? #40
Цитата Сообщение от niXman Посмотреть сообщение
для подавляющего большинства задач это не имеет никакого значения
Для этого же подавляющего значение точно так не имеет никакого значения, что будет что-то вычисляться в compile-time вместо run-time.

Цитата Сообщение от niXman Посмотреть сообщение
это уже придирки. добавь проверку и возвращай nan
Нет, это не придирки. Это кроткий пример, вкотором изначально известно, где была допущена ошибка. В общем случае это может вылиться в кучу потерянного времени. И ладно это более простая реализация из-за того, что поддерживается конструкция constexpr. Однако весь мир (особенно крупные компании) не так спешит за прогрессом и переходом но новые версии компилятора, новые стандарты и т.п. В итоге я опять не вижу никакого оправдания разведению геморроя на ровном месте

Перенеси последние посты в соседнюю тему, потому что опять всё свелось к тому же самому
Yandex
Объявления
29.12.2011, 12:03     Что такое compile-time алгоритмы и для чего они нужны?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru